Arte y Diseño

¿Cómo animar SVG y no morir en el intento?

Por Antonio Richaud, Publicado el 22 de Agosto de 2024

En el mundo del diseño web, los gráficos juegan un papel bien importante para hacer que las páginas sean visualmente atractivas y dinámicas. Entre las múltiples opciones disponibles para representar imágenes, el formato SVG (Scalable Vector Graphics o gráficos vectoriales escalables) ha ganado popularidad gracias a su capacidad para escalar sin perder calidad y su flexibilidad en términos de manipulación. Pero, ¿qué pasa cuando queremos ir más allá de mostrar una imagen estática? Es aquí donde entra la animación de SVG.

Animar SVG puede parecer una chambota, especialmente si estás acostumbrado a trabajar con gráficos más convencionales como PNG o JPG. Sin embargo, con las herramientas adecuadas y un enfoque pasito a pasito, es posible crear animaciones fluidas, decentes y ligeras que mejoren la interacción con el usuario y hagan que tu sitio destaque. En este artículo, vamos a explorar diversas formas de animar SVG, ya sea utilizando CSS, Javascript o librerías especializadas. Te guiaré desde los conceptos básicos hasta la implementación de animaciones complejas, todo sin morir en el intento ;)


¿Qué es un SVG?

Un archivo SVG, o Scalable Vector Graphics, es un formato de imagen basado en vectores. A diferencia de los formatos tradicionales como PNG, JPG o GIF, que están basados en píxeles, los gráficos SVG se describen a través de matemáticas utilizando una estructura XML. Esto significa que las imágenes SVG pueden escalarse infinitamente sin perder calidad, haciéndolas ideales para diseños web responsivos y gráficos que requieren detalles precisos, como logotipos e iconos.

Al ser un formato basado en texto, los SVG son fáciles de manipular mediante código. Se pueden modificar directamente en HTML, CSS o Javascript, lo que permite un control total sobre su apariencia y comportamiento. Esto es lo que los convierte en una opción poderosa para gráficos interactivos o animados. A continuación, te muestro un ejemplo básico de un archivo SVG:

<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
</svg>
                    

En este ejemplo, se define un círculo de color rojo con un borde negro de 3 píxeles de grosor. Los atributos como cx y cy definen la posición del círculo en el lienzo SVG, mientras que r determina su radio. Como puedes notar, el código SVG es muy similar al HTML, lo que facilita su integración en las páginas web.


Cómo funcionan los SVG

Los archivos SVG son esencialmente documentos XML que definen gráficos a través de nodos y atributos. Cada elemento gráfico dentro de un SVG es un nodo, y los atributos que lo acompañan especifican cómo se debe dibujar ese elemento. Al ser XML, estos archivos pueden ser creados y manipulados mediante HTML, CSS o Javascript, ofreciendo una flexibilidad tremenda para desarrollar gráficos interactivos.

Un archivo SVG puede contener varias formas geométricas como rectángulos, círculos, líneas, y también elementos más complejos como rutas (paths). Además, es posible agrupar elementos para aplicar transformaciones o estilos comunes. Aquí tienes un ejemplo de una carita feliz creada con SVG:

<svg width="200" height="200" xmlns="http://www.w3.org/2000/svg">
  <circle cx="100" cy="100" r="80" stroke="black" stroke-width="4" fill="yellow" />
  <circle cx="70" cy="80" r="10" fill="black" />
  <circle cx="130" cy="80" r="10" fill="black" />
  <path d="M 60 120 Q 100 160 140 120" stroke="black" stroke-width="4" fill="transparent" />
</svg>
                    

En este ejemplo, se utiliza un círculo amarillo con borde negro para representar la cabeza, dos pequeños círculos negros para los ojos, y una curva (definida por el elemento path) para la sonrisa. Este tipo de gráfico es sencillo de modificar y animar, como veremos más adelante.


¿Es posible animar un SVG?

