Dois - je utiliser <img>
, <object>
ou <embed>
pour le chargement des fichiers SVG dans une page d'une manière similaire à un chargement jpg
, gif
ou png
?
Quel est le code de chacun pour s'assurer qu'il fonctionne le mieux possible? (Je vois des références à l'inclusion du type MIME ou pointant vers des rendus SVG de secours dans mes recherches et je ne vois pas une bonne référence de pointe).
Supposons que je vérifie la prise en charge de SVG avec Modernizr et que je recule (faisant probablement un remplacement avec une <img>
balise simple ) pour les navigateurs non compatibles SVG.
html
svg
vector-graphics
artlung
la source
la source
<svg>
partir duquel vous souhaitez référencer d'autres SVG. Ceci peut être réalisé, par exemple en utilisant<image>
.Réponses:
Je peux recommander le SVG Primer (publié par le W3C), qui couvre ce sujet: http://www.w3.org/Graphics/SVG/IG/resources/svgprimer.html#SVG_in_HTML
Si vous utilisez,
<object>
vous obtenez gratuitement un raster fallback *:*) Eh bien, pas tout à fait gratuitement, car certains navigateurs téléchargent les deux ressources, consultez la suggestion de Larry ci-dessous pour savoir comment contourner cela.
Mise à jour 2014:
Si vous voulez un svg non interactif, utilisez-le
<img>
avec des scripts de secours en version png (pour les anciens IE et android <3). Une façon propre et simple de le faire:<img src="your.svg" onerror="this.src='your.png'">
.Cela se comportera un peu comme une image GIF, et si votre navigateur prend en charge les animations déclaratives (SMIL), celles-ci seront lues.
Si vous voulez un svg interactif, utilisez soit
<iframe>
ou<object>
.Si vous devez fournir aux anciens navigateurs la possibilité d'utiliser un plugin svg, utilisez-le
<embed>
.Pour svg dans css
background-image
et des propriétés similaires, modernizr est un choix pour passer aux images de secours, un autre dépend de plusieurs arrière-plans pour le faire automatiquement:Remarque : la stratégie à arrière-plans multiples ne fonctionne pas sur Android 2.3 car elle prend en charge plusieurs arrière-plans mais pas svg.
Une bonne lecture supplémentaire est ce blog sur les solutions de secours svg.
la source
<param name="src" value="your.svg" />
à l'intérieur de la<object>
balise. J'ai passé beaucoup de temps à essayer de comprendre comment faire tout cela, et je pense que j'ai enfin compris.Depuis IE9 et au-dessus, vous pouvez utiliser SVG dans une balise IMG ordinaire.
https://caniuse.com/svg-img
la source
<img/>
balise peut vouloir savoir comment ajouter des identifiants SVG Fragement , par exemple "<img src="myimage.svg#svgView(preserveAspectRatio(none))" />
", qui vous permet de contrôler le rapport hauteur / largeurviewBox
, etc. de la même manière qu'avec les définitions SVG en ligne. Pour en savoir plus sur la mise à l'échelle - css-tricks.com/scale-svg<object>
et<embed>
ont une propriété intéressante: elles permettent d'obtenir une référence au document SVG à partir d'un document externe (en tenant compte de la politique de même origine). La référence peut ensuite être utilisée pour animer le SVG, changer ses feuilles de style, etc.Donné
Vous pouvez ensuite faire des choses comme
la source
La meilleure option est d'utiliser des images SVG sur différents appareils :)
la source
onerror
incendies si svg ne s'affiche pas? quels navigateurs avez-vous testés?Utilisation
srcset
La plupart des navigateurs actuels prennent en charge l'
srcset
attribut , qui permet de spécifier différentes images pour différents utilisateurs. Par exemple, vous pouvez l'utiliser pour une densité de pixels 1x et 2x, et le navigateur sélectionnera le fichier correct.Dans ce cas, si vous spécifiez un SVG dans le
srcset
et que le navigateur ne le prend pas en charge, il se repliera sur lesrc
.Cette méthode présente plusieurs avantages par rapport à d'autres solutions:
srcset
doivent savoir comment le gérer afin qu'il télécharge uniquement le fichier dont il a besoin.la source
Si vous avez besoin que vos SVG soient entièrement stylables avec CSS, ils doivent être en ligne dans le DOM. Cela peut être réalisé grâce à l'injection SVG, qui utilise Javascript pour remplacer un élément HTML (généralement un
<img>
élément) par le contenu d'un fichier SVG après le chargement de la page.Voici un exemple minimal utilisant SVGInject :
Une fois l'image chargée
onload="SVGInject(this)
, l'<img>
élément déclenchera l'injection et l' élément sera remplacé par le contenu du fichier fourni dans l'src
attribut. Cela fonctionne avec tous les navigateurs qui prennent en charge SVG.Avertissement: je suis le co-auteur de SVGInject
la source
J'utiliserais personnellement une
<svg>
balise parce que si vous l'avez, vous en avez le plein contrôle . Si vous l'utilisez,<img>
vous ne pouvez pas contrôler les entrailles du SVG avec CSS, etc.une autre chose est le support du navigateur .
Ouvrez simplement votre
svg
fichier et collez-le directement dans le modèle.alors dans votre css vous pouvez simplement par exemple:
Quelques ressources: conseils SVG
la source
Si vous utilisez des balises <img> , les navigateurs Webkit n'afficheront pas les images bitmap incorporées .
Pour tout type d'utilisation avancée du SVG, y compris le SVG en ligne offre de loin la plus grande flexibilité.
Internet Explorer et Edge redimensionneront correctement le SVG , mais vous devez spécifier à la fois la hauteur et la largeur.
Vous pouvez ajouter onclick, onmouseover, etc. à l'intérieur du svg, à n'importe quelle forme dans le SVG: onmouseover = "top.myfunction (evt);"
Vous pouvez également utiliser des polices Web dans le SVG en les incluant dans votre feuille de style habituelle.
Remarque: si vous exportez des SVG depuis Illustrator, les noms des polices Web seront incorrects. Vous pouvez corriger cela dans votre CSS et éviter de déconner dans le SVG. Par exemple, Illustrator donne le mauvais nom à Arial, et vous pouvez le corriger comme ceci:
Tout cela fonctionne sur n'importe quel navigateur sorti depuis 2013 .
Pour un exemple, voir ozake.com . L'ensemble du site est réalisé en SVG à l'exception du formulaire de contact.
Avertissement: les polices Web sont redimensionnées de manière imprécise dans Safari - et si vous avez beaucoup de transitions du texte brut en gras ou en italique, il peut y avoir une petite quantité d'espace supplémentaire ou manquant aux points de transition. Voir ma réponse à cette question pour plus d'informations.
la source
img
tag ... Savez-vous si cela est officiellement documenté quelque part?Mes deux cents: à partir de 2019, 93% des navigateurs utilisés (et 100% des deux dernières versions de chacun d'entre eux) peuvent gérer le SVG dans les
<img>
éléments:Source: puis-je utiliser
On pourrait donc dire qu'il n'y a plus de raison de l'utiliser
<object>
.Cependant, il a encore ses avantages :
Lors de l'inspection (par exemple avec Chrome Dev Tools), le balisage SVG complet vous est présenté au cas où vous souhaiteriez le modifier un peu et voir les changements en direct.
Il fournit une implémentation de secours très robuste au cas où votre navigateur ne prend pas en charge les SVG (attendez, mais chacun d'entre eux le fait!) Qui fonctionne également si le SVG n'est pas trouvé. C'était une caractéristique clé de la spécification XHTML2, qui est comme betamax ou HD-DVD
Mais il y a aussi des inconvénients :
<object>
(il est donc parfaitement sûr de l'utiliser avec<amp-img>
et de l'utiliser en ligne également .<object>
balise peut empêcher votre PWA d'être vraiment hors ligne.la source
Trouvé une solution avec du CSS pur et sans double téléchargement d'image. Ce n'est pas beau comme je veux, mais ça marche.
L'idée est d'insérer un SVG spécial avec un style de secours.
Plus de détails et de processus de test que vous pouvez trouver sur mon blog .
la source
Cette fonction jQuery capture toutes les erreurs dans les images svg et remplace l'extension de fichier par une autre extension
Veuillez ouvrir la console pour voir l' erreur de chargement de l'image svg
la source
Je recommande d'utiliser la combinaison de
la source
Vous pouvez insérer un SVG indirectement en utilisant
<img>
balise HTML et cela est possible sur StackOverflow en suivant ce qui est décrit ci-dessous:J'ai le fichier SVG suivant sur mon PC
J'ai téléchargé cette image sur https://svgur.com
Une fois le téléchargement terminé, j'ai obtenu l'URL suivante:
J'ai ensuite MANUELLEMENT (sans utiliser l'icône IMAGE) ajouté la balise html suivante
et le résultat est juste en dessous
Pour les utilisateurs ayant des doutes, il est possible de voir ce que j'ai fait en modifiant la réponse suivante sur StackOverflow en insérant une image SVG
REMARQUE-1: le fichier SVG doit contenir un
<?xml?>
élément. Au début, j'ai simplement créé un fichier SVG qui commence directement avec le<svg>
tag et rien n'a fonctionné!REMARQUE-2: au début, j'ai essayé d'insérer une image en utilisant l'
IMAGE
icône deEdit Toolbar
. Je colle l'URL de mon fichier SVG mais StackOverflow n'accepte pas cette méthode. le<img>
balise doit être ajoutée manuellement.J'espère que cette réponse pourra aider d'autres utilisateurs.
la source