coderef

Scroll-driven animationsLimited availability

The animation-timeline, scroll-timeline, and view-timeline CSS properties advance animations based on the user's scroll position.

Not yet supported in all major browsers — check the table and provide a fallback.

Browser support

DesktopChrome
1–114Not supported
115+Supportedsince Jul 18, 2023
Current: 155
Edge
12–114Not supported
115+Supportedsince Jul 21, 2023
Current: 154
Firefox
✕Not supportedup to 157
Current: 157
Safari
1–18.6Not supported
26+Supportedsince Sep 15, 2025
Current: 27
MobileChrome Android
18–114Not supported
115+Supportedsince Jul 21, 2023
Current: 155
Firefox Android
✕Not supportedup to 157
Current: 157
Safari iOS
1–18.6Not supported
26+Supportedsince Sep 15, 2025
Current: 27

How to use

Not supported in Firefox, Firefox Android. Use feature detection below and provide a fallback (or a polyfill) for those browsers.

Example

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

/* Reading progress bar driven by page scroll */
.progress {
  transform-origin: left;
  animation: grow linear;
  animation-timeline: scroll(root);
}

Feature detection

CSS · check before using
@supports (animation-timeline: scroll) {
  /* styles that rely on animation-timeline: scroll */
}

/* or in JavaScript */
if (CSS.supports("animation-timeline", "scroll")) {
  // use it
}

Sub-features

Support for each part of the feature (37). The overall table above shows when the whole feature works.

Sub-featureChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidSafari iOS
ScrollTimeline115115✕26115✕26
ScrollTimeline.ScrollTimeline115115✕26115✕26
ScrollTimeline.axis115115✕26115✕26
ScrollTimeline.source115115✕26115✕26
ViewTimeline115115✕26115✕26
ViewTimeline.ViewTimeline115115✕26115✕26
ViewTimeline.endOffset115115✕26115✕26
ViewTimeline.startOffset115115✕26115✕26
ViewTimeline.subject115115✕26115✕26
animation-range115115✕26115✕26
animation-range-end115115✕26115✕26
animation-range-end.normal115115✕26115✕26
animation-range-start115115✕26115✕26
animation-range-start.normal115115✕26115✕26
animation-timeline115115✕26115✕26
animation-timeline.scroll115115✕26115✕26
animation-timeline.view115115✕26115✕26
animation.animation-timeline_included✕✕✕✕✕✕✕
scroll-timeline115115✕26115✕26
scroll-timeline-axis115115✕26115✕26
Show 17 more
Sub-featureChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidSafari iOS
scroll-timeline-axis.block115115✕26115✕26
scroll-timeline-axis.inline115115✕26115✕26
scroll-timeline-axis.x115115✕26115✕26
scroll-timeline-axis.y115115✕26115✕26
scroll-timeline-name115115✕26115✕26
timeline-scope116116✕26116✕26
timeline-scope.all✕✕✕26✕✕26
timeline-scope.none116116✕26116✕26
view-timeline115115✕26115✕26
view-timeline-axis115115✕26115✕26
view-timeline-axis.block115115✕26115✕26
view-timeline-axis.inline115115✕26115✕26
view-timeline-axis.x115115✕26115✕26
view-timeline-axis.y115115✕26115✕26
view-timeline-inset115115✕26115✕26
view-timeline-inset.auto115115✕26115✕26
view-timeline-name115115✕26115✕26