Previously, tying anything to scroll meant listening to the scroll event and updating styles in requestAnimationFrame. animation-timeline replaces the animation's progress source — instead of time, it's driven by scroll offset. The @keyframes stay the same; only what drives the playhead changes.
A reading-progress bar becomes a few lines of CSS. With a view() timeline, an element's animation progress is instead driven by how far it has crossed the viewport — the native version of scroll-reveal.
As of 2026, Chrome/Edge support it, but Safari/Firefox coverage is still partial, so production code usually keeps a JS fallback alongside it.
When to use
Use it where you control the target browsers, for lightweight progress bars and scroll-linked effects. If you need broad support, keep a JS scroll-listener fallback.