"Scrubbing" comes from video editing — dragging a timeline scrubber back and forth by hand. Scroll scrub turns that scrubber into the scrollbar itself: you compute (scrollTop / max scroll) as a 0–1 progress value on every scroll event (or rAF), and feed that value straight into a rotation, a stroke-dashoffset, or several tracks at once.
The key difference from a trigger-based effect (like scroll-reveal, which fires once when an element enters the viewport) is that scrub doesn't ask "has this played yet?" — the progress value itself is enslaved to scroll position. Move the scroll 5px and the animation moves exactly that much, in either direction. GSAP's ScrollTrigger popularized this with its scrub: true option; the native CSS equivalent is animation-timeline: scroll().
Combined with momentum scrolling (the inertial drift after you lift your finger on mobile), a scrubbed animation glides to a stop instead of snapping — which reads nicely. But scroll fires very often, so anything expensive tied to it will drop frames; stick to properties the GPU can composite, like transform and opacity.
When to use
Use it when scroll position itself represents progress through content — step-by-step explainers, a chart filling in. If you only need an entrance, scroll reveal is enough.