Advertisement
  1. Web Design
  2. HTML/CSS
  3. Animation

Introducción a la animación CSS para principiantes

Scroll to top
Read Time: 9 min

() translation by (you can also view the original English article)

Hoy en día, cada vez más sitios web utilizan animaciones, ya sea en forma de GIFs, SVGs, WebGL, vídeos de fondo, etc. Cuando se usa correctamente, la animación en la web aporta vida e interactividad, añadiendo una capa extra de retroalimentación y experiencia para los usuarios.

En este tutorial voy a iniciarte a las animaciones CSS; una forma de hacer las cosas que tiene un excelente rendimiento y que está siendo cada vez más popular conforme mejora el soporte de los navegadores. Después de haber cubierto los conceptos básicos, vamos a construir un rápido ejemplo que animará un elemento cuadrado hasta convertirlo en un círculo:

Una introducción a los @keyframes y la animación

El componente principal de las animaciones CSS es @keyframes, se trata de la regla CSS en donde se crea la animación. Concibe @keyframes como las etapas a lo largo de una línea de tiempo. Dentro de @keyframes, puedes definir estas etapas, cada una con una declaración de estilo diferente.

A continuación, para que las animaciones CSS funcionen, debes enlazar los @keyframes a un selector. Esto analizará gradualmente todo el código dentro de las declaraciones @keyframes y hará los cambios desde el estilo inicial al nuevo, en función de las etapas.

El @keyframes

Aquí vamos a establecer las etapas de la animación. Nuestras propiedades @keyframes son las siguientes:

  • Un nombre de nuestra elección (tutsFade en este caso).
  • Etapas: 0%-100%; de (igual a 0%) y a (igual al 100%).
  • Estilos CSS: el estilo que te gustaría aplicar a cada etapa.

Por ejemplo:

1
@keyframes tutsFade {
2
  0% {
3
    opacity: 1;
4
  }
5
  100% {
6
    opacity: 0;
7
  }
8
}

O:

1
@keyframes tutsFade {
2
  from {
3
    opacity: 1;
4
  }
5
  to {
6
    opacity: 0;
7
  }
8
}

o la abreviatura:

1
@keyframes tutsFade {
2
  to {
3
    opacity: 0;
4
  }
5
}

El código anterior aplicará una transición en la opacidad de un elemento, de opacity: 1 a opacity: 0. Cada uno de los enfoques anteriores logrará el mismo resultado final.

La animación

La propiedad animation se utiliza para llamar a @keyframes dentro de un selector CSS. La animación puede tener varias propiedades:

  • animation-name: nombre para @keyframes (recuerda que elegimos tutsFade).
  • animation-duration: la duración temporal, la duración total de la animación desde el principio hasta el final.
  • animation-timing-function: establece la aceleración de la animación (lineal | ease | ease-in | ease-out | ease-in-out | cubic-bezier ).
  • animation-delay: el retraso antes de que se inicie nuestra animación.
  • animation-iteration-count: cuántas veces se repetirá la animación.
  • animation-direction: te proporciona la capacidad de cambiar la dirección del bucle, de principio a fin, o de fin a principio, o ambos.
  • animation-fill-mode: especifica qué estilos se aplicarán al elemento cuando finalice nuestra animación ( none | forwards | backwards | both)

Por ejemplo:

1
.element {
2
  animation-name: tutsFade;
3
  animation-duration: 4s;
4
  animation-delay: 1s;
5
  animation-iteration-count: infinite;
6
  animation-timing-function: linear;
7
  animation-direction: alternate;
8
}

o abreviado:

1
.element {
2
  animation: tutsFade 4s 1s infinite linear alternate;
3
}

El código anterior creará un efecto parpadeante, con un retardo de animación de 1 segundo, una duración total de la animación de 4 segundos, con direcciones alternativas e iteraciones de bucle lineal infinito.

Añadir prefijos de proveedor

Aunque estamos con un borrador de trabajo, necesitamos utilizar prefijos específicos de navegador para garantizar la compatibilidad óptima con los navegadores. Se aplican los prefijos estándar:

  • Chrome & Safari: -webkit-
  • Firefox: -moz-
  • Opera: -o-
  • Internet Explorer: -ms-

Una propiedad animation con prefijos de proveedor tendrá el siguiente aspecto:

