Maquetación Web Dinámica / Animaciones CSS: de sencillas a profesionales
animation: el panel de control completo
animation es en realidad ocho propiedades disfrazadas de una. Ya usas
tres (nombre, duración, curva); hoy dominas las que resuelven los "¿por
qué hace eso?" clásicos: la animación que parpadea al reiniciar, el
elemento que aparece de golpe ANTES de su entrada, y la que termina y
"rebobina" sola.
iteration-count y direction: cuántas veces y hacia dónde
alternate merece atención: reproduce los fotogramas de ida y luego DE
REGRESO. La flotación de la lección pasada (0% abajo → 50% arriba → 100%
abajo) puede reescribirse a la mitad: solo de abajo → a arriba, con
alternate haciendo el regreso gratis. Menos fotogramas, mismo vaivén —
y la curva de easing se aplica en cada sentido, así que el rebote queda
simétrico.
fill-mode: qué pasa antes y después de la función
Esto resuelve el bug más frustrante de las animaciones de entrada:
Sin backwards, durante el delay la tarjeta se ve en su estado normal
(¡visible!), luego SALTA a opacity: 0 y entra — un parpadeo horrible.
Con backwards, la tarjeta espera el delay ya en su pose del from:
invisible, lista para entrar. Cuando en la lección 4 animes entradas
escalonadas con delays distintos, backwards será la diferencia entre
elegancia y strobe.
forwards es el espejo: una animación de salida (to { opacity: 0 })
sin forwards termina... y el elemento REAPARECE, porque al acabar la
animación el CSS normal recupera el control. forwards congela la pose
final.
Míralo en frío
<div class="demo">
<div class="caso"><div class="caja sin"></div><p>delay SIN backwards<br>(visible → salta → entra)</p></div>
<div class="caso"><div class="caja con"></div><p>delay CON backwards<br>(espera invisible, entra)</p></div>
</div>
<p class="nota">Ambas cajas tienen la misma entrada con 1.2s de delay (exagerado para verlo). La animación se repite cada 4s para que puedas estudiarla.</p>body { font-family: system-ui; padding: 28px; background: #f8fafc; }
.demo { display: flex; gap: 48px; }
.caso { text-align: center; }
.caso p { font-size: 12px; color: #64748b; line-height: 1.5; }
.caja { width: 90px; height: 90px; border-radius: 12px; background: #6d28d9; margin: 0 auto; }
@keyframes entrar {
0%, 30% { opacity: 0; transform: translateY(24px); }
42%, 88% { opacity: 1; transform: translateY(0); }
100% { opacity: 1; transform: translateY(0); }
}
@keyframes entrar-sin {
0%, 29.9% { opacity: 1; transform: translateY(0); }
30% { opacity: 0; transform: translateY(24px); }
42%, 100% { opacity: 1; transform: translateY(0); }
}
.sin { animation: entrar-sin 4s ease-out infinite; }
.con { animation: entrar 4s ease-out infinite; }
@media (prefers-reduced-motion: reduce) { .caja { animation: none; } }
.nota { font-size: 13px; color: #64748b; margin-top: 18px; max-width: 54ch; }(Confesión de tramoya: para poder REPETIR la comparación en loop, este
demo simula ambos comportamientos dentro de los keyframes. En tu código
real es una sola palabra: backwards.)
Tu animación de salida desvanece el modal (to: opacity 0)... y al terminar, el modal reaparece en pantalla. ¿Causa raíz?
play-state: el botón de pausa
A diferencia de quitar la animación (que la REINICIA al devolverla),
paused la congela donde va y running la retoma del mismo punto. Es la
base del patrón "pausar al hover" de carruseles y marquesinas — y una
cortesía de accesibilidad: contenido en movimiento que el usuario pueda
detener.
La forma larga de todo el panel, para cuando el shorthand se vuelva críptico:
.tarjeta {
animation-name: aparecer;
animation-duration: 500ms;
animation-timing-function: ease-out;
animation-delay: 400ms;
animation-iteration-count: 1;
animation-direction: normal;
animation-fill-mode: backwards;
animation-play-state: running;
}Mini-reto
Tres experimentos de un minuto sobre tu pulso de "EN VIVO": (1) cámbialo a
3 iteraciones y observa dónde queda al terminar; (2) agrégale
forwards y compara; (3) móntale animation-play-state: paused al hover
del titular. Tocar las perillas una por una — con hipótesis antes de cada
cambio — es como se fija este panel en la memoria.
Qué sigue
Ya controlas el QUÉ y el CUÁNDO. Sigue el CUÁNTO CUESTA: por qué animar
width puede congelar un celular gama baja mientras transform vuela a
60fps, y qué hace (y qué NO hace) will-change. La lección de rendimiento
— la que separa animaciones bonitas de animaciones profesionales.