07/06/2018Artículo original
Puede que ahora parezca una perogrullada, pero una de las características que contribuyó a la popularización de la web y de HTML (junto a los enlaces de hipertexto) fue la posibilidad de insertar imágenes, mapas de bits donde reinaban los gif y los jpg por su relación calidad/peso y que se usaban en función de las características de cada imagen.
Pero pronto apareció la necesidad de buscar un formato estándar vectorial, así que, en 1998 se empezó a buscar una solución y finalmente nació SVG (Scalable Vector Graphics), que se convirtió en recomendación en 2001, aunque actualmente va por su segunda versión de la recomendación 1.1 (del 2011) y la recomendación definitiva de SVG2 cada día está más cerca.
Al principio le costó un poco abrirse paso por la competencia de la tecnología Flash (que estaba muy extendida) y porque el soporte de SVG en los navegadores era irregular, como en otros muchos estándares en la época. Pero hoy por hoy es un arma de primer nivel para cualquier desarrollador frontend.
La principal ventaja de SVG es que se trata de imágenes vectoriales que se definen a través de XML. O sea, que se verán bien independientemente del tamaño y resolución a las que se muestren, y que se pueden definir y/o alterar a través de código usando el DOM. Por ejemplo, puedes modificarle el color o animarla a través de CSS o JavaScript.
¿Cómo crear imágenes SVG?
En realidad, SVG es más que un simple tipo de imagen más, es todo un sistema de representación gráfica que tiene su propia especificación y cuyo verdadero alcance y potencia se irá viendo en los próximos años. Dado que esto escapa al alcance de este post, lo dejaremos simplemente como un tipo de imágenes vectoriales que se pueden crear con código XML de una forma sencilla. La verdad es que es muy agradecido, al menos dibujando formas simples.
Como muestra, un cuadrado con un borde naranja de 10px se escribiría así:
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" viewBox="0 0 150 150"> <rect x="0" y="0" width="150" height="150" fill="#ffffff" stroke="#ff9900" stroke-width="10"></rect></svg>
Y se vería así:
Fíjate en el parámetro viewbox, ya que actúa como una ventana que muestra el rectángulo y, si es más pequeño que el rectángulo, enmascarará a este. A su vez, hay que delimitar el tamaño del SVG (el lienzo sobre el que se dibujará el rectángulo, que tiene su propio viewport y, por defecto, crece hasta el infinito) y el tamaño del elemento que se dibuja. Estos conceptos se explican muy bien aquí, y créeme, te recomiendo que los tengas bien claros antes de ponerte a jugar con SVG.
Quizá SVG te recuerde un poco al funcionamiento del elemento canvas (en inglés, canvas significa lienzo), solo que canvas permite actuar a nivel de pixel, necesita JavaScript y no es accesible a través del DOM, lo que lo hace un poquito más rápido y con más posibilidades. En cambio, a favor de SVG, al ser accesible a través del DOM, es accesible para los lectores de pantalla y es más fácil añadirle interactividad.
Ahora bien, si lo que quieres es crear imágenes complejas, lo más práctico es que uses un software de dibujo vectorial. El buque insignia hoy por hoy de este tipo de software es Adobe Illustrator, pero también puedes crear SVGs con software más asequible como Sketch (en el momento de escribir esto solo para Mac) o incluso gratuito y open source, como Inkscape.
Es más, hay soluciones online gratuitas que te pueden sacar de un apuro sin necesidad de instalar nada, como Vectr y http://editor.method.ac/
¿Cómo insertamos SVG?
Tenemos varias formas de usar una imagen SVG en nuestras páginas
Directamente en el código HTML5
Este método es el que acabamos de ver en nuestro ejemplo. Está bien para imágenes sencillas y que quieres manipular con CSS o JavaScript. Si lo usas con una imagen muy compleja te puede ensuciar y/o sobrecargar el código de la web.
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" viewBox="0 0 150 150"> <rect x="0" y="0" width="150" height="150" fill="#ffffff" stroke="#ff9900" stroke-width="10"></rect></svg>
Con una etiqueta <object>
Si tomas el código del ejemplo anterior en un bloc de notas, y lo guardas con extensión .svg lo podrás insertar con la etiqueta