1
.element {
2
    -webkit-animation: tutsFade 4s 1s infinite linear alternate;
3
    -moz-animation: tutsFade 4s 1s infinite linear alternate;
4
    -ms-animation: tutsFade 4s 1s infinite linear alternate;
5
    -o-animation: tutsFade 4s 1s infinite linear alternate;
6
    animation: tutsFade 4s 1s infinite linear alternate;
7
}

junto con @keyframes:

1
@-webkit-keyframes tutsFade { /* your style */ }
2
@-moz-keyframes tutsFade { /* your style */ }
3
@-ms-keyframes tutsFade { /* your style */ }
4
@-o-keyframes tutsFade { /* your style */ }
5
@keyframes tutsFade { /* your style */ }

En aras de la legibilidad durante continuaré este tutorial sin usar prefijos, pero la versión final los incluirá y te animo a que tú también los uses en tu código CSS.

Para obtener más información sobre los prefijos de proveedor, puedes consultar http://css3please.com/, un excelente sitio web con los recursos de prefijos de proveedor.

Animaciones múltiples

Puedes agregar varias animaciones usando una coma como separador. Imagina que queremos agregar una rotación adicional a nuestro elemento tutsFade, lo haríamos declarando @keyframes adicionales y luego los vincularíamos con nuestro elemento:

1
.element {
2
  animation: tutsFade 4s 1s infinite linear alternate,
3
             tutsRotate 4s 1s infinite linear alternate;
4
}
5
@keyframes tutsFade {
6
  to {
7
    opacity: 0;
8
  }
9
}
10
@keyframes tutsRotate {
11
  to {
12
    transform: rotate(180deg);
13
  }
14
}

Tutorial de cuadrado a círculo

Vamos a dar un salto y crear una transición de forma simple; una animación desde una forma cuadrada a una circular utilizando los anteriores principios. Tendremos cinco etapas en total y para cada etapa definiremos un radio de borde, una rotación y un color de fondo diferente para nuestro elemento. Basta de hablar, vamos con el código.

Elemento básico

En primer lugar, vamos a crear el marcado del elemento a animar. Ni siquiera vamos a molestarnos con los nombres de las clases, por ahora, sólo vamos a usar un simple div:

1
<div></div>

Después, usando un selector de elemento (div {}), añadimos los estilos al div:

1
div {
2
  width: 200px;
3
  height: 200px;
4
  background-color: coral; 
5
}

Declarar los fotogramas clave

Vamos a preparar ahora el @keyframes, al que vamos a llamar square-to-circle, y las cinco etapas

1
@keyframes square-to-circle {
2
  0%{}
3
  25%{}
4
  50%{}
5
  75%{}
6
  100%{}
7
}

Necesitamos definir algunos estilos dentro de estas etapas, así que comencemos indicando el border-radius para cada una de las esquinas del cuadrado:

1
@-webkit-keyframes square-to-circle {
2
  0%  {
3
    border-radius:0 0 0 0;
4
  }
5
  25%  {
6
    border-radius:50% 0 0 0;
7
  }
8
  50%  {
9
    border-radius:50% 50% 0 0;
10
  }
11
  75%  {
12
    border-radius:50% 50% 50% 0;
13
  }
14
  100% {
15
    border-radius:50%;
16
  }
17
}

Además podemos declarar un background-color distinto para cada etapa.

1
@keyframes square-to-circle {
2
  0%  {
3
    border-radius:0 0 0 0;
4
    background:coral; 
5
  }
6
  25%  {
7
    border-radius:50% 0 0 0;
8
    background:darksalmon; 
9
  }
10
  50%  {
11
    border-radius:50% 50% 0 0;
12
    background:indianred;
13
  }
14
  75%  { 
15
    border-radius:50% 50% 50% 0;
16
    background:lightcoral;
17
  }
18
  100% {  
19
    border-radius:50%;
20
    background:darksalmon;
21
  }
22
}

Para llevar a cabo realmente la idea, vayamos más allá de border-radius y de background-color girando el div y añadiendo un poco de interés visual.

