<SplitText> splits text, triggers callbacks, and cleans up is essential for proper animation timing.
Component Lifecycle
The<SplitText> component follows this lifecycle:
Font Loading
Default Behavior (waitForFonts=true)
By default,<SplitText> waits for document.fonts.ready before splitting to prevent layout shifts:
- Wrapper element has
visibility: hidden - Text is invisible but occupies space (no layout shift)
- After split completes, wrapper becomes
visibility: visible
Immediate Splitting (waitForFonts=false)
Disable font waiting for immediate splits:Callback Timing
onSplit
Called once after initial split completes:- If viewport callbacks are used,
onSplitstill fires immediately - If component unmounts before fonts load
onResplit
Called whenautoSplit triggers a full re-split (not on initial split):
onResplit receives new element references. Old elements are removed from DOM.
onViewportEnter
Called when element enters viewport based onviewport options:
- Component mounts and splits text
- IntersectionObserver is created
- If element is already in view, callback triggers immediately
- Otherwise, triggers when scrolling into view
once: true: Callback only fires once, then observer disconnects.
onViewportLeave
Called when element leaves viewport:viewport.once is true (observer disconnects after first enter).
Viewport Observer
The viewport observer is created if any of these are present:viewportproponViewportEntercallbackonViewportLeavecallbackresetOnViewportLeaveistrue
Intersection Timing
Root Margin Example
Reset on Viewport Leave
UseresetOnViewportLeave to re-apply initial styles when scrolling away:
- Element leaves viewport → Initial styles re-applied
- Element enters viewport →
onViewportEnterfires - Animation plays from initial state again
Auto-Resplit on Resize
WhenautoSplit={true}, the component monitors window resize:
- Window resizes
- Debounce timer waits (
resplitDebounceMs, default 100ms) - Original HTML is restored
- Text is split again with new layout
- Kerning compensation applied
- Initial styles/classes applied
onResplitcallback fired
Cleanup & Unmounting
When component unmounts orrevert() is called:
onRevertcallback fires (if provided)- IntersectionObserver disconnects
- Resize observer disconnects (if
autoSplit) - Split HTML is reverted to original
- Component unmounts
- Component unmount
- Manual
revert()call - Animation completion (if
revertOnComplete={true})
Revert on Complete
Automatically revert after animation finishes:revertOnComplete={true}- Callback must return animation or promise
- Works with both
onSplitandonViewportEnter
- DOM is restored to original HTML
- Split spans are removed
- Observers are disconnected
onRevertcallback fires
React StrictMode
The component handles React StrictMode double-mounting correctly:- First mount → Split → Unmount (cleanup)
- Second mount → Split again (fresh state)