Icono del sitio Programando a medianoche

Como hacer la animación de linea dibujándose con un SVG


 
Cada día son mas utilizadas las imágenes en formato svg ya que ademas que son escalables sin perder calidad, son muy livianas por estar en formato vectorial, lo que hace que sea mas fácil la carga de tu sitio web.

Otra ventaja que traen los svg son las animaciones que podemos hacer utilizando css o jquery, logrando causar mayor impacto a las personas que visitan nuestra web.

En este articulo te enseñaremos a hacer la animación de linea dibujada utilizando Vivus.js una librería javascript que permite crear el efecto en tu svg como si las lineas de la imagen se estuvieran dibujando en ese mismo instante.

Que necesitaremos para empezar?
1- El archivo vivus.js que podrás conseguir en este link https://github.com/maxwellito/vivus
2- Una imagen svg que conste de lineas (stroke).

Comencemos:

Añadimos el archivo js en nuestro html, esta librería no tiene otra dependencia, lo único que tienes que hacer es incluir este script:

<script src="js/vivus.js"></script>

Buscamos el código html de nuestra imagen .svg, esto lo podemos hacer abriendo la imagen con algún editor de texto de nuestra preferencia, un ejemplo de como se vería:

Illustrator cuenta con una opción al exportar el svg que te permite pre visualizar el código del mismo:

Una vez tengamos nuestro código lo agregamos al html en el caso de este tutorial utilizaremos este:


