En algunas situaciones, puede ser que utilicemos múltiples animaciones pero estemos buscando cambiar la forma en la que se «mezclan» las animaciones, para poder reutilizarlas y no tener que volver a crear una animación nueva. En ese caso, lo que nos interesa es hacer Composición de animaciones.
La propiedad animation-composition
Mediante la propiedad animation-composition, en un elemento que contiene múltiples animaciones separadas por coma, podemos indicarle al navegador como se van a aplicar dichas animaciones por parte del navegador.
Para ello, utilizaremos la propiedad CSS animation-composition, que puede tomar los valores replace (por defecto), add o accumulate. Estos valores tienen la siguiente funcionalidad:
| Valor | Descripción |
|---|---|
replace | Las últimas animaciones sobreescriben a las anteriores. Valor por defecto. |
add | Las animaciones se combinan con las animaciones anteriores. |
accumulate | Similar a add, pero acumula animaciones y se usan como punto de partida para la siguiente. |
Ejemplo inicial (con replace)
Pero para ver esto más claro, lo mejor es aplicar un ejemplo y entender su funcionamiento. Observa el siguiente fragmento de código. En él encontrarás un cuadrado con las siguientes características:
- Inicialmente, su color es gris
- La animación
movese repite cada3sdesde el segundo0de la animación. - La animación
rotatese repite cada3sdesde el segundo3de la animación. - Es decir, desde la segunda iteración, ambas animaciones coinciden.
- Observa que cada animación tiene un color diferente.
.element {
width: 100px;
height: 100px;
background: grey;
animation:
move 3s infinite 0s,
rotate 3s infinite 3s;
}
@keyframes move {
to {
transform: translateX(500px);
background: red;
}
}
@keyframes rotate {
to {
transform: rotate(360deg) scale(0.5);
background: indigo;
}
}
<div class="element"></div>
Ahora, analicemos las animaciones:
- La animación
movetraslada el elemento500pxa la derecha y cambia a rojo. - A partir de la segunda iteración, comienza a aplicarse también la animación
rotate. - Aunque en cada iteración, comienza en gris y va cambiando a rojo, la animación
rotateva reemplazando la animación.
Ejemplo completo
Ahora observemos como se comporta según el valor que apliquemos de animation-composition. Nos centraremos en las iteraciones finales donde se aplican tanto move como rotate:
Con el valor
replacela animación comienza trasladándose como dictamove, pero a mitad de cambio es reemplazada porrotate. Observa que se aprecia ligeramente el cambio a rojo que termina modificandose por lila.Con el valor
addnotamos que los colores se mezclan (gris + rojo + lila) y no se reemplazan. Por otro lado, en este caso las animaciones se han sumado, el trayecto detranslateX()se hace completo, al igual que elrotate()y elscale().Con el valor
accumulatepasa igual con los colores, sin embargo, con las animaciones en este caso no se aplica la rotación, ya que en la primera animación no existerotate().
Ten en cuenta que en el caso de
translate()yscale(), los valores iniciales aunque no están indicados se infieren por parte del navegador, ya que un elemento sin trasladar es equivalente atranslate(0, 0)y un elemento sin escalar es equivalente ascale(1). No ocurre lo mismo con la rotaciónrotate().
En el caso de querer aplicar composiciones diferentes por cada animación, separaremos por coma, como solemos hacer habitualmente.