1
@keyframes square-to-circle {
2
  0%  {
3
    border-radius:0 0 0 0;
4
    background:coral;
5
    transform:rotate(0deg);
6
  }
7
  25%  {
8
    border-radius:50% 0 0 0;
9
    background:darksalmon;
10
    transform:rotate(45deg);
11
  }
12
  50%  {
13
    border-radius:50% 50% 0 0;
14
    background:indianred;
15
    transform:rotate(90deg);
16
  }
17
  75%  { 
18
    border-radius:50% 50% 50% 0;
19
    background:lightcoral;
20
    transform:rotate(135deg);
21
  }
22
  100% {  
23
    border-radius:50%;
24
    background:darksalmon;
25
    transform:rotate(180deg);
26
  }
27
}

Aplicar la animación

Después de haber definido nuestra animación de cuadrado a círculo, tenemos que aplicarla al div:

1
div {
2
  width: 200px;
3
  height: 200px;
4
  background-color: coral;
5
  animation: square-to-circle 2s 1s infinite alternate;  
6
}

Aquí puedes ver que hemos añadido una propiedad animation abreviada, que indica:

  • El nombre-animación es square-to-circle.
  • La duración de la animación es 2s.
  • El retardo de la animación es 1s.
  • El recuento de animación-iteración es infinite, por lo que continuará indefinidamente.
  • Y la dirección de animación es alternate, por lo que se reproducirá de principio a fin, y después comenzará de nuevo desde el principio hasta el final, y así sucesivamente.

Usa la genial función de temporizador

Un último valor que podemos añadir a la propiedad animation es animation-timing-function. Esto definirá la velocidad, la aceleración y la desaceleración de nuestro movimiento. Esta función puede ser un valor muy detallado, algo incómodo de calcular manualmente, pero hay gran cantidad de sitios web gratuitos que proporcionan recursos y personalización en tiempo real para las funciones de sincronización de animación.

Una de estas herramientas es la herramienta CSS Easing Animation Tool, así que vamos a usar la función de cálculo de nuestra función de sincronización.

Me gustaría añadir un efecto elástico a nuestra animación square-to-circle, utilizando una función de bezier cúbico.

Después de haber jugado con los identificadores y generado algún tipo de curva de bezier, actualiza el valor de la función de temporizador de animación utilizando el fragmento proporcionado.

1
div {
2
  width: 200px;
3
  height: 200px;
4
  background-color: coral;
5
  animation: square-to-circle 2s 1s infinite cubic-bezier(1,.015,.295,1.225) alternate;  
6
}

El código final, sin utilizar prefijos de proveedor ( -webkit- , -moz-, -ms-, -o- ) es el siguiente:

1
div {
2
  width: 200px;
3
  height: 200px;
4
  background-color: coral;
5
  animation: square-to-circle 2s .5s infinite cubic-bezier(1,.015,.295,1.225) alternate;
6
}
7
8
@keyframes square-to-circle {
9
  0%  {
10
    border-radius:0 0 0 0;
11
    background:coral;
12
    transform:rotate(0deg);
13
  }
14
  25%  {
15
    border-radius:50% 0 0 0;
16
    background:darksalmon;
17
    transform:rotate(45deg);
18
  }
19
  50%  {
20
    border-radius:50% 50% 0 0;
21
    background:indianred;
22
    transform:rotate(90deg);
23
  }
24
  75%  { 
25
    border-radius:50% 50% 50% 0;
26
    background:lightcoral;
27
    transform:rotate(135deg);
28
  }
29
  100% {  
30
    border-radius:50%;
31
    background:darksalmon;
32
    transform:rotate(180deg);
33
  }
34
}

Una última cosa

Todo funciona bien en los navegadores modernos, pero Firefox tiene la desagradable costumbre de hacer que los objetos se transformen de forma deficiente. Echa un vistazo a estos bordes irregulares para ver lo que quiero decir:

Por suerte, existe una solución a esto. Añade el siguiente borde transparente a tu div y Firefox renderizará las cosas perfectamente!

1
outline: 1px solid transparent;

Conclusión

¡Eso es todo! Hemos utilizado la sintaxis de animación CSS para crear una animación simple que se repite de forma continuada.

Soporte del navegador

Para obtener información actualizada sobre la compatibilidad de los navegadores con la animación CSS, echa un vistazo a Can I use… pero en pocas palabras, los navegadores compatibles incluyen: Firefox 5+, IE 10+, Chrome, Safari 4+, Opera 12+

Recursos:

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.