CodeForge

Maquetación Web Dinámica / Animaciones CSS: de sencillas a profesionales

Staggering: animaciones en cascada con delay y variables

Teoría20 min20 XP

Cuando una lista entera aparece de golpe, el ojo la recibe como UN bloque. Cuando sus elementos entran uno tras otro con 60ms de diferencia, el ojo los recorre en orden — la interfaz "se presenta". Ese desfase se llama staggering, es la firma de las interfaces premium (incluida la que estás usando ahora mismo), y se construye con dos cosas que ya sabes: animation-delay y variables CSS.

La ola del estadio

Versión artesanal → versión con variables

La forma ingenua funciona, pero no escala:

artesanal.css

La forma profesional mueve el DATO al HTML y la FÓRMULA al CSS:

lista.html
<ul class="lista">
<li class="item" style="--i: 0">Notificaciones</li>
<li class="item" style="--i: 1">Mensajes</li>
<li class="item" style="--i: 2">Ajustes</li>
<li class="item" style="--i: 3">Perfil</li>
</ul>
stagger.css

Cambias el ritmo de TODA la ola tocando un solo número (60ms), y el ítem 15 funciona igual que el 2 sin escribir una regla más. El --i en el HTML puede molestarte ("¿un dato en el markup?") — nota honesta: sí, es un índice a mano, y cuando el HTML lo genere JavaScript o un framework (módulo 14 y cursos siguientes), el índice saldrá del bucle gratis. En HTML estático, es el costo de no repetir CSS.

¿Y ese backwards en la línea de animation? Es la vacuna de la lección 2 aplicada donde más se necesita: aquí TODOS los ítems menos el primero tienen delay. Sin fill-mode: backwards, la lista entera se ve un instante, desaparece y va entrando — el parpadeo estroboscópico que delata un stagger amateur. Es EL bug de esta técnica: si tu cascada parpadea al cargar, ya sabes dónde mirar.

La ola, en vivo

Sobre el paso de la ola: 40-90ms entre elementos es el rango dulce (esta plataforma usa 40ms). Menos de 30ms y el ojo ve todo junto; más de 150ms y el usuario ESPERA a que tu lista termine el show — el stagger decora la carga, jamás la retrasa perceptiblemente.

Tu cascada funciona, pero al recargar la página todos los ítems se ven un instante, desaparecen y van entrando uno a uno. ¿Qué falta?

Encadenar animaciones distintas

El stagger repite UNA animación con turnos. Encadenar es otra necesidad: que el badge ENTRE y, ya adentro, PULSE. Un elemento acepta varias animaciones separadas por coma — con sus delays sumados a mano:

cadena.css

El delay del segundo eslabón = duración del primero. Es coordinación manual y frágil si la cadena crece — nota honesta: para secuencias de verdad complejas (cinco pasos, reversas, pausas), CSS se queda corto y esa es EXACTAMENTE la puerta por la que entrará GSAP en el módulo 16. Hasta tres eslabones, esto es limpio y suficiente.

Mini-reto

Dale entrada escalonada a las tarjetas de la portada de "El Observador": --i en cada una, la fórmula calc(), 60ms de paso y su backwards. Luego provoca el bug: quita el backwards, recarga, y confirma que ahora DETECTAS el parpadeo que antes ni habrías notado. (Y el @media de reduced-motion, que las cascadas marean más que casi cualquier efecto.)

Qué sigue

Con keyframes, panel de control, regla de oro y stagger, ya puedes construir el vocabulario visual que TODA app necesita mientras trabaja: spinners, skeleton screens con brillo deslizante y puntos que bailan. Lección de loading states — pura práctica.