03 Capítulo 3 · Lección 11

Animation Direction

Redactado por
Author Sebastian V.
Fecha de publicación

22/04/2025

Tiempo de lectura

6 min

Tema

@keyframes

El problema de los saltos bruscos

Imagina que animas un péndulo. Defines un fotograma inicial a la izquierda y un fotograma final a la derecha. Le dices que se repita infinitamente. ¿Qué ocurre? El péndulo va de izquierda a derecha... y luego se teletransporta instantáneamente de vuelta a la izquierda para empezar de nuevo. En la vida real, las cosas no se teletransportan. Van, y luego vuelven.

animation-direction es la propiedad que le enseña al navegador a "ir y volver". Define el sentido en el que se reproduce la línea temporal a través de sus repeticiones.

Los cuatro caminos posibles

  • normal: (Valor por defecto) El viaje de ida convencional, del 0% al 100%. Cuando termina, el elemento regresa abruptamente al inicio y vuelve a arrancar.
  • reverse: El viaje hacia atrás, del 100% al 0%. Pero cuidado: no solo se invierte el orden visual, también se invierten las curvas de aceleración (easing). Lo que antes aceleraba al final, ahora acelerará al principio.
  • alternate: La magia pura para loops. El primer ciclo va hacia adelante, el segundo hacia atrás. El tren va y vuelve por la misma vía. Es el secreto detrás de animaciones de respiración, indicadores flotantes o elementos que pulsan.
  • alternate-reverse: Exactamente igual que alternate, pero comenzando el primer viaje hacia atrás.

¿Por qué no simplemente animar el regreso a mano?

Claro, podrías definir 0% izquierda, 50% derecha, 100% izquierda. Pero alternate te ahorra escribir ese paso extra. Mantiene tus keyframes limpios y enfoca tu código solo en los dos estados extremos, dejando que el navegador haga el cálculo matemático del regreso, incluyendo la inversión de los easings.

Consejo profesional

Ten en cuenta que alternate solo funciona cuando animation-iteration-count es mayor a 1 o infinite. Si es 1, solo se reproducirá la primera mitad (hacia adelante) y terminará.

Ejemplo práctico

> _
<div class="direction-demo">
  <div class="direction-row">
    <span class="label">normal (0% → 100%)</span>
    <div class="track"><div class="dot dir-normal"></div></div>
  </div>
  <div class="direction-row">
    <span class="label">reverse (100% → 0%)</span>
    <div class="track"><div class="dot dir-reverse"></div></div>
  </div>
  <div class="direction-row">
    <span class="label">alternate (0% → 100% → 0%)</span>
    <div class="track"><div class="dot dir-alternate"></div></div>
  </div>
  <div class="direction-row">
    <span class="label">alternate-reverse (100% → 0% → 100%)</span>
    <div class="track"><div class="dot dir-alternate-reverse"></div></div>
  </div>
</div>
> _
normal (0% → 100%)
reverse (100% → 0%)
alternate (0% → 100% → 0%)
alternate-reverse (100% → 0% → 100%)

Compara el comportamiento del recorrido: el verde (alternate) y el amarillo (alternate-reverse) van y vuelven suavemente, mientras que el morado (normal) y el azul (reverse) saltan bruscamente al completarse.

Errores comunes

01
Usar "alternate" sin repeticiones Declarar alternate con iteration-count: 1 no mostrará el regreso visual de la animación.
02
Invertir curvas complejas incorrectamente El navegador invierte el comportamiento matemático del easing en reverse. Revisa que tu cubic-bezier funcione bien en reversa.

Practica lo aprendido

Cambia la propiedad animation-direction en el código para ver cómo reaccionan las distintas esferas.

01 Prueba la dirección "alternate" en un elemento deslizante para evitar saltos bruscos
02 Compara "alternate-reverse" y observa cómo inicia desde el estado final hacia atrás
03 Usa "reverse" para invertir una animación existente sin modificar el código de @keyframes