¿Pues si no pa' qué ando haciendo este artículo? Obvio sí. Existen varias formas de hacerlo, dependiendo del nivel de control que necesites y la complejidad de la animación. Dos de las formas más comunes son mediante CSS y Javascript. Cada una ofrece sus propias ventajas dependiendo de lo que quieras lograr.

A continuación, veamos cómo puedes aplicar animaciones básicas a los SVG utilizando solo CSS. Este método es ideal para transiciones simples, como escalado, rotación o cambios de opacidad.

Animación con CSS

Para animar SVG con CSS, puedes utilizar las mismas propiedades de animación que aplicarías a otros elementos HTML. Aquí te muestro cómo animar la carita feliz para que rote de manera continua:

<style>
  .rotate {
    animation: rotar 4s linear infinite;
  }

  @keyframes rotar {
    from {
      transform: rotate(0deg);
    }
    to {
      transform: rotate(360deg);
    }
  }
</style>

<svg class="rotate" width="200" height="200" xmlns="http://www.w3.org/2000/svg">
  <circle cx="100" cy="100" r="80" stroke="black" stroke-width="4" fill="yellow" />
  <circle cx="70" cy="80" r="10" fill="black" />
  <circle cx="130" cy="80" r="10" fill="black" />
  <path d="M 60 120 Q 100 160 140 120" stroke="black" stroke-width="4" fill="transparent" />
</svg>
                    

En este ejemplo, utilizamos la propiedad transform junto con la animación CSS. La carita feliz rota 360 grados de manera continua. El código CSS aplica una animación de 4 segundos, con un movimiento lineal e infinito.


Animación con Javascript

Si buscas animaciones más complejas o interactivas, Javascript es la herramienta ideal, ya que te permite tener un control detallado sobre cada aspecto de la animación. Para facilitar esta tarea, existen librerías como GSAP o anime.js que permiten crear animaciones fluidas y personalizables de una forma sencilla. A continuación, te mostramos un ejemplo usando anime.js para darle un toque divertido a nuestra carita feliz: haremos que saque la lengua y luego la vuelva a meter.

<script src="https://cdnjs.cloudflare.com/ajax/libs/animejs/3.2.1/anime.min.js"></script>
<script>
  anime({
    targets: '#tongue',
    height: [0, 20], // La lengua se alarga de 0 a 20 unidades
    duration: 500, // Duración de la animación
    easing: 'easeInOutQuad', // Animación suave
    direction: 'alternate', // Vuelve a su posición original
    loop: true, // Repite indefinidamente
    delay: 500 // Espera 0.5 segundo antes de empezar
  });
</script>

<svg id="js-svg" width="200" height="200" xmlns="http://www.w3.org/2000/svg">
  <circle cx="100" cy="100" r="80" stroke="black" stroke-width="4" fill="yellow" />
  <circle class="eye" cx="70" cy="80" r="10" fill="black" />
  <circle class="eye" cx="130" cy="80" r="10" fill="black" />
  <path d="M 60 120 Q 100 160 140 120" stroke="black" stroke-width="4" fill="transparent" />
  <rect id="tongue" x="85" y="130" width="30" height="0" fill="red" rx="5" ry="5" />
</svg>
                    

En este ejemplo, usamos anime.js para crear una animación en la que la carita feliz saca la lengua de forma divertida. La animación alterna entre alargar y retraer la lengua en un bucle infinito, dándole un toque dinámico y simpático. Esta librería hace que crear animaciones interactivas en SVG sea sencillo y personalizable.


Otras herramientas para animar SVG

Además de CSS y Javascript, existe otra técnica llamada SMIL (Synchronized Multimedia Integration Language), que permite crear animaciones directamente dentro de los archivos SVG sin depender de estilos externos o scripts. SMIL es una tecnología que se integró en SVG para permitir la creación de animaciones usando atributos dentro del mismo código SVG.

¿Cómo funciona SMIL?

