Animaciones

Qué es una animación

Una animación recorre una secuencia de estados que se escribe aparte, con el nombre que se le quiera dar. A diferencia de una transición, no espera a que algo la dispare: arranca sola en cuanto la página se pinta.

Las diferencias con una transición son tres:

@keyframes: el guion

El guion se escribe fuera de cualquier selector, con @keyframes y un nombre. Dentro van las etapas, y en cada una las propiedades que tiene que tener el elemento en ese momento.

Con dos etapas basta escribir from y to:

@keyframes con dos etapas

<div class="row">
  <div class="caja">1</div>
  <div class="caja marcada">2</div>
  <div class="caja">3</div>
</div>

El guion por sí solo no hace nada: hay que asignárselo a un elemento. Eso es lo que hacen las dos líneas de .marcada, y son las dos únicas obligatorias.

El código lleva los dos colores de la clase de transiciones:

Es el mismo reparto de la transición, con una diferencia: allí el estado de llegada estaba en una regla propia, disparada por el :hover; aquí las etapas están todas dentro del guion, y por eso no hace falta que nada lo dispare.

Más de dos etapas

Cuando hay más, se escriben en porcentajes del recorrido total. 0% es el principio y 100% el final.

@keyframes con cuatro etapas

<div class="row">
  <div class="caja">1</div>
  <div class="caja marcada">2</div>
  <div class="caja">3</div>
</div>

Los porcentajes no tienen que estar repartidos a partes iguales: aquí el primer tramo dura el 40 % del tiempo y el segundo el 30 %. Lo que hay entre dos etapas lo calcula el navegador, igual que en una transición.

Las propiedades de la animación

animation-name y animation-duration

Las dos obligatorias: qué guion se usa y cuánto tarda en recorrerlo entero. Sin duración, la animación dura cero y no se ve.

tres duraciones para el mismo guion

<div class="column">
  <div class="caja d1">600 ms</div>
  <div class="caja d2">1,5 s</div>
  <div class="caja d3">4 s</div>
</div>

animation-timing-function

La curva, igual que en las transiciones: ease, linear, ease-in, ease-out, ease-in-out, cubic-bezier() y steps().

Hay una diferencia: aquí la curva se aplica entre cada par de etapas, no al recorrido entero. Con cuatro etapas y ease-in-out, la caja frena y vuelve a arrancar en cada una. Para un movimiento continuo que se repite, linear.

steps() encuentra aquí su uso principal: una animación a saltos sobre una tira de dibujos, que es como se animan los personajes de los juegos.

linear frente a ease-in-out, con el mismo guion de cuatro etapas

<div class="column">
  <div class="caja c1">linear</div>
  <div class="caja c2">ease-in-out</div>
</div>

animation-delay

Lo que se espera antes de empezar. Su uso principal es escalonar varios elementos.

tres retardos sobre el mismo guion

<div class="column">
  <div class="caja r1">0 ms</div>
  <div class="caja r2">200 ms</div>
  <div class="caja r3">400 ms</div>
</div>

animation-iteration-count

Cuántas veces se repite. Un número, o infinite para que no pare. Admite decimales: 2.5 hace dos recorridos y se queda a mitad del tercero.

animation-direction

normal
El valor por defecto. Cada repetición empieza otra vez desde el principio, así que hay un salto entre el final y el siguiente comienzo.
alternate
La repetición impar va hacia delante y la par hacia atrás. El recorrido queda continuo y el guion se escribe con la mitad de etapas.
reverse y alternate-reverse
Lo mismo empezando por el final.

normal frente a alternate

<div class="column">
  <div class="caja n1">normal</div>
  <div class="caja n2">alternate</div>
</div>

Cuándo una y cuándo otra

Transición cuando el movimiento responde a algo que hace el usuario y va de un estado a otro: un botón que cambia de color, un menú que se despliega, un campo que se marca al recibir el foco.

Animación cuando el movimiento tiene etapas, se repite, o tiene que ocurrir sin que nadie haga nada: un indicador de carga, un aviso que entra solo, un elemento que llama la atención.

En caso de duda, la transición es la opción más simple: se resuelve con dos líneas. La animación queda para lo que la transición no alcanza.

Resumen

  1. El guion se escribe aparte con @keyframes y un nombre; el elemento lo reclama con animation-name.
  2. Lo único obligatorio, además del nombre, es la duración.
  3. alternate ahorra la mitad del guion en los movimientos de ida y vuelta.