Twitter Facebook Google + RSS Feed

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

0
DiseñoJavaScript

jueves, 08 de marzo de 2018 a las 12:07hs por Valentina Echezuria

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.

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

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:

  <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0A%20%20var%20mysvg%20%3D%20new%20Vivus('my-svg'%2C%20%7Bduration%3A%20200%2C%20type%3A%20'sync'%2C%7D%2C%20function()%20%7B%0A%20%20%20%7D)%3B%0A%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />

 

ONE BY ONE

Las lineas se van dibujando una por una.

  <img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0A%20%20var%20mysvg%20%3D%20new%20Vivus('my-svg'%2C%20%7Bduration%3A%20200%2C%20type%3A%20'oneByone'%2C%7D%2C%20function()%20%7B%0A%20%20%20%7D)%3B%0A%20%20%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />

 

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">
    
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%20%20%20%20%09.st0%7Bfill%3Anone%3Bstroke%3A%23148793%3Bstroke-width%3A3%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3Bstroke-miterlimit%3A10%3B%7D%0A%20%20%20%20%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;style&gt;" title="&lt;style&gt;" />

    <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">
    
<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cstyle%20type%3D%22text%2Fcss%22%3E%0A%20%20%20%20%09.st0%7Bfill%3Anone%3Bstroke%3A%23148793%3Bstroke-width%3A3%3Bstroke-linecap%3Around%3Bstroke-linejoin%3Around%3Bstroke-miterlimit%3A10%3B%7D%0A%20%20%20%20%3C%2Fstyle%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;style&gt;" title="&lt;style&gt;" />

    <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

  • type Con esto definimos el tipo de animación que tendrá el svg: delayed, sync, oneByOne.
  • star Definimos el inicio de la animación (inViewport una vez el svg se encuentra en el área de visualización de la pantalla, manual da la libertad de determinar el método de inicio, autostart para iniciar la animación instantaneamente).Por defecto inicia en inViewport.
  • duration Establece la duración de la animación en frames (Por defecto: 200)
  • pathTimingFunction Para establecer el tiempo de animación de cada linea (path) del svg.
  • animTimingFunction Para establecer el tiempo de animación del svg completo.
  • selfDestroy Para eliminar los estilos adicionales del svg dejándolo como estaba originalmente.

 

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0Anew%20Vivus('my-svg-id'%2C%20%7B%0A%20%20%20%20type%3A%20'delayed'%2C%0A%20%20%20%20duration%3A%20200%2C%0A%20%20%20%20pathTimingFunction%3A%20Vivus.EASY-OUT-BOUNCE%2C%0A%20%20%20%20animTimingFunction%3A%20Vivus.EASE%2C%0A%7D%2C%20myCallback)%3B%0A%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />

MÉTODOS:

  • play(speed, callback) Comienza la animación con la velocidad dada en este parámetro. Este valor puede ser negativo para ir de atrás para adelante, entre 0 y 1 para cargar lentamente, >1 para ir mas rápido, o <0 para ir en reversa de su estado actual. (Por defecto: 1). Callback se ejecuta luego que la animación ha terminado (opcional)
  • stop() Para terminar a animación.
  • reset() Recargar la animación desde su anterior estado (sin dibujar).
  • finish() Dispone el svg en su estado final (dibujado).
  • setFrameProgress(progress) Determina el progreso de la animación debe establecerse en valores entre 0 y 1.
  • getStatus() Toma el estatutos de la animación entre: start, progress, end

 

<img src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" data-wp-preserve="%3Cscript%3E%0Avar%20myVivus%20%3D%20new%20Vivus('my-svg-id')%3B%0AmyVivus%0A%20%20.stop()%0A%20%20.reset()%0A%20%20.play(2)%0A%3C%2Fscript%3E" data-mce-resize="false" data-mce-placeholder="1" class="mce-object" width="20" height="20" alt="&lt;script&gt;" title="&lt;script&gt;" />

 

SOPORTE EN NAVEGADORES

  • En Internet Explores algunos svg no funcionan en su totalidad.
  • En Firefox se pueden manifestar errores dependiendo del svg o de la versión del navegador.

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.

0 comentarios »

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Buscar