Guia para realizar animaciones con CSS con proyecto demostrativo que incluye una gran variedad de elementos animados.
Una animación se define como la transición entre un punto A y un punto B. Las animaciones son una Interfaz web necesaria, ya que ninguna acción que ocurre en una pagina web se da de forma instantánea, y estas nos pueden ayudar a crear tiempos de espera mas agradables.
Una transicion sucede cuando existe un cambio en una o mas propiedades css asignadas a un selector, normalmente el cambio es de manera inmediata, pero mediante la propiedad Transition podremos personalizar como se visualizara. Transition define de manera resumida todas las propiedades que nos permitirán trabajar con una transición recibiendo como valor multiples valores separados por un espacio.
Los valores que podemos utilizar para personalizar nuestra transición son:
div {
width: 100px;
height: 100px;
background-color: red;
transition: 2s 500ms background-color ease-in;
/* transition: duracion retardo propiedad(es) aceleracion */
}
div:hover {
background-color: blue;
}
Aquí estamos definiendo un cuadrado de 100x100 pixeles, con un color de fondo rojo, el cual, va a cambiar en su estado :hover a azul. El cambio entre un color y otro durara 2 segundos y tendrá 500 milisegundos de retardo en su comienzo.
Para definir una transición también podemos usar directamente las sub-propiedades de Transition, las cuales son:
transition-duration: define el tiempo en segundos o ms que durara la transición cuando ocurra un cambio es las propiedades de la etiqueta al que el selector CSS hace referencia. Esta propiedad es la única que requerida para establecer una transición.
transition-duration: 2000ms ó 2s;
transition-delay: define un retardo en el comienzo de la transición cuando ocurra un cambio es las propiedades de la etiqueta al que el selector CSS hace referencia.
transition-delay: 1000ms ó 1s;
transition-property: define un listado de propiedades separado por coma que podrán ser afectadas por la transición si ocurre algún cambio en su valor. Por defecto todas las propiedades podrán reaccionar.
transition-duration: background-color, width, height;
transition-timing-function: define un tipo de aceleración en la transición, la cual, puede tener los siguientes valores:
Define una o varias transformaciones en un selector, las cuales, pueden ser su rotación en grados, el sesgado / inclinación en grados, la posición en X & Y y la escala / tamaño en base a porcentaje.
Para ROTAR un elemento podemos utilizar diferentes valores, los cuales, llevan dentro de paréntesis la medida en grados (0deg) positivos o negativos que se aplicaran:
transform: rotate(90deg);
transform: rotateX(90deg);
transform: rotateY(90deg);
transform: rotate3d(1,1,1,90deg);
Para SESGAR O INCLINAR un elemento utilizamos el valor skew(x, y), y dentro de sus paréntesis definimos la medida en grados positivos o negativos que se aplicaran para los ejes X & Y.
transform: skew(45deg, 45deg);
Para TRASLADAR o modificar la posición de un elemento podemos utilizar diferentes valores los siguientes valores, los cuales, llevan dentro de paréntesis la medida positiva o negativa que se aplicara:
transform: traslate(100px, 200px);
transform: traslateX(100px);
transform: traslateY(200px);
transform: traslateZ(400px);
transform: traslate3d(100px, 200px, 400px);
Para ESCALAR un elemento utilizamos el valor scale(x, y), y dentro de sus paréntesis definimos la medida o medidas en porcentaje para sus ejes por separados que sera escalado el elemento. Dichos valores se definen mediante un numero en el que 0 es 0%, 1 es 100% o tamaño normal y así en adelante.
transform: scale(2);
= transform: scale(2, 2);
La propiedad transform se ayuda de otras propiedades para lograr transformaciones aun mas personalizadas como son las siguientes:
transform-origin: define el eje o punto invisible sobre el que se va a mover una trasformación y se hace mediante 2 valores que hacen referencia a la posición X & Y. Por defecto este punto se ubica en el centro (50% 50%). transform-origin: 0% 0%;
En este ejemplo se define el punto de origen arriba a la izquierda.
Esta propiedad puede recibir algunos valores pre-definimos para facilitar su uso que son los siguientes: top, rigth, bottom, left, center, dichos valores pueden ser usados juntos o por separado. transform-origin: top left;
perspective: define un contexto 3D para un elemento, especificando la distancia a la que se encuentra el espectador. Esta propiedad nos permite trabajar con algunas transformaciones 3D. perspective: 100px;
En este ejemplo definimos una profundidad de 100px para el elemento.
perspective-origin: define el origen desde donde se verán los elementos en el viewport, es decir, la referencia de punto donde se encuentra el espectador y se hace mediante 2 valores que hacen referencia a la posición X & Y. Por defecto el origen esta en el centro (50% 50%). perspective-origin: 0% 0%;
En este ejemplo se define la posición del espectador arriba a la izquierda.
Esta propiedad puede recibir algunos valores pre-definimos para facilitar su uso que son los siguientes: top, rigth, bottom, left, center, dichos valores pueden ser usados juntos o por separado.
perspective-origin: top left;
Es una regla CSS que especifica el código de una animación. Las animaciones se crean cambiando gradualmente un conjunto de propiedades por otras de manera totalmente personalizada mediante sub-selectores definidos por porcentajes entre 0% y 100% dentro de los cuales se definen las propiedad que van a cambiar en forma de secuencial.
/* Sintaxis */
@keyframes nombre {
0%{ ... }
100%{ ... }
}
/* Ejemplo */
@keyframes animacionPersonalizada {
0%{
background-color: red;
width: 100px;
}
35%{
background-color: blue;
width: 200px;
}
70%{
background-color: red;
width: 300px;
}
100%{
background-color: blue;
width: 400px;
}
}
Aquí estamos definiendo un @keyframes / animación, la cual, de comienzo tendrá un color de fondo rojo que ira cambiando alternativamente por un color azul, a la vez, definimos un ancho inicial de 100px que ira incrementando gradualmente hasta llegar a 400px.
NOTA: si no definimos propiedades iniciales, es decir, en el 0%{...}, la animación hará el cambio tomando los valores que tengan las propiedades a cambiar en el selector asignado.
USO: Para asignar una animación a un selector utilizamos la propiedad Animation o sus sub-propiedades, en las cuales, debemos definir como mínimo el nombre de la animación y su tiempo de duración.
Nos permite definir en un selector de manera resumida todas las propiedades que nos permitirán trabajar con un @keyframes (animación) y se asignan mediante sus valores separados por un espacio.
Los valores que podemos utilizar para trabajar con un @keyframes (animación) son:
.cuadrado-animado {
width: 100px;
height: 100px;
background-color: red;
/* Valores requeridos */
animation: mi-animacion 2s;
/* Valores requeridos + opcionales */
animation: mi-animacion 2s 1s 5 alternate ease-out forwards;
}
@keyframes mi-animacion {
0% {
transform: scale(1);
}
100% {
transform: scale(1.5);
}
}
Aquí estamos definiendo un @keyframes, el cual, escalara gradualmente un 150% el tamaño del elemento al que el selector hace referencia. En el selector, es decir, la clase 'cuadrado-animado' definimos mediante la propiedad 'animation' el @keyframes (animación) que va a utilizar mediante el nombre (mi-animacion) y ademas le asignamos una duración de 2 segundos. Por otro lado podemos y hemos añadido valores opcionales definiendo un retardo de 1 segundo, se repetirá 5 veces, lo hará de manera alternativa, con una aceleración suave al final (ease-out) y sus propiedades al final seran con la escala de 150%
Para definir un @keyframes en un selector también podemos usar las sub-propiedades de Animation, las cuales son:
animation-name: define o hace referencia al nombre del @keyframes (animación) que deseamos utilizar.
animation-name: mi-animacion;
animation-duration: define el tiempo que durara el @keyframes y podemos utilizar un valor en segundos (s) o milisegundos (ms).
animation-duration: 2s;
animation-delay: define el tiempo de retardo para el comienzo de la animación y podemos utilizar un valor en segundos (s) o milisegundos (ms). El valor por defecto es 0.
animation-delay: 1s;
animation-iteration-count: define la cantidad de veces que se repetirá el @keyframes, (podemos utilizar infinite para que sea infinita). El valor por defecto es 1.
animation-iteration-count: 5;
animation-direction: define la dirección de la animación ya sea normal, es decir, del 0 al 100%, al revés (reverse) o alternativa (alternate). El valor por defecto es normal.
animation-direction: alternate;
animation-timing-function: define el tipo de aceleración que tendrá la animación, la cual, puede tener los siguientes valores:
animation-fill-mode: define las propiedades que mantendrá el objeto una vez que haya terminado la animación, ya sea la inicial (backwards) por defecto, la final (forwards) o ambas(both). El valor por defecto es backwards.
animation-fill-mode: forwards;
animation-play-state: define el estado de la animación, es decir, si se esta reproduciendo (running) o si esta en pausa (paused). El valor por defecto es running.
animation-play-state: running;
Avisa al navegador que propiedades de un selector pueden o van a cambiar, mejorando el rendimiento al evitar que el navegador vuelva a renderizar el objeto. Las propiedades se separan por coma.
will-change: width, height;
NOTA: Cabe mencionar que hay propiedades CSS como transform que ya están optimizadas y no necesitan del will-chance.
Es una imagen gigante que tiene dentro múltiples imágenes, las cuales son ideales para realizar animaciones vivas parecidas a un gif.
USO: Este es un ejemplo de un sprite, los cuales, podemos utilizar como background-image en un contenedor de dimensiones especificas según el ancho y alto del sprite, de modo que muestre solo 1 imagen. Luego mediante un @keyframes (animacion) y la propiedad background-position podemos mover secuencial-mente su posición en X o Y. Para completar el proceso le definimos el @keyframes al selector, asignando una aceleración (animation-timing-function) en etapas según las imágenes que tenga el sprite.
div.corazon {
width: 100px;
height: 100px;
background-image: url('https://luisvalladaresc.github.io/Animaciones-CSS/sprite/corazon.png');
animation: animacion-corazon 1s forwards;
animation-timing-function: steps(28);
}
/* ANIMACION DE CORAZON */
@keyframes animacion-corazon {
0% {
background-position: 0 0;
}
100% {
background-position-x: right;
}
}
Javascript al igual que CSS nos permite crear animaciones o @keyframes y asignarlas a un objeto HTML, ademas, nos permite interactuar dinamicante con ellas y cambiar sus propiedades durante la ejecución.
Define una animación para un objeto HTML a través de 2 valores. El Primero es un array de objetos que representa el @keyframes (animación) donde se definen las propiedades CSS a modificar (los valores se escriben entre comillas) y el Segundo es un objeto con sus opciones como la duración, la cual, es la única obligatoria.
const contenedor = document.getElementById("container");
const animacionContenedor = contenedor.animate([
{ width: "100px", opacity: 1}, // 0%
{ width: "150px", opacity: 1}, // 25%
{ width: "200px", opacity: 0}, // 50%
{ width: "150px", opacity: 1}, // 75%
{ width: "100px", opacity: 1}, // 100%
], {duration: 2000});
Aquí estamos definiendo una animación para el elemento con el id de container, el cual, aumentara su tamaño gradualmente de 100px a 200px y su visibilidad a 0 en su 50% y los restaura en su 100%.
NOTA: a la animaciones creadas con .animate() no podremos asignarle porcentajes personalizados, lo que hace este método es dividir el 100% entre los objetos definidos en el array, lo cual, de manera un poco mas compleja nos permite obtener el mismo resultado.
OPCIONES
MÉTODOS INTERNOS
Si guardamos la animación en una variable podremos acceder a sus métodos internos, los cuales nos ayudaran a manejar las animaciones dinamicamente. Entre las mas importantes podemos mencionar: