insertar img how color change bootstrap html svg vector-graphics

html - img - object svg change color



¿Utilizo<img>,<object> o<embed> para archivos SVG? (10)

¿Debo usar <img> , <object> o <embed> para cargar archivos SVG en una página de manera similar a cargar un jpg , gif o png ?

¿Cuál es el código de cada uno para garantizar que funcione lo mejor posible? (Estoy viendo referencias a incluir el mimetype o apuntar a representadores SVG de respaldo en mi investigación y no ver una buena referencia de vanguardia).

Supongamos que estoy comprobando la compatibilidad con SVG con Modernizr y me estoy replegando (probablemente haciendo un reemplazo con una etiqueta simple <img> ) para los navegadores no compatibles con SVG.


Usar srcset

Hoy en día, la mayoría de los navegadores actuales admiten el atributo srcset , que permite especificar diferentes imágenes para diferentes usuarios. Por ejemplo, puede usarlo para una densidad de píxeles de 1x y 2x, y el navegador seleccionará el archivo correcto.

En este caso, si especifica un SVG en el srcset y el navegador no lo admite, retrocederá en el src .

<img src="logo.png" srcset="logo.svg" alt="My logo">

Este método tiene varios beneficios sobre otras soluciones:

  1. No se basa en hacks o scripts extraños.
  2. Es sencillo
  3. Todavía puede incluir texto alternativo
  4. Los navegadores que admiten srcset deben saber cómo manejarlo para que solo descargue el archivo que necesita.


Encontré una solución con CSS puro y sin doble descarga de imágenes. No es hermoso como quiero, pero funciona.

<!DOCTYPE html> <html> <head> <title>HTML5 SVG demo</title> <style type="text/css"> .nicolas_cage { background: url(''nicolas_cage.jpg''); width: 20px; height: 15px; } .fallback { } </style> </head> <body> <svg xmlns="http://www.w3.org/2000/svg" width="0" height="0"> <style> <![CDATA[ .fallback { background: none; background-image: none; display: none; } ]]> </style> </svg> <!-- inline svg --> <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40"> <switch> <circle cx="20" cy="20" r="18" stroke="grey" stroke-width="2" fill="#99FF66" /> <foreignObject> <div class="nicolas_cage fallback"></div> </foreignObject> </switch> </svg> <hr/> <!-- external svg --> <object type="image/svg+xml" data="circle_orange.svg"> <div class="nicolas_cage fallback"></div> </object> </body> </html>

La idea es insertar SVG especial con estilo de respaldo.

Más detalles y proceso de prueba que puedes encontrar en mi blog .


La mejor opción es usar imágenes SVG en diferentes dispositivos :)

<img src="your-svg-image.svg" alt="Your Logo Alt" onerror="this.src=''your-alternative-image.png''">


Personalmente usaría una etiqueta <svg> porque si tienes control total sobre ella. Si lo usa en <img> , no podrá controlar las entrañas del SVG con CSS, etc.

Otra cosa es el soporte del navegador .

Simplemente abre tu archivo svg y pégalo directamente en la plantilla.