SMIL permite animar diferentes propiedades de los elementos SVG, como la posición, el tamaño, el color, y más, utilizando elementos propios como <animate>, <animateTransform>, entre otros. Aquí tienes un ejemplo sencillo de una animación con SMIL que hace que un círculo cambie de color:

<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
  <circle cx="50" cy="50" r="40" fill="blue">
    <animate attributeName="fill" values="blue;red;blue" dur="2s" repeatCount="indefinite" />
  </circle>
</svg>
                    

En este ejemplo, el color del círculo alterna entre azul y rojo de manera indefinida utilizando la etiqueta <animate>. SMIL permite añadir este tipo de animaciones sin depender de CSS o Javascript, directamente en el archivo SVG.

Comparación con CSS y Javascript

Aunque SMIL es una forma eficiente de animar SVG sin depender de hojas de estilo o scripts externos, su uso ha ido disminuyendo en favor de otras técnicas. Esto se debe a que algunos navegadores han limitado o discontinuado el soporte para SMIL, lo que hace que no sea la opción más fiable a largo plazo. Por otro lado, CSS y Javascript son técnicas más modernas y tienen mejor soporte en todos los navegadores.

A continuación, una breve comparación de las técnicas:

  • SMIL: Integrado directamente en el SVG, sin necesidad de CSS o JS, pero con soporte limitado en navegadores modernos.
  • CSS: Ideal para animaciones simples como transiciones, transformaciones y cambios de color. Es rápido y eficiente, con buen soporte en todos los navegadores.
  • Javascript (anime.js, GSAP): Excelente para animaciones más complejas e interactivas. Ofrece un control granular sobre cada aspecto de la animación, aunque requiere más código y depende de bibliotecas externas.

En resumen, aunque SMIL sigue siendo una opción para animar SVG, CSS y Javascript han tomado la delantera debido a su mayor flexibilidad y compatibilidad en navegadores modernos. Sin embargo, si tu proyecto requiere una animación rápida y sencilla sin dependencias externas, SMIL puede ser una opción interesante.


Conclusión

Las animaciones SVG ofrecen un equilibrio perfecto entre rendimiento, flexibilidad y control, lo que las convierte en una herramienta esencial en el desarrollo web moderno. Como hemos explorado en este artículo, puedes empezar con animaciones sencillas utilizando CSS para efectos rápidos y eficientes, mientras que Javascript, a través de librerías como anime.js o GSAP, te permite llevar tus animaciones a otro nivel con transiciones más complejas e interacciones personalizadas.

Aunque SMIL ofrece una manera simple de animar SVG directamente en el archivo, su futuro en el ecosistema web es incierto debido a la falta de soporte en algunos navegadores. Por ello, optar por CSS y Javascript no solo garantiza compatibilidad a largo plazo, sino que también permite integrar las animaciones dentro de flujos de trabajo y plataformas más avanzadas.

Un enfoque eficaz para las animaciones SVG implica equilibrar la estética con el rendimiento. Mientras que las animaciones pueden mejorar significativamente la experiencia de usuario, es importante optimizarlas para evitar que afecten la velocidad de carga de tu sitio. Minimizar el uso de Javascript cuando sea posible y aprovechar las capacidades nativas de CSS es una buena práctica que garantiza tiempos de carga rápidos y una interfaz fluida.

En resumen, animar SVG no solo es posible, sino que es una excelente manera de dar vida a tus gráficos manteniendo un alto nivel de rendimiento. Elige las herramientas que mejor se adapten a la complejidad de tu proyecto, y no dudes en explorar nuevas técnicas que hagan que tu contenido visual destaque. ¡No temas experimentar y encontrar el equilibrio adecuado para tus proyectos!


Recursos adicionales

Antonio Richaud

Soy un Data Scientist con experiencia en machine learning, deep learning y análisis financiero. Transformo grandes volúmenes de datos en insights y desarrollo soluciones que integran análisis avanzado con programación.