Animaciones SVG con value

Archivado en: SMIL SVG

Por norma general cuando utilizo animate animateTransform="translate" suelo emplear from="" y to="", pero a la hora de que la animación se repita constantemente he encontrado un método que utiliza menos código y con el que la repetición de la animación no queda tan falsa, simplemente utilizo value="" en lugar de from="" y to="".

Como siempre las cosas se ven y explican mejor con un ejemplo práctico. Para este ejemplo he cogido una parte de una animación que hice en su día y que se llama City & Clock, esta disponible en CodePen.

En este ejemplo lo que buscamos es que las dos nubes recorran el escenario ad infinitum, para ello podemos utilizar from="" y to="", le indicamos con una primera animación que vaya desde la coordenada from="1" hasta to="200" y justo cuando esta termine que se inicie otra animación que vaya desde from="200" hasta to="-50", el código quedaría de la siguiente manera.

1
2
3
4
5
6
<animateTransform attributeName="transform" type="translate" from="1" to="200" begin="0s" dur="10s"/>
    <animateTransform attributeName="transform" type="translate" from="200" to="-50" begin="10s" dur="10s"/>
    <animateTransform attributeName="transform" type="translate" from="-50" to="200" begin="20s" dur="10s"/>
    <animateTransform attributeName="transform" type="translate" from="200" to="-50" begin="30s" dur="54s"/>
    <path id="unanube" fill="#FFFFFF" d="M782.4,209.7c-5.1,0-56.7,1.1-57.8,0c-30.9-13.2-7.5-39.9,6.4-35c3.5-22.1,27.5-13.8,29.3-2.6 c14.4-8.9,25,10.4,19.3,15.4C800.8,187.3,791,211.9,782.4,209.7z"/>
    <path id="segundanube" fill="#FFFFFF" d="M952.4,288.7c-5.1,0-56.7,1.1-57.8,0c-30.9-13.2-7.5-39.9,6.4-35c3.5-22.1,27.5-13.8,29.3-2.6 c14.4-8.9,25,10.4,19.3,15.4C970.8,266.3,961,290.9,952.4,288.7z"/>

Pero estos cuatro animateTransform que utilizamos para llevar a cabo la animación los podemos simplificar en uno solo, para ello utilizamos value="", dentro del atributo indicamos las coordenadas, primero la coordenada x y en segunda posición la coordenada y, se añade un punto y coma para separar las coordenadas y el código quedara de la siguiente manera values="0 0; 200 0; -50 0; 200 0; -50 0", la animación comienza en 0, avanza hasta 200, retrocede hasta -50, avanza hasta 200 y por último vuelve a retroceder hasta -50.

1
2
3
4
5
6
7
8
<animateTransform
    attributeName="transform"
    type="translate"
    values="0 0; 200 0; -50 0; 200 0; -50 0"
    begin="0s" dur="40s"
    repeatcount="2"/>
    <path id="unanube" fill="#FFFFFF" d="M782.4,209.7c-5.1,0-56.7,1.1-57.8,0c-30.9-13.2-7.5-39.9,6.4-35c3.5-22.1,27.5-13.8,29.3-2.6 c14.4-8.9,25,10.4,19.3,15.4C800.8,187.3,791,211.9,782.4,209.7z"/>
    <path id="segundanube" fill="#FFFFFF" d="M952.4,288.7c-5.1,0-56.7,1.1-57.8,0c-30.9-13.2-7.5-39.9,6.4-35c3.5-22.1,27.5-13.8,29.3-2.6 c14.4-8.9,25,10.4,19.3,15.4C970.8,266.3,961,290.9,952.4,288.7z"/>

Mucho mejor ¿no? además si queremos que esta animación sea infinita simplemente añadimos un repeatCount="indefinite" y las nubes estarán moviéndose hasta el infinito y mas allá.

También podemos dotar a la animación de mas velocidad con calcMode, keySpline y keyTimes.

SCALABLE, un libro sobre SVGA lo largo de 15 capítulos, 120 páginas y más de 70 ejemplos vamos a ver todo lo que podemos hacer con SVG. Tu pones el precio, disponible desde 0$ para descargar desde LeanPub(PDF, ePUB y MOBI).