8 min read
0%

Scroll-Driven Animations

Back to Blog Interop 2026
Scroll-Driven Animations

Scroll-Driven Animations

Scroll-driven animations work because the browser owns the timeline. Instead of listening to scroll and translating pixels into animation state yourself, you bind animation progress directly to scroll or visibility and let the engine do the bookkeeping.

@keyframes fill {
  from { transform: scaleX(0); }
  to { transform: scaleX(1); }
}

.progress-bar {
  transform-origin: 0 50%;
  animation: fill linear both;
  animation-timeline: scroll(root block);
}

Pick the Right Timeline

Use scroll() when animation progress should match the scroller itself, like a reading progress bar. Use view() when animation progress should follow a specific element entering or leaving the viewport. That split keeps intent obvious.

Stay on Compositor-Friendly Properties

Animate transform, opacity, filter, or careful clip-path changes. Scroll-driven timelines do not magically rescue layout-thrashing properties. If the property triggers layout every frame, the animation still costs you.

Fallbacks Are Still Straightforward

Use @supports (animation-timeline: view()) to upgrade and keep a static or IntersectionObserver-powered version for older browsers. The progressive enhancement story is good precisely because the browser-managed path does not require a different component structure.

Interop 2026 Focus

The current work is about smoothing behavior across engines so teams can ship scroll-linked motion without caveats scattered through every demo. That is the difference between a neat feature and a design-system primitive.


Browser support snapshot

Live support matrix for wf-scroll-driven-animations from Can I Use.

Show static fallback image Data on support for wf-scroll-driven-animations across major browsers from caniuse.com

Source: caniuse.com

Canvas is not supported in your browser