Tutorial de animaciones CSS: guía completa para principiantes
Esta es una guía de sintaxis completa y un tutorial interactivo de animaciones CSS para principiantes. Úselo como referencia para aprender las diferentes partes de la especificación de animaciones CSS.
El rendimiento del navegador ha avanzado mucho en los últimos 10 años. Solía ser mucho más desafiante agregar animaciones interactivas a las páginas web debido a la posibilidad de problemas de representación y rendimiento. Pero hoy en día, las animaciones CSS se pueden usar mucho más libremente y la sintaxis generalmente es mucho más fácil de aprender en comparación con las funciones CSS como grid o flexbox.
Hay diferentes funciones que forman parte de la especificación de animación CSS del W3C. Algunos más fáciles de usar que otros. Este tutorial de animaciones de fotogramas clave CSS repasará toda la sintaxis, incluidas cada una de las diferentes propiedades. Incluiré demostraciones interactivas para ayudarlo a comprender lo que es posible con las animaciones CSS.
La sintaxis de @keyframes
Cada animación CSS tiene dos partes: una o más animation-*
propiedades junto con un conjunto de fotogramas clave de animación que se definen mediante el @keyframes
en-regla. Echemos un vistazo en detalle a lo que implica construir un @keyframes
conjunto de reglas
La sintaxis se ve así:
@keyframes moveObject {
0% {
transform: translateX(0);
}
50% {
transform: translateX(300px);
}
100% {
transform: translateX(300px) scale(1.5);
}
}
Como se muestra aquí, el @keyframes
La regla at incluye tres partes básicas:
- Él
@keyframes
regla seguida de un nombre de animación personalizado - Un conjunto de llaves que envuelven todos los fotogramas clave
- Uno o más fotogramas clave, cada uno con un porcentaje seguido de un conjunto de reglas rodeado de llaves
En este primer ejemplo de nuestro tutorial de animaciones CSS, he definido mi animación con el nombre moveObject
. Este puede ser cualquier nombre que desee, distingue entre mayúsculas y minúsculas y debe cumplir con el identificador personalizado reglas en CSS. Este nombre personalizado debe coincidir con el nombre utilizado en el animation-name
propiedad (discutido más adelante).
En mi ejemplo, notará que usé porcentajes para definir cada uno de los fotogramas clave en mi animación. Si mi animación incluye fotogramas clave que equivalen 0%
y 100%
alternativamente puedo usar el from
y to
palabras clave:
@keyframes moveObject {
from {
transform: translateX(0);
}
50% {
transform: translateX(300px);
}
to {
transform: translateX(300px) scale(1.5);
}
}
El siguiente CodePen interactivo usa la sintaxis anterior en un ejemplo en vivo:
ver la pluma Animaciones CSS: la regla @keyframes por Louis Lazaris en CodePen.
En la demostración, he incluido un botón que restablece la animación. Explicaré más adelante por qué es necesario. Pero por ahora, sepa que esta animación incluye tres fotogramas clave que representan pasos en esta secuencia de animación: el inicio, el paso del 50 % y el final (es decir, 0 %, 50 % y 100 %). Cada uno de estos utiliza lo que se denomina un selector de fotogramas clave junto con llaves para definir las propiedades en ese paso.
Algunas cosas a tener en cuenta sobre el @keyframes
sintaxis:
- Puede colocar los conjuntos de reglas de fotogramas clave en el orden que desee, y el navegador aún los ejecutará en el orden determinado por su porcentaje
- Puede omitir los fotogramas clave 0% y 100% y el navegador los determinará automáticamente según los estilos existentes en el elemento que se está animando.
- Si hay fotogramas clave duplicados con diferentes conjuntos de reglas (por ejemplo, dos fotogramas clave para el 20 % con un valor de transformación diferente), el navegador usa el último
- Puede definir varios fotogramas clave en un único selector de fotogramas clave con una coma:
10%, 30% { ... }
- Él
!important
La palabra clave anula cualquier valor de propiedad, por lo que no debe usarse en una propiedad dentro de un conjunto de reglas de fotogramas clave
👉 Ahora que tiene una buena comprensión de la @keyframes
sintaxis en este tutorial de animación CSS, echemos un vistazo a las diferentes propiedades de animación que se definen en el elemento que se está animando.
Las propiedades de animación que vamos a cubrir:
La propiedad del nombre de la animación
Como se mencionó, cada animación CSS que cree debe tener un nombre que aparezca en el @keyframes
sintaxis. Este nombre tiene que ser el mismo nombre definido usando el animation-name
propiedad.
Usando el CSS de la demostración anterior, la sintaxis se ve así:
.box {
animation-name: moveObject;
}
Una vez más, el nombre personalizado que he definido también debe existir como nombre para un @keyframes
regla at — de lo contrario, este nombre no hará nada. Puedes pensar en esto como un Llamada de función en JavaScript. La función en sí sería la @keyframes moveObject {}
parte del código, mientras que la llamada a la función es animation-name: moveObject
.
Algunas cosas a tener en cuenta sobre animation-name
:
- El valor inicial para
animation-name
esnone
, lo que significa que no hay fotogramas clave activos. Esto se puede usar como una especie de ‘alternar’ para desactivar una animación. - El nombre elegido distingue entre mayúsculas y minúsculas y puede incluir letras, números, guiones bajos y guiones.
- El primer carácter del nombre debe ser una letra o un guión, pero solo un guión.
- El nombre no puede ser una palabra reservada como
unset
,initial
oinherit
.
La propiedad de duración de la animación
Él animation-duration
La propiedad, sin sorpresa, define la cantidad de tiempo que tarda una animación en ejecutarse una vez de principio a fin. Este valor se puede especificar en segundos o milisegundos, como se muestra a continuación:
.box {
animation-duration: 2s;
}
Lo anterior sería el equivalente a lo siguiente:
.box {
animation-duration: 2000ms;
}
Puedes ver el animation-duration
propiedad en acción en la siguiente demostración de CodePen. En esta demostración, puede elegir cuánto tiempo desea que dure la animación. Intente ingresar varios valores en segundos o milisegundos, luego use el botón “Animar el cuadro” para ejecutar la animación.
ver la pluma Animaciones CSS: la propiedad animation-duration por Louis Lazaris en CodePen.
Si usa un número pequeño junto con ms
para la unidad, es posible que ni siquiera note ningún movimiento. Intente configurar un número más alto si está usando milisegundos.
Algunas notas sobre el uso animation-duration
:
- Los valores negativos no son válidos
- La unidad debe incluirse, incluso si la duración se establece en
0s
(el valor inicial) - Puede utilizar valores fraccionarios (p. ej.,
0.8s
)
La propiedad animation-timing-function
Él animation-timing-function
, que no es tan obvio en su significado como las dos propiedades anteriores, se usa para definir la forma en que progresa la animación CSS. Puede que esa no sea la explicación más clara, pero la sintaxis puede ayudar a aclarar.
La declaración se ve así:
.box {
animation-timing-function: linear;
}
Esta propiedad acepta los siguientes valores de palabra clave:
ease
(el valor inicial)ease-in
ease-out
ease-in-out
linear
step-start
step-end
La mayoría de los valores son relativamente fáciles de comprender por sus nombres, pero puede ver cómo difieren utilizando la siguiente demostración interactiva:
ver la pluma Animaciones CSS: la función de tiempo de animación por Louis Lazaris en CodePen.
Utilice la entrada de selección para elegir uno de los siete valores de palabra clave. Tenga en cuenta que el ease-*
Los valores ‘facilitan’ la animación de varias maneras. Un valor lineal es consistente en todo el camino.
Él animation-timing-function
La propiedad también acepta las siguientes funciones:
cubic-bezier()
– Acepta como argumentos cuatro valores numéricos, separados por comassteps()
– Acepta como argumentos dos valores, un número y un “término de salto”, separados por una coma
Los valores de las palabras clave step-start
y step-end
son equivalentes a los valores steps(1, jump-start)
y steps(1, jump-end)
respectivamente.
Como para cubic-bezier()
la siguiente demostración interactiva puede ayudarlo a comprender un poco mejor la función:
ver la pluma Animaciones CSS: la función cubic-bezier() por Louis Lazaris en CodePen.
Observe que la demostración le permite establecer los cuatro argumentos en el cubic-bezier()
función. Dos de los argumentos pueden ser negativos y dos están restringidos a valores decimales entre 0 y 1. Para obtener una explicación decente de cómo funcionan estos tipos de funciones de tiempo, puede consultar Este artículo o esta herramienta interactiva.
Él steps()
La función, por otro lado, acepta dos argumentos:
- Un número entero que representa “paradas” iguales a lo largo de un solo ciclo de la animación.
- Una palabra clave opcional llamada “jumpterm” que determina si la animación “se mantiene” en intervalos específicos
Nuevamente, una demostración interactiva debería ayudarlo a comprender cómo funcionan estos términos de salto:
ver la pluma Animaciones CSS: la función steps() por Louis Lazaris en CodePen.
Intente seleccionar un número entero junto con un término de salto (o pruébelo sin término de salto) para ver cómo las diferentes palabras clave difieren con diferentes valores enteros. Aparentemente, se permiten enteros negativos, pero no veo ninguna diferencia entre 0 y cualquier valor negativo.
La propiedad animation-iteration-count
En algunos casos, estará contento si una animación se ejecuta una vez, pero a veces desea que una animación se ejecute varias veces. Él animation-iteration-count
La propiedad le permite hacer esto aceptando un número positivo que representa la cantidad de veces que desea que se ejecute la animación:
.box {
animation-iteration-count: 3;
}
El valor inicial para animation-iteration-count
es 1
pero también puedes usar la palabra clave infinite
(se explica por sí mismo) o utilizar un valor fraccionario. Un valor fraccionario ejecutará la animación parcialmente en la ejecución fraccionaria:
.box {
animation-iteration-count: 3.5;
}
El código anterior se ejecuta a través de la animación tres veces y media. Es decir, tres iteraciones completas seguidas de una iteración final que se detiene exactamente a la mitad.
Esta propiedad es más útil cuando se usa junto con el animation-direction
propiedad (discutida a continuación), porque una animación que se ejecuta desde el principio no es extremadamente útil si se ejecuta más de una vez.
Puede probar la demostración a continuación que le permite seleccionar un valor fraccionario para el recuento de iteraciones, para que pueda ver el efecto:
ver la pluma Animaciones CSS: la propiedad animation-iteration-count por Louis Lazaris en CodePen.
La propiedad de dirección de animación
Como se mencionó anteriormente en este tutorial de animaciones CSS, el animation-direction
propiedad funciona muy bien en conjunto con animation-iteration-count
. Él animation-direction
La propiedad le permite definir en qué dirección desea que se reproduzca la animación. La sintaxis se ve así:
.box {
animation-direction: alternate;
}
Puede establecer el valor como una de cuatro palabras clave:
normal
– La animación se reproduce hacia adelante en la primera iteración (el valor predeterminado)reverse
– La animación se reproduce hacia atrás en la primera iteraciónalternate
– La animación se reproduce hacia adelante en la primera iteración y luego se alterna en iteraciones posterioresalternate-reverse
– Igual quealternate
pero se reproduce al revés en la primera iteración
Puede probar los diferentes valores con diferentes recuentos de iteraciones utilizando la demostración interactiva a continuación:
ver la pluma Animaciones CSS: la propiedad animation-direction por Louis Lazaris en CodePen.
La propiedad animation-play-state
Él animation-play-state
La propiedad no es extremadamente útil en un entorno CSS estático, pero puede ser útil al escribir animaciones que son interactivas a través de JavaScript o incluso CSS.
Esta propiedad acepta dos valores: running
o paused
:
.box {
animation-direction: paused;
}
De forma predeterminada, cualquier animación dada está en el estado “en ejecución”. Pero puede usar JavaScript para alternar el valor de la propiedad. Incluso podría usar una función CSS interactiva como :hover
o :focus
para cambiar la animación a un estado de “pausa”, que esencialmente congela la animación donde sea que esté en la iteración actual.
La demostración interactiva a continuación tiene una animación que se ejecuta infinitamente con dos botones para “pausar” y “reanudar” la animación.
ver la pluma Animaciones CSS: la propiedad animation-play-state por Louis Lazaris en CodePen.
La propiedad de retraso de animación
Algunas animaciones están diseñadas para comenzar a animar de inmediato, mientras que otras podrían beneficiarse de un ligero retraso antes de la primera iteración. Él animation-delay
propiedad le permite lograr esto.
.box {
animation-delay: 4s;
}
Al igual que otros valores basados en el tiempo, puede configurar el animation-delay
a un valor usando segundos o milisegundos. También puede utilizar valores fraccionarios.
Es importante tener en cuenta que el retraso ocurre solo en la primera iteración, no en cada iteración. Puede probar esto usando la demostración interactiva a continuación:
ver la pluma Animaciones CSS: la propiedad animation-delay por Louis Lazaris en CodePen.
La demostración le brinda la opción de cambiar el valor de la iteración, así como la demora, para que pueda ver que la demora no afecta las iteraciones posteriores, solo la primera.
Una forma interesante de usar esta propiedad es con un valor negativo. Por ejemplo, utilizando la demostración anterior, intente configurar el animation-delay
a -0.5s
. Notará que el retraso negativo funciona casi como avanzar en una máquina del tiempo: la animación comienza en la mitad en lugar de al principio.
La propiedad animation-fill-mode
La propiedad manual final que cubriré en este tutorial de animaciones CSS es una que usé en la demostración anterior. Notarás que cuando la animación detiene la iteración final, el cuadro permanece donde está. Esto se logra utilizando animation-fill-mode
.
.box {
animation-fill-mode: forwards;
}
Esta propiedad establece cómo una animación aplica estilos al elemento de destino antes y después de su ejecución. Eso es un poco difícil de entender conceptualmente, así que cubriré el significado de cada valor; luego puede comparar los valores usando la demostración interactiva.
Esta propiedad acepta los siguientes cuatro valores de palabra clave:
none
– El valor predeterminado, sin estilos aplicados antes o después de la ejecuciónforwards
– Conserva todos los estilos aplicados en el último fotograma clave de la animaciónbackwards
– Más o menos al revés del valor anterior, conserva los estilos aplicados a la animación tan pronto como comienza la ejecución pero antes de que comience la animación.both
– Conserva estilos para ambosforwards
ybackwards
La demostración final en este tutorial de animaciones CSS hará las cosas un poco más claras, pero es posible que le cueste mucho jugar antes de que realmente entienda lo que hace y cómo lo logra.
ver la pluma Animaciones CSS: la propiedad animation-fill-mode por Louis Lazaris en CodePen.
Para mayor comodidad, he agregado todas las demostraciones en una sola colección de CodePen.
Notará que la demostración le permite ajustar el modo de relleno, el retraso, la dirección y la cantidad de iteraciones, ya que todo esto puede tener un efecto en la apariencia. También agregué un color de fondo diferente al cuadro animado en el primer fotograma clave, lo que nuevamente ayuda a que los valores del modo de relleno sean un poco más claros. Si todavía no entiendes cómo animation-fill-mode
funciona, puedes revisar un articulo mas antiguo Escribí que discute animation-fill-mode
en profundidad
La propiedad abreviada de animación
He cubierto ocho propiedades diferentes en este tutorial de animación CSS para principiantes y lo animo a usar la mano larga. Esto le facilitará ver los valores explícitos establecidos.
Una vez que tenga una buena comprensión de cada una de las propiedades, tiene la opción de usar el animation
propiedad abreviada, que le permite definir todas las propiedades abreviadas en una sola declaración.
.box {
animation: moveObject 2s ease-in-out 3 reverse running 1.3s forwards;
}
Con toda honestidad, eso es mucha información en una sola línea. Recomendaría usar la abreviatura si la declaración no incluye todas las propiedades, pero tal vez solo tres o cuatro de ellas.
Si usa la abreviatura, puede poner los valores en el orden que desee, pero tenga en cuenta las siguientes reglas:
- El primer valor que define el tiempo es el
animation-duration
; cualquier valor de tiempo subsiguiente es elanimation-delay
. - Si hay un conflicto entre una palabra clave y el
animation-name
el valor de la palabra clave tendrá prioridad si aparece primero. - Cualquier valor omitido volverá a su estado inicial, como con cualquier propiedad abreviada de CSS.
Aplicar múltiples animaciones a un solo elemento
Una característica final que es bueno tener en cuenta es que tiene la opción de aplicar múltiples animaciones a un solo objeto separando las animaciones por comas.
Aquí hay un ejemplo usando la abreviatura:
.box {
animation: moveObject 2s ease-in-out, fadeBox 3s linear;
}
Aquí, definí dos animaciones diferentes que se asignarían a dos conjuntos diferentes de fotogramas clave, pero se aplicarían al mismo objeto. Ese mismo código podría escribirse a mano como:
.box {
animation-name: moveObject, fadeBox;
animation-duation: 2s, 3s;
animation-timing-function: ease-in-out, linear;
}
Observe cómo cada propiedad incluye dos valores separados por comas. En este caso, la taquigrafía sería casi definitivamente más fácil de leer y mantener.
Terminando este tutorial de animaciones CSS
Si eres un principiante de CSS y este tutorial de animaciones de CSS fue tu primera inmersión en la experimentación con el movimiento de cosas en las páginas web, espero que la lección haya sido lo suficientemente completa. Usted podría incluso ser capaz de incorporar Variables CSS con animaciones para hacerlos aún más poderosos.
👉 Una advertencia final: use la animación con moderación y recuerde que algunos usuarios de la web pueden verse afectados negativamente por los colores parpadeantes y otros objetos que se mueven rápidamente.
Con la práctica, la sintaxis y los conceptos para crear animaciones CSS se mantendrán contigo y definitivamente te beneficiarás de jugar con el código en las diferentes demostraciones.