Ceci est une auto-question d'un morceau de code pratique que j'ai trouvé.
Actuellement, il n'y a pas de moyen facile d'incorporer une image SVG et d'avoir ensuite accès aux éléments SVG via CSS. Il existe différentes méthodes d'utilisation des frameworks JS SVG, mais elles sont trop compliquées si vous ne faites qu'une simple icône avec un état de survol.
Voici donc ce que j'ai trouvé, qui est, je pense, de loin le moyen le plus simple d'utiliser des fichiers SVG sur un site Web. Il tire son concept des premières méthodes de remplacement de texte en image, mais pour autant que je sache, cela n'a jamais été fait pour les SVG.
Ceci est la question:
Réponses:
Tout d'abord, utilisez une balise IMG dans votre code HTML pour incorporer un graphique SVG. J'ai utilisé Adobe Illustrator pour créer le graphique.
C'est exactement comme si vous intégriez une image normale. Notez que vous devez définir l'IMG pour avoir une classe de svg. La classe «lien social» est juste à titre d'exemple. L'ID n'est pas requis, mais il est utile.
Ensuite, utilisez ce code jQuery (dans un fichier séparé ou en ligne dans la tête).
Le code ci-dessus cherche tous les IMG avec la classe 'svg' et les remplace par le SVG en ligne du fichier lié. L'avantage majeur est qu'il vous permet d'utiliser CSS pour changer la couleur du SVG maintenant, comme ceci:
Le code jQuery que j'ai écrit porte également sur l'ID et les classes des images d'origine. Donc, ce CSS fonctionne aussi:
Ou:
Vous pouvez voir un exemple de son fonctionnement ici: http://labs.funkhausdesign.com/examples/img-svg/img-to-svg.html
Nous avons une version plus compliquée qui inclut la mise en cache ici: https://github.com/funkhaus/style-guide/blob/master/template/js/site.js#L32-L90
la source
});
$ .get par}, 'xml');
img[src$=".svg"]
et éliminer le besoin de lasvg
classe.$('#ico_company path').removeAttr('fill')
. Ensuite, vous pouvez le faire#ico_company { fill: #ccc }
dans votre fichier CSSStyle
Scénario
la source
width="170.667"
dans mon caspath
formes (commerect
), vous devrez également les gérer en CSSVous pouvez désormais utiliser la propriété CSS
filter
dans la plupart des navigateurs modernes (y compris Edge, mais pas IE11). Il fonctionne sur les images SVG ainsi que sur d'autres éléments. Vous pouvez utiliserhue-rotate
ouinvert
pour modifier les couleurs, bien qu'ils ne vous permettent pas de modifier les différentes couleurs indépendamment. J'utilise la classe CSS suivante pour afficher une version "désactivée" d'une icône (où l'original est une image SVG avec une couleur saturée):Cela le rend gris clair dans la plupart des navigateurs. Dans IE (et probablement Opera Mini, que je n'ai pas testé), il est sensiblement atténué par la propriété d'opacity, qui semble toujours assez bonne, bien qu'elle ne soit pas grise.
Voici un exemple avec quatre classes CSS différentes pour l' icône de cloche Twemoji : originale (jaune), la classe "désactivée" ci-dessus,
hue-rotate
(verte) etinvert
(bleue).Afficher l'extrait de code
la source
if ($('.w3-top img').css("color") == "rgb(0, 0, 0)") { $('.w3-top img').css("filter", "invert(100%)"); $('.w3-top img').css("-webkit-filter", "invert(100%)"); };
Alternativement, vous pouvez utiliser CSS
mask
, la prise en charge du navigateur accordée n'est pas bonne, mais vous pouvez utiliser une solution de secoursla source
-webkit-mask
ne doit pas être utilisé sur un site Web de production.Si vous pouvez inclure des fichiers (PHP inclure ou inclure via votre CMS de choix) dans votre page, vous pouvez ajouter le code SVG et l'inclure dans votre page. Cela fonctionne de la même manière que le collage de la source SVG dans la page, mais rend le balisage de page plus propre.
L'avantage est que vous pouvez cibler des parties de votre SVG via CSS pour le survol - aucun javascript requis.
http://codepen.io/chriscoyier/pen/evcBu
Il vous suffit d'utiliser une règle CSS comme celle-ci:
Notez que le
!important
bit est nécessaire pour remplacer la couleur de remplissage.la source
<div ng-include="'svg.svg'"></div>
#pathidorclass:hover, .wrapperclass:hover #pathidorclass { fill: green; }
Ou même éliminez simplement le survol original du chemin SVG puisque vous le ciblez via l'élément wrapper maintenant de toute façon.@Drew Baker a donné une excellente solution pour résoudre le problème. Le code fonctionne correctement. Cependant, ceux qui utilisent AngularJs peuvent trouver beaucoup de dépendance à jQuery. Par conséquent, j'ai pensé que c'était une bonne idée de coller pour les utilisateurs d'AngularJS, un code suivant la solution de @Drew Baker.
AngularJs façon du même code
1. Html : utilisez la balise ci-dessous dans votre fichier html:
2. Directive : ce sera la directive dont vous aurez besoin pour reconnaître la balise:
3. CSS :
4. Test unitaire au karma-jasmin :
la source
<div ng-include="/icons/my.svg" class="any-class-you-wish"></div>
ng-include
alors changez simplement cette lignevar imgURL = element.attr('src');
envar imgURL = element.attr('ng-include');
if (typeof(imgClass) !== 'undefined') { $svg.setAttribute("class", imgClass); }
au lieu de fractionner et de boucle.angular.element(data)[0];
) et le faire fonctionner avec l'utilisation d'IEif ($svg.getAttribute('class')) { $svg.setAttribute('class', $svg.getAttribute('class') + ' ' + imgClass); } else { $svg.setAttribute('class', imgClass); }
. De plus, vous voudrez peut-être ajoutercache: true
des options,$http.get
sinon votre page pourrait devenir très lente.Je réalise que vous voulez accomplir cela avec CSS, mais juste un rappel au cas où ce serait une petite image simple - vous pouvez toujours l'ouvrir dans Notepad ++ et changer le chemin / le remplissage de l'élément:
Cela pourrait sauver une tonne de scripts laids. Désolé si c'est hors de la base, mais parfois les solutions simples peuvent être négligées.
... même l'échange de plusieurs images svg peut être plus petit que certains extraits de code pour cette question.
la source
J'ai écrit une directive pour résoudre ce problème avec AngularJS. Il est disponible ici - ngReusableSvg .
Il remplace l'élément SVG après son rendu et le place à l'intérieur d'un
div
élément, ce qui rend son CSS facilement modifiable. Cela permet d'utiliser le même fichier SVG à différents endroits en utilisant différentes tailles / couleurs.L'utilisation est simple:
Après cela, vous pouvez facilement avoir:
la source
TL / DR: ALLEZ ici-> https://codepen.io/sosuke/pen/Pjoqqp
Explication:
Je suppose que vous avez quelque chose en HTML comme ceci:
Certainement aller la route du filtre, ce est à dire. votre svg est très probablement noir ou blanc. Vous pouvez appliquer un filtre pour qu'il soit de la couleur que vous voulez, par exemple, j'ai un svg noir que je veux vert menthe. Je l'inverse d'abord pour qu'il soit blanc (qui est techniquement toutes les couleurs RVB sur le plein), puis je joue avec la saturation de teinte, etc. Pour bien faire les choses:
Encore mieux, vous pouvez simplement utiliser un outil pour convertir l'hex que vous voulez en un filtre pour vous: https://codepen.io/sosuke/pen/Pjoqqp
la source
Voici une version
knockout.js
basée sur la réponse acceptée:Important: il nécessite également jQuery pour le remplacement, mais j'ai pensé qu'il pourrait être utile à certains.
Ensuite, appliquez simplement
data-bind="svgConvert: true"
à votre tag img.Cette solution remplace complètement la
img
balise par un SVG et toute liaison supplémentaire ne serait pas respectée.la source
get
demanderait à nouveau. J'ai envisagé de remplacer l' attribut parsrc
undata-src
attribut sur laimg
balise, mais j'ai conclu que les navigateurs modernes sont probablement assez intelligents pour mettre en cache le fichier de toute façonVoici un code sans framework, uniquement des js purs:
la source
Il existe une bibliothèque open source appelée SVGInject qui utilise l'
onload
attribut pour déclencher l'injection. Vous pouvez trouver le projet GitHub sur https://github.com/iconfu/svg-injectVoici 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 SVG fourni dans l'src
attribut.Il résout plusieurs problèmes avec l'injection SVG:
Les SVG peuvent être masqués jusqu'à la fin de l'injection. Ceci est important si un style est déjà appliqué pendant le temps de chargement, ce qui provoquerait sinon un bref "flash de contenu sans style".
Les
<img>
éléments s'injectent automatiquement. Si vous ajoutez des SVG dynamiquement, vous n'avez pas à vous soucier d'appeler à nouveau la fonction d'injection.Une chaîne aléatoire est ajoutée à chaque ID dans le SVG pour éviter d'avoir le même ID plusieurs fois dans le document si un SVG est injecté plusieurs fois.
SVGInject est Javascript simple et fonctionne avec tous les navigateurs qui prennent en charge SVG.
Avertissement: je suis le co-auteur de SVGInject
la source
Si nous avons un plus grand nombre de ces images svg, nous pouvons également prendre l'aide de fichiers de polices.
Des sites comme https://glyphter.com/ peuvent nous obtenir un fichier de police à partir de nos svgs.
Par exemple
la source
Vous pouvez utiliser data-image pour cela. en utilisant data-image (data-URI), vous pouvez accéder au SVG comme en ligne.
Voici un effet de survol en utilisant du CSS pur et du SVG.
Je sais que c'est désordonné, mais vous pouvez le faire de cette façon.
Vous pouvez convertir votre svg en URL de données ici
la source
Puisque SVG est essentiellement du code, vous avez juste besoin de contenu. J'ai utilisé PHP pour obtenir du contenu, mais vous pouvez utiliser ce que vous voulez.
Ensuite, j'ai imprimé le contenu "tel quel" dans un conteneur div
Pour définir enfin la règle sur les enfants SVG du conteneur sur CSS
J'ai obtenu ces résultats avec une icône matérielle SVG:
la source
La solution sélectionnée est parfaite si vous voulez que jQuery traite tous les éléments svg de votre DOM et que votre DOM soit de taille raisonnable. Mais si votre DOM est volumineux et que vous décidez de charger des parties de votre DOM dynamiquement, cela n'a vraiment aucun sens d'avoir à réanalyser l'intégralité du DOM juste pour mettre à jour les éléments svg. Utilisez plutôt un plugin jQuery pour ce faire:
Dans votre html, spécifiez un élément svg comme suit:
Et appliquez le plugin:
la source
pour: les animations d'événement de survol, nous pouvons laisser les styles à l'intérieur du fichier svg, comme un
vérifiez ceci sur svgshare
la source