Scroll-driven animations
Animaciones que avanzan con el scroll, sin escuchar eventos y fuera del hilo principal.
animation-timeline: scroll() ata una animación al desplazamiento de un contenedor, y view() al paso de un elemento por la pantalla; animation-range acota el tramo. Son animaciones CSS normales: las mueve el compositor y no bloquean la página.
Están en Chrome desde la 115 y en Safari desde la 26. Firefox las tiene activadas solo en Nightly, y Mozilla ha anunciado que planea activarlas en octubre o a principios de noviembre de 2026. Forman parte de Interop 2026.
Para qué sirve
- Barras de progreso de lectura
- Elementos que aparecen al entrar en pantalla
- Parallax y cabeceras que se encogen
Demo
Desplázate dentro del recuadro. La barra, el porcentaje, la cabecera y las tarjetas se animan con el scroll; no hay ni una línea de JavaScript.
Ocho partes de un edificio, una tras otra.
- 01Cimientos
- 02Pilares
- 03Forjados
- 04Fachadas
- 05Cubierta
- 06Torres
- 07Veletas
- 08Foso
Fin del recorrido.
Compatibilidad
Disponibilidad limitada| Función | Escritorio | Móvil | |||||
|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Safari | Chrome Android | Firefox Android | Safari iOS | |
| animation-timeline (scroll(), view()) | 115Chrome: 115 | 115Edge: 115 | ✓previewFirefox: preview | 26Safari: 26 | 115Chrome: 115 | —Firefox: No | 26Safari: 26 |
| animation-range | 115Chrome: 115 | 115Edge: 115 | ✓previewFirefox: preview | 26Safari: 26 | 115Chrome: 115 | —Firefox: No | 26Safari: 26 |
Compatibilidad generada en cada publicación desde MDN browser-compat-data 8.1.3 (24 sep 2026) · web-features 3.40.0 · revisión manual: 1 oct 2026
Código mínimo
<!doctype html>
<meta charset="utf-8">
<title>Scroll-driven animations · ejemplo mínimo</title>
<style>
body { font: 18px/1.6 system-ui; max-width: 40rem; margin: auto; padding: 2rem; }
section { margin: 60vh 0; padding: 2rem; background: #eee; }
#progress { position: fixed; inset: 0 0 auto; height: 4px; background: #c0643a; transform-origin: left; }
@keyframes grow { from { scale: 0 1; } }
@keyframes reveal { from { opacity: 0; translate: 0 2rem; } }
/* Solo si el navegador lo soporta y la persona no ha pedido menos movimiento */
@media (prefers-reduced-motion: no-preference) {
@supports (animation-timeline: view()) {
/* La barra avanza con el scroll de la página */
#progress { animation: grow linear both; animation-timeline: scroll(root block); }
/* Cada sección aparece al entrar en pantalla (el shorthand va antes que el timeline) */
section { animation: reveal linear both; animation-timeline: view(); animation-range: entry 0% cover 40%; }
}
}
</style>
<div id="progress"></div>
<h1>Desplázate hacia abajo</h1>
<section>Uno</section>
<section>Dos</section>
<section>Tres</section><!doctype html>
<meta charset="utf-8">
<title>Scroll-driven animations · ejemplo mínimo</title>
<style>
body { font: 18px/1.6 system-ui; max-width: 40rem; margin: auto; padding: 2rem; }
section { margin: 60vh 0; padding: 2rem; background: #eee; }
#progress { position: fixed; inset: 0 0 auto; height: 4px; background: #c0643a; transform-origin: left; }
@keyframes grow { from { scale: 0 1; } }
@keyframes reveal { from { opacity: 0; translate: 0 2rem; } }
/* Solo si el navegador lo soporta y la persona no ha pedido menos movimiento */
@media (prefers-reduced-motion: no-preference) {
@supports (animation-timeline: view()) {
/* La barra avanza con el scroll de la página */
#progress { animation: grow linear both; animation-timeline: scroll(root block); }
/* Cada sección aparece al entrar en pantalla (el shorthand va antes que el timeline) */
section { animation: reveal linear both; animation-timeline: view(); animation-range: entry 0% cover 40%; }
}
}
</style>
<div id="progress"></div>
<h1>Desplázate hacia abajo</h1>
<section>Uno</section>
<section>Dos</section>
<section>Tres</section>Novedades
Ten en cuenta
- El shorthand animation reinicia animation-timeline: declara el timeline después.
- Envuélvelas en @supports (animation-timeline: view()) y en prefers-reduced-motion: no-preference.
- El polyfill más conocido (scroll-timeline-polyfill) no se actualiza desde 2024.
Más información
Fuentes
- Bugzilla 1676779 (Firefox: planes de activación)consultado el 1 oct 2026
- MDN · Experimental features in Firefoxconsultado el 1 oct 2026
- MDN · Scroll-driven animations22 sep 2026
- Interop 202612 feb 2026