Scroll-Driven Animations y View Transitions: CSS nativo que reemplaza a GSAP y Framer Motion
animation-timeline, scroll(), view() y cross-document View Transitions ya son compatibles en todos los navegadores. Medimos el impacto real en INP, el ahorro de bundle JS y compartimos el framework de decisión para saber cuándo usar CSS nativo vs librerías en 2026.
En 2023, si querías una animación que respondiera al scroll, necesitabas ScrollMagic, GSAP ScrollTrigger o Intersection Observer + requestAnimationFrame. Para transiciones entre páginas, necesitabas un framework SPA — y aún así dolía. En 2026, ambas cosas se resuelven con CSS.
La especificación de Scroll-Driven Animations y la View Transitions API han alcanzado soporte cross-browser completo. No es una promesa futura: son herramientas que puedes —y deberías— usar en producción hoy.
Pero ojo: no todo lo que brilla es oro. En este artículo comparto lo que aprendimos en Mintec probando ambas APIs en proyectos reales, con datos de rendimiento concretos y un framework de decisión para elegir cuándo usar CSS nativo vs cuándo seguir reaching por GSAP o Framer Motion.
Cómo funcionan las Scroll-Driven Animations (sin JavaScript)
El principio es engañosamente simple: en lugar de que una animación avance con el tiempo (animation-duration), avanza con el scroll. Dos funciones hacen todo el trabajo pesado:
animation-timeline: scroll() — Vincula la animación al progreso del scroll del contenedor más cercano con scroll. Si el usuario ha scrolleado el 40% del contenedor, la animación está al 40%.
animation-timeline: view() — Vincula la animación a la visibilidad del propio elemento dentro del viewport. Una imagen aparece cuando entra al 20% desde abajo y completa la animación cuando está al 80% visible.
El resto es CSS clásico: un @keyframes normal, con from y to. La diferencia está en que el 0% y el 100% ahora representan progreso de scroll en lugar de tiempo transcurrido.
@keyframes fade-in {
from { opacity: 0; transform: translateY(20px); }
to { opacity: 1; transform: translateY(0); }
}
.reveal {
animation: fade-in 1s ease-out;
animation-timeline: view();
animation-range: entry 0% entry 100%;
}
Tres líneas de CSS. Sin Intersection Observer, sin scroll listeners, sin librerías. El navegador hace todo en el compositor thread.
Lo que nadie te dice de animation-range
Aquí está el primer gotcha que encontramos en producción. El shorthand de CSS animations tiene una trampa silenciosa:
/* Esto RESETEA animation-timeline */
.reveal {
animation: fade-in 1s ease-out;
}
Si usas el shorthand animation, sobreescribes animation-timeline a su valor por defecto (normal). La solución es usar longhands o asegurarte de declarar animation-timeline después del shorthand.
En nuestro último proyecto con Astro + Cloudflare, migramos las animaciones de entrada de un sitio corporativo de ScrollMagic (que añadía ~31KB al bundle crítico) a CSS scroll-driven animations. El resultado: cero JavaScript para scroll detection, mismas animaciones, y una reducción de 120ms en INP p75.
View Transitions API: el fin de las SPA forzadas
La View Transitions API resuelve un problema que los desarrolladores web han intentado solucionar con trucos durante dos décadas: hacer que la navegación entre páginas se sienta fluida.
Cross-document View Transitions — es decir, transiciones entre páginas HTML normales en un MPA (Multi-Page Application) — llegaron a Chrome 126+, Firefox 128+ y Safari 18+. En 2026, los tres grandes motores las soportan.
La activación es casi ridícula:
/* En tu CSS global */
@view-transition {
navigation: auto;
}
Esto habilita transiciones automáticas entre páginas. El navegador toma un screenshot de la página actual, navega, y crossfadea al nuevo estado. Pero el poder real está en personalizar qué elementos hacen match entre páginas usando view-transition-name:
/* En página A */
.main-header { view-transition-name: header; }
/* En página B */
.main-header { view-transition-name: header; }
Cuando ambos elementos existen en la página de origen y destino, el navegador morph automáticamente de uno a otro en lugar de hacer crossfade. Esto da exactamente la misma sensación que las transiciones de Framer Motion's LayoutGroup, pero zero JavaScript y zero bundle cost.
View Transitions en Astro (y otros frameworks MPA)
Aquí hay un detalle clave que descubrimos implementándolo en mintec.co. Astro es un MPA por defecto — cada navegación es una solicitud HTTP completa. Esto hace que Astro sea un candidato perfecto para cross-document View Transitions, pero hay un matiz importante:
Astro v5+ incluye soporte nativo para View Transitions. Actívalo en el layout global:
---
import { ViewTransitions } from "astro:transitions";
---
<!doctype html>
<html>
<head>
<ViewTransitions />
</head>
<body>
<slot />
</body>
</html>
Esto hace tres cosas: inyecta el CSS @view-transition { navigation: auto; }, configura el JavaScript mínimo para que el navegador capture los elementos nombrados, y maneja el fallback para navegadores que aún no soportan la API (simplemente navegan sin transición).
El gotcha real: las transiciones de elementos nombrados funcionan mejor cuando ambos lados de la navegación renderizan el mismo DOM tree. En Astro, si tienes un layout que cambia entre rutas (por ejemplo, sidebar que desaparece en /blog/[slug]), necesitas asegurar que los elementos con view-transition-name existen o no en ambos lados. Elementos huérfanos causan flashes.
Framework de decisión: CSS nativo vs librería JS
En Mintec empezamos 2026 con una regla simple que ha funcionado bien:
| Escenario | Solución | Por qué |
|---|---|---|
| Scroll-triggered entrance (fade-in, slide-up) | CSS scroll-driven animations | 0KB JS, GPU composited, sin main thread |
| Progress bar de scroll | CSS scroll-driven animations | animation-timeline: scroll() directo |
| Parallax sutil | CSS scroll-driven animations | animation-timeline: view() + transform |
| Timeline compleja con play/pause/reverse | GSAP ScrollTrigger | Necesitas control programático |
| Animation sequencing (stagger complejo) | GSAP | CSS no soporta delay por elemento en timeline |
| Página → página morph animado | View Transitions API | Nativo, 0KB JS, same-element morph |
| UI state transitions en React (modal, sidebar) | Framer Motion | AnimatePresence no tiene equivalente CSS |
| Easing con física (spring, bounce) | GSAP o WAAPI | CSS easing no cubre física compleja |
La regla general: empieza asumiendo que puedes hacerlo con CSS. El 70% de las animaciones decorativas que solíamos implementar con librerías se pueden hacer hoy con scroll-driven animations o View Transitions. Cuando te topes con un caso donde necesitas control programático (play/pause/reverse, sequencing, stagger por índice), ahí sí, agrega GSAP. No al revés.
Datos de producción: lo que medimos
Migrar de ScrollMagic + GSAP a CSS scroll-driven animations en un sitio corporativo de tamaño medio nos dio estos resultados:
| Métrica | Antes (ScrollMagic + GSAP) | Después (CSS nativo) |
|---|---|---|
| JS bundle crítico | 47KB | 16KB |
| INP p75 | 224ms | 104ms |
| LCP | 2.1s | 1.8s |
| Tiempo de desarrollo | ~8h (configuración, debugging) | ~2h (CSS + testing) |
| Bugs reportados post-lanzamiento | 3 (scroll flicker en Safari) | 0 |
El ahorro no es solo técnico. Es tiempo de desarrollo, menos bugs cross-browser, y una experiencia más consistente para el usuario.
El futuro inmediato
View Transitions sigue evolucionando. Lo que viene en 2026-2027:
@view-transitioncon clases CSS para diferentes tipos de navegación (atrás vs adelante)view-transition-grouppara elementos que se reordenan en listas (tipo FLIP animation)- Morphing SVG entre estados de página
- Integración más profunda con el
Navigation API(la nueva especificación que reemplaza a History API)
Scroll-Driven Animations, por su parte, está en un punto donde la especificación está completa y estable. Los próximos pasos son adopción en frameworks y tooling — herramientas de build que automaticen la detección de animaciones que pueden migrarse de JS a CSS.
Conclusión
2026 es el año en que finalmente podemos dejar de lamentar el peso de las librerías de animación. CSS scroll-driven animations y View Transitions API cubren la mayoría de los casos de uso que antes requerían 30-50KB de JavaScript adicional. No es que GSAP o Framer Motion hayan muerto — siguen siendo las herramientas correctas para escenarios complejos — pero han pasado de ser el default a ser la excepción.
En Mintec, nuestro framework de decisión es simple: si se puede hacer con animation-timeline o @view-transition, se hace con CSS. Punto. Las librerías JS solo entran cuando el caso lo exige.
Tu estrategia de animación web en 2026 debería empezar por responder una pregunta: ¿realmente necesitas JavaScript para eso?
Preguntas Frecuentes
¿Qué navegadores soportan CSS Scroll-Driven Animations en 2026?
Chrome 115+, Edge 115+, Firefox 126+ y Safari 17.2+. Con animation-timeline: scroll() y view() funcionando de forma consistente en todos los motores desde mediados de 2026. La compatibilidad cross-browser es completa para casos de uso estándar como progress bars, parallax reveal y scroll-triggered entrances.
¿Cuándo debo usar CSS Scroll-Driven Animations en lugar de GSAP o Framer Motion?
Usa CSS nativo cuando la animación sea lineal, dependa del scroll o viewport, y no requiera control por timeline programático (play, pause, reverse, scrub) o encadenamiento complejo. GSAP sigue siendo necesario para animation sequencing avanzado, timeline inverso con control de velocidad, y animaciones con física personalizada. Framer Motion solo se justifica en apps React con transiciones de estado UI que requieren AnimatePresence.
¿Cómo afectan las View Transitions al INP y al rendimiento?
Las View Transitions API son nativas del navegador y no bloquean el hilo principal. El impacto en INP es negligible (~0ms adicional) cuando se usan transiciones simples. Sin embargo, animar elementos muy pesados (imágenes grandes, SVG complejos) puede causar jank durante la transición. La recomendación es usar ::view-transition-old y ::view-transition-new con animate-only: transform y opacity para mantener el rendimiento.



