CSS: utiliser raw svg dans le paramètre URL D'un fond-image dans IE
Donc, je suis en train de faire quelque chose comme ceci:
div {
    width: 100px;
    height: 100px;
    background-position: center center;
    background-repeat: no-repeat;
    background-size: 100px 100px;
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='100' style='fill:red; stroke:none'><rect x='0' y='40' width='100' height='20' /><rect x='40' y='0' width='20' height='100' /></svg>");
}
Voir ici: http://jsfiddle.net/trxkcx41/4/
cela fonctionne à merveille dans les versions actuelles Chrome, Safari (OS X et iOS), et Firefox. Cependant, la SVG n'apparaît pas du tout dans IE 9, 10 ou 11.
est-ce parce que cela n'est pas supporté dans IE, ou parce que je fais quelque chose de mal?
[MISE À JOUR AVEC SOLUTION]
merci à hungerstar, j'ai obtenu ce travail. Pour résumer sa recommandation, j'ai dû apporter les changements suivants:
- changer le type de données de - data:image/svg+xml;utf8- data:image/svg+xml;charset=utf8(i.e.,- charset=est requis)
- URL encodent le svg. Pour minimiser le codage D'URL, utilisez - 'au lieu de- "pour inclure les attributs. Donc, dans mon cas, seul le- <et- >nécessaire pour être encodage.
Pour, en fin de compte, mon CSS ressemblait à ceci:
    background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100' height='100' style='fill:red; stroke:none' %3E%3Crect x='0' y='40' width='100' height='20' /%3E%3Crect x='40' y='0' width='20' height='100' /%3E%3C/svg%3E");
4 réponses
IE semble supporter l'utilisation de utf8 dans un data URI, c'est tout simplement d'être plus pointilleux à ce sujet. Voir cette Codepen Blog Post pour plus de détails, mais voici les faits saillants:
L'auteur RFC2397 et faits saillants:
données:[
][;base64], 
est une spécification de type de média Internet (avec des paramètres optionnels.) L'apparition de ";base64" signifie que les données sont encodées en base64. Sans"; base64", les données (en tant que séquence d'octets) sont représentées à l'aide de l'encodage ASCII pour les octets situés à l'intérieur de la plage des caractères D'URL sûrs et à l'aide de l'encodage %xx hex standard des URLs pour les octets situés à l'extérieur de cette plage. Si < mediatype> est omis, il est par défaut text/plain;charset=US-ASCII. En raccourci, "text / plain" peut être omis mais le paramètre charset fourni. 
- la plupart des navigateurs sont indulgents à propos du charset= string, mais C'est nécessaire pour Internet Explorer. Cela signifie que vous devez utiliser ;charset=utf8,au lieu de;utf8,.
- à Partir de ci-dessus, "sans ";base64", les données (en tant que séquence d'octets) sont représentées en utilisant l'encodage ASCII pour les octets à l'intérieur de la plage des caractères D'URL sécurisés et en utilisant l'encodage %xx hex standard des URLs pour les octets à l'extérieur de cette plage." ce qui signifie que vous aurez à cent-encoder les caractères qui ne sont pas URL-safe. Par exemple, <svg>%3Csvg%3E. Vous pouvez réduire le quantité de pourcentage d'encodage qui doit être fait en utilisant des guillemets simples'au lieu de guillemets".
IE9 j'ai URL Encoder tout le code SVG.
c'est mon workflow pour les images de fond SVG.
premier coller le code SVG ici pour l'optimiser: https://jakearchibald.github.io/svgomg/ ("coller le balisage")
vous pouvez supprimer la " viewBox "mais assurez-vous que" width "et" height " sont définis dans le code SVG, IE9 en a besoin pour une meilleure implémentation CSS.
Maintenant, vous avez quelque chose comme:
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><path d="M0 0h100L50 50"/></svg>
dans ce cas, je dois ajouter une couleur de remplissage, parce qu'il n'y en avait aucune définie. j'ajoute donc:
fill="#cc0000"
à la fin de l' chemin element (s'il y a un couple d'éléments de chemin dans un groupe ("g") vous devez mettre cette couleur de remplissage à tous ceux-ci. Si le SVG a des traits, faites de même avec les traits comme stroke="#cc0000").
nous avons maintenant le code SVG suivant:
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100"><path d="M0 0h100L50 50" fill="#cc0000"/></svg>
maintenant encoder tout le code SVG ici: http://meyerweb.com/eric/tools/dencoder/
de sorte que vous obtenez:
%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Cpath%20d%3D%22M0%200h100L50%2050%22%20fill%3D%22%23cc0000%22%2F%3E%3C%2Fsvg%3E
au moins mettez cette chose ensemble dans votre CSS:
.apple {
    background-image: url('data:image/svg+xml;charset=UTF-8,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%22100%22%20height%3D%22100%22%3E%3Cpath%20d%3D%22M0%200h100L50%2050%22%20fill%3D%22%23cc0000%22%2F%3E%3C%2Fsvg%3E');
    }
Certains avantages qui m'ont rendu fou:
assurez-vous pour envelopper le code SVG avec ' dans le CSS parce que dans le SVG nous utilisons "!
assurez-vous utiliser
data:image/svg+xml;charset=UTF-8
rien autre.
maintenant la SVG est affichée avec la couleur "# cc0000 " (rouge foncé) même dans IE9 sur windows.
avec cette URL encodée SVG je peux encore changer la couleur avec une variable PHP. Par exemple, je remplace simplement "cc0000" par:
<?php echo preg_replace("/#/", "", $textcolor); ?>
je le fais pour les modèles WordPress afin que le client puisse choisir la couleur de l'icône dans le backend.
Juste une remarque pour cette. Dans IE 11, Vous pouvez utiliser charset=utf8. Vous avez l'encoder au moins < et > (à condition que vous utilisez '' pour les valeurs d'attribut non "". En outre, soyez prudent dans le cas où vous utilisez des caractères non-ASCII. Vous devez fournir leur valeur encodée UTF-8 - c'est-à-dire trouver un outil qui vous donne le code UTF-8 pour le caractère (comme Babel Map) et ensuite le fournir sous forme encodée URL. c'est à dire j'ai voulu rendre l' ▾ caractère (U+25BE). UTF-8 représentation des le personnage est \xE2\x96\xBE et %E2%96%BE sous forme codée par URL.
background-image: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' version='1.1' height='10px' width='15px'%3E%3Ctext x='0' y='10' fill='gray'%3E%E2%96%BE%3C/text%3E%3C/svg%3E");
Cette solution fonctionne bien pour moi, j'utilise le charset=utf8 au lieu de utf-8.
