> Manuales > Taller de CSS

Con la aparición de CSS3 se nos abren nuevas capacidades de programación en el ámbito de las animaciones HTML.

 
Las aprovecharemos en esta ocasión para un ámbito no siempre suficientemente explícito en nuestras codificaciones, la optimización del código, y más concretamente, mediante sprites animados.

Veremos cómo en esencia no precisaremos nada de JavaScript para ello; aunque sí lo usaremos como algo necesario para labores de control de las animaciones; por tanto minimizando al máximo su utilización.
Aún cabría un paso más en la optimización del código, algo que hemos tratado con anterioridad: la inclusión del sprite en forma de imagen embebida, pero eso es algo que dejamos para su posterior experimentación.

Respecto al manejo de sprites mediante CSS3, nos remitimos a nuestro anterior artículo HTML5 optimizado mediante CSS/CSS3. Sprites e imágenes embebidas.

En el presente artículo hablaremos de:

Utilizaremos un sprite en formato PNG de fondo transparente y ocho imágenes, tal como se muestra en la figura adjunta:

Animación de un sprite mediante CSS3

La especificación de las animaciones CSS3 en modo borrador en su estado actual, en su forma última, se puede consultar en la siguiente dirección de Internet del World Wide Web Consortium (W3C): w3.org/TR/css3-animations

Esencialmente deberemos tratar con una regla y una propiedad, que describimos seguidamente:

La regla @keyframes es el núcleo de la definición de la animación en CSS3. Dentro de ella se especificará el estilo que se aplicará a la evolución de la animación. Esta regla se asocia a una propiedad correspondiente, de lo contrario no tendrá efecto alguno. Dicha propiedad es la denominada "animation". (w3schools.com/css3/css3_animations.asp)

La propiedad animation, por su parte, define las propiedades que tendrá la animación en sí. En ella se pasan una serie de parámetros –valores. (w3schools.com/cssref/css3_pr_animation.asp).

Su sintaxis es, en la forma más completa:
animation: name duration timing-function delay iteration-count direction;

Valor
name Nombre del keyframe que contiene –define- la animación
duration Especifica el tiempo que tardará la animación en reproducirse
timing-function Normalmente indicará las etapas de la animación
delay Tiempo de retardo antes de que comience la animación
iteration-count Recuento del número de veces que se repetirá
direction Indica, de repetirse, si se realizará en reversión o en ciclos con reinicio

Los valores pueden definirse separadamente, por ejemplo:
animation-duration: 0.8

Soporte en los diversos navegadores

La animación de sprites mediante CSS3, tal cual las exponemos en el presente artículo, mediante código CSS3 con @keyframes y animation:

Ejemplo de animación de sprites mediante CSS3

El ejemplo que sigue ilustramos la animación del sprite mostrado en la imagen del inicio del artículo; el código se muestra en el Listado 1 y esencialmente consta de: Nótese que se hace para todos los casos a modo de ilustración, dado que algunos, como las versiones anteriores a Internet Explorer 10, por poner un ejemplo, no dan soporte a este tipo de animación CSS3, mientras que la 10 no precisa de código particular alguno.

Listado 1: Ejemplo de animación de sprites con CSS3

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>

<style>
@keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-ms-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-o-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-webkit-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-moz-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

.recorte {
width: 70px;
height: 112px;
background-image: url("cartero.png");
-ms-animation: cartero .8s steps(8, end) infinite;
-webkit-animation: cartero .8s steps(8, end) infinite;
-moz-animation: cartero .8s steps(8, end) infinite;
-o-animation: cartero .8s steps(8, end) infinite;
animation: cartero .8s steps(8, end) infinite;
}
</style>
</head>
<body>

<div class="recorte"></div>
</body>
</html>

Control de la animación mediante JavaScript

En el Listado 2 hemos incluido código JavaScript complementario, no para la animación en sí, sino para el control de la animación. Esto es, para la paralización y reanudación de la animación.

Lo añadido es muy simple, se trata de programar botones de comando que hagan uso de la función "stopAnimation" y "startAnimation", que modifiquen el estado del estilo de animación "animationPlayState": El código JavaScript se recoge en el breve listado inmediatamente debajo y sólo cabe resaltar:

<script>

function startAnimation() {
document.getElementById("recorte").style.animationPlayState = "running";
}

function stopAnimation() {
document.getElementById("recorte").style.animationPlayState = "paused";
}

</script>

Con todo, el Listado 2 nos muestra nuestro ejemplo final, listo para utilizarse con los distintos navegadores, con las mismas consideraciones que hemos realizado al respecto en el ejemplo inicial.

Listado 2: Ejemplo de animación de sprites con CSS3 y controles de ejecución programados en JavaScript

<!DOCTYPE html>

<html lang="en">
<head>
<meta charset="utf-8" />
<title></title>

<style>
@keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-ms-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-o-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-webkit-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

@-moz-keyframes cartero {
from {
background-position: 0px;
}

to {
background-position: -560px;
}
}

.recorte {
width: 70px;
height: 112px;
background-image: url("cartero.png");
-ms-animation: cartero .8s steps(8, end) infinite;
-webkit-animation: cartero .8s steps(8, end) infinite;
-moz-animation: cartero .8s steps(8, end) infinite;
-o-animation: cartero .8s steps(8, end) infinite;
animation: cartero .8s steps(8, end) infinite;
}
</style>

<script>

function startAnimation() {
document.getElementById("recorte").style.MsAnimationPlayState = "running";
document.getElementById("recorte").style.webkitAnimationPlayState = "running";
document.getElementById("recorte").style.MozAnimationPlayState = "running";
document.getElementById("recorte").style.OAnimationPlayState = "running";
document.getElementById("recorte").style.animationPlayState = "running";
}

function stopAnimation() {
document.getElementById("recorte").style.MsAnimationPlayState = "paused";
document.getElementById("recorte").style.webkitAnimationPlayState = "paused";
document.getElementById("recorte").style.MozAnimationPlayState = "paused";
document.getElementById("recorte").style.OAnimationPlayState = "paused";
document.getElementById("recorte").style.animationPlayState = "paused";
}

</script>

</head>
<body>
<div id="recorte" class="recorte"></div>
<button id="Pausar" name="Pausar" onclick="stopAnimation()">Pausar</button>
<button id="Animar" name="Animar" onclick="startAnimation()">Animar</button>
</body>
</html>

Conclusiones

A lo largo del presente artículo hemos expuesto el cómo programar una animación de sprites mediante CSS3 y cómo controlarla mediante algo de código JavaScript.

Hemos comprobado la simplicidad del código subyacente y una forma más de añadir animaciones a nuestras páginas web y además de forma optimizada. Tal como describíamos al comienzo, sólo nos quedaría un punto importante final, que dejamos a modo de ejercicio: insertar embebida la imagen en el archivo HTML, mediante "Base64", por ejemplo, tal como hicimos en el artículo cuya referencia hemos dado al comienzo.

Esperamos que todo lo expuesto les haya servido de ayuda. Hasta nuestro próximo artículo, felices horas de programación.

Jaime Peña Tresancos

Escritor. Colaborador habitual de revistas de tecnología y experto en nuevas tec...

Manual