<svg version="1.0" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 3400 2700" preserveAspectRatio="xMidYMid meet" (click)="goHome();"> <g id="layer101"> <path d="M1410 2283 c-162 -225 -328 -455 -370 -513 -422 -579 -473 -654 -486 -715 -7 -33 -50 -247 -94 -475 -44 -228 -88 -448 -96 -488 -9 -40 -14 -75 -11 -78 2 -3 87 85 188 196 165 180 189 202 231 215 25 7 129 34 230 60 100 26 184 48 185 49 4 4 43 197 43 212 0 10 -7 13 -22 9 -13 -3 -106 -25 -208 -49 -102 -25 -201 -47 -221 -51 l-37 -7 8 42 c4 23 12 45 16 49 5 4 114 32 243 62 129 30 240 59 246 66 10 10 30 132 22 139 -1 2 -110 -24 -241 -57 -131 -33 -240 -58 -242 -56 -6 6 13 98 22 107 5 4 135 40 289 80 239 61 284 75 307 98 14 15 83 90 153 167 70 77 132 140 139 140 7 0 70 -63 141 -140 70 -77 137 -150 150 -163 17 -19 81 -39 310 -97 159 -41 292 -78 296 -82 8 -9 29 -106 24 -111 -1 -2 -112 24 -245 58 -134 33 -245 58 -248 56 -6 -7 16 -128 25 -136 5 -4 112 -30 238 -59 127 -29 237 -54 246 -57 11 -3 20 -23 27 -57 6 -28 9 -53 8 -54 -1 -1 -38 7 -81 17 -274 66 -379 90 -395 90 -16 0 -16 -6 3 -102 11 -57 21 -104 22 -106 1 -1 96 -27 211 -57 115 -31 220 -60 234 -66 14 -6 104 -101 200 -211 95 -111 175 -197 177 -192 1 5 -40 249 -91 542 l-94 532 -145 203 c-220 309 -446 627 -732 1030 -143 201 -265 366 -271 367 -6 0 -143 -183 -304 -407z m10 -819 l-91 -161 -209 -52 c-115 -29 -214 -51 -219 -49 -6 1 32 55 84 118 l95 115 213 101 c116 55 213 98 215 94 1 -3 -38 -78 -88 -166z m691 77 l214 -99 102 -123 c56 -68 100 -125 99 -127 -4 -3 -435 106 -447 114 -4 2 -37 59 -74 126 -38 68 -79 142 -93 166 -13 23 -22 42 -20 42 2 0 101 -44 219 -99z"/> <path d="M1126 2474 c-198 -79 -361 -146 -363 -147 -2 -3 -70 -410 -133 -805 -12 -73 -20 -137 -18 -143 2 -6 26 23 54 63 27 40 224 320 437 622 213 302 386 550 385 551 -2 2 -165 -62 -362 -141z"/> <path d="M1982 2549 c25 -35 159 -230 298 -434 139 -203 283 -413 319 -465 37 -52 93 -134 125 -182 59 -87 83 -109 73 -65 -5 20 -50 263 -138 747 -17 91 -36 170 -42 176 -9 8 -571 246 -661 280 -14 6 -7 -10 26 -57z"/> <path d="M1679 1291 c-8 -11 -71 -80 -141 -153 l-127 -134 -95 -439 c-52 -242 -92 -442 -90 -445 6 -5 38 28 218 223 l99 107 154 0 c85 0 163 -4 173 -10 10 -5 78 -79 151 -162 73 -84 136 -157 140 -162 18 -21 18 4 -2 85 -11 46 -58 248 -105 448 l-84 364 -87 96 c-108 121 -183 201 -187 201 -2 0 -10 -9 -17 -19z m96 -488 c33 -102 59 -189 57 -192 -2 -6 -244 -2 -251 4 -5 6 120 375 127 375 4 0 34 -84 67 -187z"/> </g> </svg>

entonces en tu css puedes simplemente por ejemplo:

svg { fill: red; }

Algunos recursos: css-tricks.com/using-svg


Puedo recomendar el Manual de SVG (publicado por el W3C), que trata este tema: http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#SVG_in_HTML

Si usas <object> , obtienes el raster backback gratis *:

<object data="your.svg" type="image/svg+xml"> <img src="yourfallback.jpg" /> </object>

*) Bueno, no del todo gratis, ya que algunos navegadores descargan ambos recursos, consulte la sugerencia de Larry a continuación para saber cómo solucionarlo.

Actualización de 2014:

  • Si desea un svg no interactivo, use <img> con alternativas de script a la versión png (para IE más antiguo y android <3). Una forma limpia y simple de hacer eso:

    <img src="your.svg" onerror="this.src=''your.png''"> .

    Esto se comportará como una imagen GIF, y si su navegador admite animaciones declarativas (SMIL), se reproducirán.

  • Si desea un svg interactivo, use <iframe> o <object> .

  • Si necesita proporcionar a los navegadores más antiguos la posibilidad de usar un complemento svg, use <embed> .

  • Para svg en background-image css y propiedades similares, modernizr es una opción para cambiar a imágenes de respaldo, otra depende de múltiples fondos para hacerlo automáticamente:

    div { background-image: url(fallback.png); background-image: url(your.svg), none; }

    Nota : la estrategia de fondos múltiples no funciona en Android 2.3 porque admite fondos múltiples pero no svg.

