El elemento symbol para los SVG en HTML

01-06-2015 - Andrés Cruz

In english

Ver ejemplo Descargar

En esta entrada veremos un elemento muy útil para trabajar con los SVG que es el elemento <symbol>; este elemento ahorra mucho trabajo y permite agrupar series de figuras básicas para pintarlos empleando el elemento <use>.

El elemento <symbol> y <use> en los SVG

Tomando nuestro logo de Android el cual armamos en una entrada anterior Construyendo nuestro propio logo Android con SVG en HTML, se definimos (o mejor dicho, las figuras que componen el logo de Android) dentro del elemento <symbol> y luego simplemente se pinta el logo con el elemento <use>; primero recordemos el HTML de nuestro logo Android SVG/HTML:

<svg>
<!--cabeza-->
  <ellipse cx="170" cy="100" rx="50" ry="45"></ellipse>
	Su navegador no soporta SVG :/s

  <!--antena izquierdo-->
  <rect x="197" y="0" width="4" height="30" rx="3" ry="3" id="antena1"></rect>
	Su navegador no soporta SVG :/

  <!--antena derecho-->
  <rect x="124" y="77" width="4" height="30" rx="3" ry="3" id="antena2"></rect>
	Su navegador no soporta SVG :/

  <!--ojos-->
  <circle cx="150" cy="80" r="7"></circle>
	Su navegador no soporta SVG :/
  <circle cx="190" cy="80" r="7"></circle>
	Su navegador no soporta SVG :/

  <!--pierna izquierdo-->
  <rect x="140" y="190" width="20" height="60" rx="15" ry="15" id="c"></rect>
	Su navegador no soporta SVG :/
  <!--pierna derecho-->
  <rect x="180" y="190" width="20" height="60" rx="15" ry="15" id="c"></rect>
	Su navegador no soporta SVG :/

  <!--brazo izquierdo-->
  <rect x="90" y="100" width="20" height="100" rx="15" ry="15" id="c"></rect>
	Su navegador no soporta SVG :/

  <!--torzo-->
  <rect x="120" y="90" width="100" height="120" rx="15" ry="15" id="c"></rect>
	Su navegador no soporta SVG :/
  <!--brazo derecho-->
  <rect x="230" y="100" width="20" height="100" rx="15" ry="15" id="c"></rect>
	Su navegador no soporta SVG :/

  <rect x="115" y="100" width="110" height="10" id="b"></rect>
	Su navegador no soporta SVG :/
</svg>

Agrupando las figuras del logo con el elemento <symbol>

Ahora veamos cómo agrupar todos las primitivas que conforman nuestro logo de Android con el elemento <symbol>:

    <symbol id= "android" viewBox= "0 0 500 500">
        <!--cabeza-->
        <ellipse cx="170" cy="100" rx="50" ry="45"></ellipse>
        Su navegador no soporta SVG :/s

        <!--antena izquierdo-->
        <rect x="197" y="0" width="4" height="30" rx="3" ry="3" id="antena1"></rect>
        Su navegador no soporta SVG :/

        <!--antena derecho-->
        <rect x="124" y="77" width="4" height="30" rx="3" ry="3" id="antena2"></rect>
        Su navegador no soporta SVG :/

        <!--ojos-->
        <circle cx="150" cy="80" r="7"></circle>
        Su navegador no soporta SVG :/
        <circle cx="190" cy="80" r="7"></circle>
        Su navegador no soporta SVG :/

        <!--pierna izquierdo-->
        <rect x="140" y="190" width="20" height="60" rx="15" ry="15" id="c"></rect>
        Su navegador no soporta SVG :/
        <!--pierna derecho-->
        <rect x="180" y="190" width="20" height="60" rx="15" ry="15" id="c"></rect>
        Su navegador no soporta SVG :/

        <!--brazo izquierdo-->
        <rect x="90" y="100" width="20" height="100" rx="15" ry="15" id="c"></rect>
        Su navegador no soporta SVG :/

        <!--torzo-->
        <rect x="120" y="90" width="100" height="120" rx="15" ry="15" id="c"></rect>
        Su navegador no soporta SVG :/
        <!--brazo derecho-->
        <rect x="230" y="100" width="20" height="100" rx="15" ry="15" id="c"></rect>
        Su navegador no soporta SVG :/

        <rect x="115" y="100" width="110" height="10" id="b"></rect>
        Su navegador no soporta SVG :/
    </symbol>

Mostrando el logo de Android con el elemento <use>

Pero con el HTML definido anteriormente no es suficiente para mostrar el logo de Android; para mostrar el logo es necesario emplear el elemento <use> colocando el identificador del elemento <symbol> dentro del atributo xlink:href:

<symbol id= "android">
…
</symbol>
<use xlink:href= "#android" ... />

Cambiando el color del trazado

Es posible cambiar el color del trazado usando el atributo fill:

<use xlink:href= "#android" fill= "DarkOrange"  width= "250" height= "250" />

Aunque para nuestro logo no es necesario.

Colocando todo junto:

Al colocar todo lo visto anteriormente, obtenemos:

Su navegador no soporta SVG :/s Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ 

Redimensionando y replicando nuestro logo

Finalmente, empleando repetidas veces el elemento <use> como se muestra en el siguiente HTML:

    <use xlink:href= "#android" width= "150" height= "250" />
    <use xlink:href= "#android" width= "300" height= "500" />
    <use xlink:href= "#android" width= "600" height= "1000" />

La verdadera ventaja al definir el logo de Android dentro del elemento <symbol> es poder cambiarle el tamaño y pintarlo tantas veces como queramos.

Podemos pintar tantos logos de Android como queramos (tres para nuestro ejemplo) y definiendo su ancho (width) y largo (height) para variar sus dimensiones (redimensionar los logos) obtenemos:

Su navegador no soporta SVG :/s Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ Su navegador no soporta SVG :/ 

Podemos definir tantos elementos <use> como logos de Android queramos pintar.

El atributo viewBox

Si te fijas, empleamos el atributo viewBox en el elemento <symbol>; este atributo permite controlar el tamaño de los elementos dentro del SVG; el atributo está compuesto de los siguientes valores:

  • min-x
  • min-y
  • width
  • height

Por lo tanto, si el valor min-x y min-y son iguales al width y height del SVG existe una relación 1:1 en donde cada pixel ocupará exactamente el tamaño del píxel, pero si por el contrario, si el valor de min-x y min-y son width/2 y height/2 del width y height del SVG; es decir:

min-x = width/2
min-y = height/2

Entonces cada pixel ocupa el doble de su espacio (una relación 1:2); es decir, dos píxeles.

Ver ejemplo Descargar


Andrés Cruz
Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz en Udemy

Acepto recibir anuncios de interes sobre este Blog.

!Cursos a!

10$

En Udemy

Quedan 5 días!

Ver los cursos
¡Hazte afiliado en Gumroad!

!Cursos desde!

4$

En Academia

Ver los cursos

!Libros desde!

1$

Ver los libros
!Web Alojada en Hostinger!