¿Debo usar <img>
, <object>
o <embed>
para cargar archivos SVG en una página de forma similar a cargar un jpg
, gif
o png
?
¿Cuál es el código de cada uno para garantizar que funcione lo mejor posible? (Veo referencias para incluir el tipo MIME o señalar a los renderizadores SVG alternativos en mi investigación y no veo una buena referencia de estado del arte).
Suponga que estoy comprobando la compatibilidad con SVG con Modernizr y retrocediendo (probablemente haciendo un reemplazo con una <img>
etiqueta simple ) para navegadores no compatibles con SVG.
html
svg
vector-graphics
artlung
fuente
fuente
<svg>
desde el que desea hacer referencia a otros SVG. Esto se puede lograr, por ejemplo, usando<image>
.Respuestas:
Puedo recomendar el SVG Primer (publicado por el W3C), que cubre este tema: http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#SVG_in_HTML
Si lo usa
<object>
, obtendrá una copia de seguridad de la trama gratis *:*) Bueno, no del todo de forma gratuita, ya que algunos navegadores descargan ambos recursos, consulte la sugerencia de Larry a continuación para saber cómo solucionarlo.
Actualización 2014:
Si desea un svg no interactivo, úselo
<img>
con fallos de script a la versión png (para IE y Android anteriores <3). Una manera 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 antiguos la capacidad de usar un complemento svg, entonces úselo
<embed>
.Para svg en css
background-image
y propiedades similares, modernizr es una opción para cambiar a imágenes de reserva, otra depende de múltiples fondos para hacerlo automáticamente:Nota : la estrategia de múltiples fondos no funciona en Android 2.3 porque admite múltiples fondos pero no svg.
Una buena lectura adicional es esta publicación de blog sobre fallos de svg.
fuente
<param name="src" value="your.svg" />
dentro de la<object>
etiqueta. He pasado mucho tiempo tratando de descubrir cómo hacer todo eso, y creo que finalmente lo entendí.Desde IE9 y superior puede usar SVG en una etiqueta IMG ordinaria.
https://caniuse.com/svg-img
fuente
<img/>
etiqueta puede querer saber acerca de agregar identificadores de Fragmentación SVG , por ejemplo "<img src="myimage.svg#svgView(preserveAspectRatio(none))" />
", que le permite controlar la relación de aspectoviewBox
, etc., lo mismo que con las definiciones SVG en línea. Más información sobre el escalado - css-tricks.com/scale-svg<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
Entonces puedes hacer cosas como
fuente
La mejor opción es usar imágenes SVG en diferentes dispositivos :)
fuente
onerror
incendios si svg no se procesa? ¿Qué navegadores has probado?Utilizar
srcset
La mayoría de los navegadores actuales admiten el
srcset
atributo , 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, recurrirá alsrc
.Este método tiene varios beneficios sobre otras soluciones:
srcset
deben saber cómo manejarlo para que solo descargue el archivo que necesita.fuente
Si necesita que sus SVG tengan un estilo completo con CSS, deben estar en línea en el DOM. Esto se puede lograr a través de la inyección SVG, que utiliza Javascript para reemplazar un elemento HTML (generalmente un
<img>
elemento) con el contenido de un archivo SVG después de que la página se haya cargado.Aquí hay un ejemplo mínimo con SVGInject :
Después de cargar la imagen
onload="SVGInject(this)
, activará la inyección y el<img>
elemento será reemplazado por el contenido del archivo provisto en elsrc
atributo. Esto funciona con todos los navegadores que admiten SVG.Descargo de responsabilidad: soy coautor de SVGInject
fuente
Yo personalmente usaría una
<svg>
etiqueta porque si lo tienes, tienes control total sobre ella . Si lo usas en<img>
no podrá controlar las entrañas del SVG con CSS, etc.Otra cosa es el soporte del navegador .
Simplemente abra su
svg
archivo y péguelo directamente en la plantilla.entonces en tu CSS puedes simplemente, por ejemplo:
Algún recurso: consejos SVG
fuente
Si usa etiquetas <img> , los navegadores basados en webkit no mostrarán imágenes de mapa de bits incrustadas .
Para cualquier tipo de uso avanzado de SVG, incluidas las ofertas en línea de SVG, con mucho, la mayor flexibilidad.
Internet Explorer y Edge redimensionarán el SVG correctamente , pero debe especificar tanto el alto como el ancho.
Puede agregar onclick, onmouseover, etc. dentro del svg, a cualquier forma en el SVG: onmouseover = "top.myfunction (evt);"
También puedes usar fuentes web en el SVG incluyéndolas en su hoja de estilo regular.
Nota: si está exportando SVG 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 un nombre incorrecto a Arial, y puede arreglarlo así:
Todo esto funciona en cualquier navegador lanzado desde 2013 .
Para ver un ejemplo, visite ozake.com . Todo el sitio está hecho de SVG excepto el formulario de contacto.
Advertencia: las fuentes web se redimensionan de manera imprecisa en Safari, 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 a esta pregunta para más información.
fuente
img
etiqueta ... ¿Sabes si esto está documentado oficialmente en alguna parte?Mis dos centavos: a partir de 2019, el 93% de los navegadores en uso (y el 100% de las últimas dos versiones de cada uno de ellos) pueden manejar SVG en
<img>
elementos:Fuente: ¿Puedo usar
Entonces podríamos decir que ya no hay razón para usar
<object>
.Sin embargo, todavía tiene sus ventajas :
Al inspeccionar (por ejemplo, con Chrome Dev Tools), se le presenta el marcado SVG completo en caso de que quiera manipularlo un poco y ver los cambios en vivo.
Proporciona una implementación de respaldo muy robusta en caso de que su navegador no sea compatible con SVG (¡espere, pero todos lo hacen!), Que también funciona si no se encuentra el SVG. Esta fue una característica clave de la especificación XHTML2, que es como betamax o HD-DVD
Pero también hay contras :
<object>
(aunque es perfectamente seguro usarlo<amp-img>
y usarlo también en línea .<object>
etiqueta puede evitar que su PWA sea realmente fuera de línea.fuente
Encontré una solución con CSS puro y sin descarga de doble imagen. No es hermoso como quiero, pero funciona.
La idea es insertar SVG especial con estilo alternativo.
Puede encontrar más detalles y procesos de prueba en mi blog .
fuente
Esta función jQuery captura todos los errores en las 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
fuente
Recomiendo usar la combinación de
fuente
Puede insertar un SVG indirectamente usando
<img>
etiqueta HTML y esto es posible en StackOverflow siguiendo lo que se describe a continuación:Tengo el siguiente archivo SVG en mi PC
He subido esta imagen a https://svgur.com
Después de finalizar la carga, obtuve la siguiente URL:
Luego agregué MANUALMENTE (sin usar el icono de IMAGEN) siguiendo la etiqueta html
y el resultado está justo debajo
Para el usuario con alguna duda, es posible ver lo que he hecho en la edición después de la respuesta en la inserción de la imagen SVG de StackOverflow
OBSERVACIÓN-1: el archivo SVG debe contener un
<?xml?>
elemento. Al principio, simplemente he creado un archivo SVG que comienza directamente con la<svg>
etiqueta y nada funcionó.OBSERVACIÓN-2: al principio, intenté insertar una imagen usando el
IMAGE
ícono deEdit Toolbar
. Pego la URL de mi archivo SVG pero StackOverflow no acepta este método. los<img>
etiqueta debe agregarse manualmente.Espero que esta respuesta pueda ayudar a otros usuarios.
fuente