Una buena lectura adicional es esta publicación de blog en svg fallbacks.


Si necesita que sus SVG sean completamente estilizables con CSS, tienen que estar en línea en el DOM. Esto se puede lograr mediante la inyección de SVG, que usa Javascript para reemplazar un elemento HTML (generalmente un elemento <img> ) con el contenido de un archivo SVG después de que la página se haya cargado.

Aquí hay un ejemplo mínimo usando SVGInject :

<html> <head> <script src="svg-inject.min.js"></script> </head> <body> <img src="image.svg" onload="SVGInject(this)" /> </body> </html>

Después de cargar la imagen, el onload="SVGInject(this) activará la inyección y el elemento <img> será reemplazado por el contenido del archivo provisto en el atributo src . Esto funciona con todos los navegadores que admiten SVG.

Descargo de responsabilidad: soy el coautor de SVGInject


Si utiliza etiquetas <img> , los navegadores basados ​​en webkit no mostrarán imágenes de mapa de bits incrustadas .

Si usa SVG en línea, Explorer no cambiará el tamaño de SVG de acuerdo con su CSS.
Explorer cambiará el tamaño del SVG correctamente , pero debe especificar tanto el alto como el ancho.

Descubrí que la etiqueta <object> es la única que funciona en todos los navegadores. Tuve que cambiar el ancho y la altura (dentro de la SVG) al 100% para que se redimensionara correctamente.

Puede agregar onclick, onmouseover, etc. dentro del svg, a cualquier forma en el SVG: onmouseover = "top.myfunction (evt);"

También puede usar fuentes web en el SVG incluyéndolas en su hoja de estilo normal.

Nota: si está exportando SVG''s desde Illustrator, los nombres de las fuentes web serán incorrectos. Puede corregir esto en su CSS y evitar perder el tiempo en el SVG. Por ejemplo, Illustrator le da el nombre incorrecto a Arial, y puede arreglarlo así:

@font-face { font-family: ''ArialMT''; src: local(''Arial''), local(''Arial MT''), local(''Arial Regular''); font-weight: normal; font-style: normal; }

Todo esto funciona en cualquier navegador lanzado en los últimos dos años .

Resultados en ozake.com (en francés). Todo el sitio está hecho de SVG, excepto el formulario de contacto.

Advertencia: las fuentes web no se redimensionan con precisión, y si tiene muchas transiciones de texto sin formato a negrita o cursiva, puede haber una pequeña cantidad de espacio adicional o faltante en los puntos de transición. Vea mi respuesta en esta pregunta para más información.


<object> y <embed> tienen una propiedad interesante: permiten obtener una referencia al documento SVG del documento externo (teniendo en cuenta la política del mismo origen). La referencia se puede utilizar para animar el SVG, cambiar sus hojas de estilo, etc.

Dado

<object id="svg1" data="/static/image.svg" type="image/svg+xml"></object>

Entonces puedes hacer cosas como

document.getElementById("svg1").addEventListener("load", function() { var doc = this.getSVGDocument(); var rect = doc.querySelector("rect"); // suppose our image contains a <rect> rect.setAttribute("fill", "green"); });


Esta función jQuery captura todos los errores en imágenes svg y reemplaza la extensión del archivo con una extensión alternativa

Abra la consola para ver el error al cargar la imagen svg

(function($){ $(''img'').on(''error'', function(){ var image = $(this).attr(''src''); if ( /(/.svg)$/i.test( image )) { $(this).attr(''src'', image.replace(''.svg'', ''.png'')); } }) })(jQuery);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <img src="https://jsfiddle.net/img/logo.svg">