<div class="container">
<svg width="600px" version="1.1" id="my-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1366 768" 
   style="enable/background:new 0 0 1366 768;" xml:space="preserve">
    <style type="text/css">
    	.st0{fill:none;stroke:#606060;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
    	.st1{fill:none;stroke:#BF0404;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
    </style>
    <g >
    	<g>
    	   <path class="st0" d="M266.9,159.8c0,0-9.3,4.4-9.3,14.6c0,11.1,0,9.3,0,101.5c0,0-4.8,41.5-65.5,41.5c-61.2,0-66-41.5-66-41.5
    	   s0-91.3,0-101.5s-9.3-14.6-9.3-14.6H266.9z"/>
    	   <polygon id="fill2" class="st1" points="195.8,282 195.8,262.4 232.2,269.9 220.5,258.4 246.3,238.7 237.3,233.9 247.1,218.1 227.5,221.3
    	   228.7,208.2 215,216.1 219.7,190.8 204.4,197.5 191.9,173 179.4,197.5 164.1,190.8 168.8,216.1 155.1,208.2 156.3,221.3
    	   136.7,218.1 146.5,233.9 137.5,238.7 163.3,258.4 151.6,269.9 188,262.4 188,282"/>
    	</g>
    </g>
</svg>
 </div>

Identificamos el svg con la id que queramos en este caso sera .
Ahora determinaremos la función jquery que necesitaremos para iniciar la animación.

  <script>
  var mysvg = new Vivus('my-svg', {duration: 200, type: 'delayed',}, function() {
   });
  </script>

El código css que utilizaremos en este caso va a ser:

.container {
    max-width: 500px;
    margin: 0 auto;
    padding: 10px;
    text-align: center;
}

svg {
    width: 400px;
}

 

El resultado visual de la animación sera:

 

En el ejemplo anterior utilizamos el tipo de animación (delayed) en la que cada de una de las lineas se retrasa en aparecer, lo que hace que las lineas de dibujen una detrás de la otra. Pero la librería trae otras posibles animaciones entre ellas:

SYNC

Cada linea se dibuja de manera sincronizada:

  <script>
  var mysvg = new Vivus('my-svg', {duration: 200, type: 'sync',}, function() {
   });
  </script>

 

ONE BY ONE

Las lineas se van dibujando una por una.

  <script>
  var mysvg = new Vivus('my-svg', {duration: 200, type: 'oneByone',}, function() {
   });
  </script>

 

ESTABLECIENDO LOS TIEMPOS DE LAS ANIMACIONES

Vivus.js también nos permite manipular la el tiempo tanto de las lineas como del svg en su totalidad. Funciona de manera muy parecida a las funciones de tiempos de animación de css, solo que en este caso en simple javascript, las animaciones disponibles son:

LINEAR

Para usar esta animación solo cambiamos la función a pathTimingFunction: Vivus.LINEAR

 

EASY

Cambiamos la función a pathTimingFunction: Vivus.EASY

 

EASY-IN

Cambiamos la función a pathTimingFunction: Vivus.EASY_IN

 

EASY-OUT

Cambiamos la función a pathTimingFunction: Vivus.EASY_OUT

 

EASY-OUT-BOUNCE

Cambiamos la función a pathTimingFunction: Vivus.EASY_OUT_BOUNCE

OTROS ATRIBUTOS

Podemos no solamente cambiar las animaciones desde el script, sino que podemos determinar los tiempos y funciones directamente en los path del svg.

El atributo data-ignore

Lo podemos utilizar para ignorar algunas de las lineas y que estas no posean ninguna animación colocando data-ignore="true":

<svg version="1.1" id="my-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 165.6 143" style="enable-background:new 0 0 165.6 143;" xml:space="preserve">
    <style type="text/css">
    	.st0{fill:none;stroke:#148793;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
    </style>
    <g>
    	<path class="st0" d="M62.8,84.2c0,0-14.2-0.6-19.4,13.6C39.7,108,1,141.8,1,141.8s37.9-31.7,49.6-33c11.7-1.3,18.3-8.4,19.1-17
    	C70.2,87.4,62.8,84.2,62.8,84.2z"/>
    	<path data-ignore="true" class="st0" d="M132.3,10.3c-17,9.1-30.2,22-30.2,22l-39.3,52l2.6,2.9l1.7,1.9l2.6,2.9l56.6-32.8c0,0,14.4-11.5,25.4-27.3
    		c-3.8-2.7-7.5-5.9-10.9-9.7C137.4,18.3,134.6,14.3,132.3,10.3z"/>
    	<path class="st0" d="M146.6,17c-2.9-3.2-5.4-6.6-7.5-10c-2.3,1-4.6,2.1-6.8,3.3c2.3,4,5.1,8,8.5,11.8c3.4,3.8,7.1,7,10.9,9.7
    		c1.4-2.1,2.8-4.2,4.1-6.4C152.7,23,149.5,20.2,146.6,17z"/>
    	<path class="st0" d="M155.8,25.5c4.5-7.5,7.7-15.7,8.2-23.9c-8.2-0.5-16.8,1.8-24.9,5.4c2.1,3.4,4.6,6.8,7.5,10
    		C149.5,20.2,152.7,23,155.8,25.5z"/>
    	<polyline class="st0" points="70.3,73.2 63.4,65.6 51.4,67.6 35.9,76.2 73,43.3 91.7,45.7 	"/>
    	<polyline class="st0" points="81.3,85.2 88.5,93.4 85.1,105 74.7,119.3 111.8,86.5 111.5,67.8 	"/>
    </g>
</svg>

SCENARIO

Podemos establecer valores y tiempos de animación directamente en los path del svg, lo cual es fácil de entender pero mas complicado de implementar, mientras mas complejo o mas lineas tenga el svg, va a traernos mas trabajo implementar estos atributos, debido a que tendríamos que indicar los tiempos de inicio y duración linea por linea identificando cada una en el código svg.

data-start-Nos permite determinar el tiempo de inicio de la animación.
data-duration-Nos permite determinar la duración de la animación.

<svg version="1.1" id="my-svg" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
	 viewBox="0 0 165.6 143" style="enable-background:new 0 0 165.6 143;" xml:space="preserve">
    <style type="text/css">
    	.st0{fill:none;stroke:#148793;stroke-width:3;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
    </style>
    <g>
    	<path data-start="0" data-duration="10"  class="st0" d="M62.8,84.2c0,0-14.2-0.6-19.4,13.6C39.7,108,1,141.8,1,141.8s37.9-31.7,49.6-33c11.7-1.3,18.3-8.4,19.1-17
    		C70.2,87.4,62.8,84.2,62.8,84.2z"/>
    	<path data-start="20" data-duration="10" class="st0" d="M132.3,10.3c-17,9.1-30.2,22-30.2,22l-39.3,52l2.6,2.9l1.7,1.9l2.6,2.9l56.6-32.8c0,0,14.4-11.5,25.4-27.3
    		c-3.8-2.7-7.5-5.9-10.9-9.7C137.4,18.3,134.6,14.3,132.3,10.3z"/>
    	<path data-start="20" data-duration="20" class="st0" d="M146.6,17c-2.9-3.2-5.4-6.6-7.5-10c-2.3,1-4.6,2.1-6.8,3.3c2.3,4,5.1,8,8.5,11.8c3.4,3.8,7.1,7,10.9,9.7
    		c1.4-2.1,2.8-4.2,4.1-6.4C152.7,23,149.5,20.2,146.6,17z"/>
    	<path data-start="0" data-duration="30" class="st0" d="M155.8,25.5c4.5-7.5,7.7-15.7,8.2-23.9c-8.2-0.5-16.8,1.8-24.9,5.4c2.1,3.4,4.6,6.8,7.5,10
    		C149.5,20.2,152.7,23,155.8,25.5z"/>
    	<polyline class="st0" points="70.3,73.2 63.4,65.6 51.4,67.6 35.9,76.2 73,43.3 91.7,45.7"/>
    	<polyline class="st0" points="81.3,85.2 88.5,93.4 85.1,105 74.7,119.3 111.8,86.5 111.5,67.8"/>
    </g>
</svg>

LISTADO DE OPCIONES

 

<script>
new Vivus('my-svg-id', {
    type: 'delayed',
    duration: 200,
    pathTimingFunction: Vivus.EASY-OUT-BOUNCE,
    animTimingFunction: Vivus.EASE,
}, myCallback);
</script>

MÉTODOS:

 

<script>
var myVivus = new Vivus('my-svg-id');
myVivus
  .stop()
  .reset()
  .play(2)
</script>

 

SOPORTE EN NAVEGADORES

Con los svg podemos no solamente realizar la animación de dibujado, sino que tenemos una serie de opciones adicionales para animar nuestro svg de distintas maneras, dándole movimiento a cada uno de los elementos que lo componen, algunas librerías que nos permiten animar svg son: snap.svg, BonsaiJS, SVG.js.

Salir de la versión móvil