APIs de la web, hoyLaboratorio · Alex Harto

Scroll-driven animations

Animaciones que avanzan con el scroll, sin escuchar eventos y fuera del hilo principal.

En tu navegador: comprobando…Revisado 1 oct 2026

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.

Recorrido

Ocho partes de un edificio, una tras otra.

  1. 01Cimientos
  2. 02Pilares
  3. 03Forjados
  4. 04Fachadas
  5. 05Cubierta
  6. 06Torres
  7. 07Veletas
  8. 08Foso

Fin del recorrido.

Compatibilidad

Disponibilidad limitada
FunciónEscritorioMóvil
ChromeEdgeFirefoxSafariChrome AndroidFirefox AndroidSafari iOS
animation-timeline (scroll(), view())115Chrome: 115 115Edge: 115 ✓previewFirefox: preview26Safari: 26 115Chrome: 115 —Firefox: No26Safari: 26
animation-range115Chrome: 115 115Edge: 115 ✓previewFirefox: preview26Safari: 26 115Chrome: 115 —Firefox: No26Safari: 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>

Novedades

  1. Firefox 157 (en Nightly) ajusta startTime cuando se invierte playbackRate en estas animaciones.
  2. Chrome 146: animaciones que se disparan con el scroll (animation-trigger).
  3. Entran en Interop 2026.
  4. Safari 26 las activa.

Ten en cuenta

  1. El shorthand animation reinicia animation-timeline: declara el timeline después.
  2. Envuélvelas en @supports (animation-timeline: view()) y en prefers-reduced-motion: no-preference.
  3. El polyfill más conocido (scroll-timeline-polyfill) no se actualiza desde 2024.

Más información

Fuentes