J'ai plusieurs graphiques SVG dont je voudrais modifier les couleurs via mes feuilles de style externes - pas directement dans chaque fichier SVG. Je ne mets pas les graphiques en ligne, mais je les stocke dans mon dossier d'images et je les pointe.
Je les ai implémentés de cette manière pour permettre aux info-bulles de fonctionner, et j'ai également enveloppé chacune dans une <a>
balise pour permettre un lien.
<a href='http://youtube.com/...' target='_blank'><img class='socIcon' src='images/socYouTube.svg' title='View my videos on YouTube' alt='YouTube' /></a>
Et voici le code du graphique SVG:
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="stylesheets/main.css" type="text/css"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 56.69 56.69">
<g>
<path d="M28.44......./>
</g>
</svg>
J'ai mis ce qui suit dans mon fichier CSS externe (main.css):
.socIcon g {fill:red;}
Pourtant, cela n'a aucun effet sur le graphisme. J'ai également essayé .socIcon g path {} et .socIcon path {}.
Quelque chose ne va pas, peut-être que mon implémentation n'autorise pas les modifications CSS externes ou j'ai raté une étape? J'apprécierais vraiment votre aide! J'ai juste besoin de la possibilité de modifier les couleurs du graphique SVG via ma feuille de style externe, mais je ne peux pas perdre la fonction d'info-bulle et de lien. (Je pourrais peut-être vivre sans info-bulles.) Merci!
svg { fill:red; }
ou donnez à votre chemin un nom de classe. Par exemple,<path class="socIcon" d="M28.44 ..... />
cela devrait faire l'affaire.Réponses:
Votre fichier main.css n'aurait d'effet sur le contenu du SVG que si le fichier SVG est inclus en ligne dans le HTML:
https://developer.mozilla.org/en/docs/SVG_In_HTML_Introduction
Si vous souhaitez conserver votre SVG dans des fichiers, le CSS doit être défini à l'intérieur du fichier SVG.
Vous pouvez le faire avec une balise de style:
http://www.w3.org/TR/SVG/styling.html#StyleElementExample
Vous pouvez utiliser un outil côté serveur pour mettre à jour la balise de style en fonction du style actif. En rubis, vous pouvez y parvenir avec Nokogiri. SVG est juste du XML. Il existe donc probablement de nombreuses bibliothèques XML disponibles qui peuvent probablement y parvenir.
Si vous ne pouvez pas faire cela, vous devrez simplement les utiliser comme s'il s'agissait de PNG; créer un ensemble pour chaque style et enregistrer leurs styles en ligne.
la source
Vous pouvez faire ce que vous voulez, avec une mise en garde (importante): les chemins dans votre symbole ne peuvent pas être stylés indépendamment via CSS externe - vous ne pouvez définir les propriétés que pour le symbole entier avec cette méthode. Donc, si vous avez deux chemins dans votre symbole et que vous voulez qu'ils aient des couleurs de remplissage différentes, cela ne fonctionnera pas, mais si vous voulez que tous vos chemins soient identiques, cela devrait fonctionner.
Dans votre fichier html, vous voulez quelque chose comme ceci:
Et dans le fichier SVG externe, vous voulez quelque chose comme ceci:
Échangez la classe sur la
svg
balise (dans votre html) defill-red
àfill-blue
et ta-da ... vous avez du bleu au lieu de rouge.Vous pouvez partiellement contourner la limitation de pouvoir cibler les chemins séparément avec du CSS externe en mélangeant et en faisant correspondre le CSS externe avec du CSS en ligne sur des chemins spécifiques, car le CSS en ligne aura la priorité. Cette approche fonctionnerait si vous faites quelque chose comme une icône blanche sur un fond coloré, où vous souhaitez changer la couleur de l'arrière-plan via le CSS externe mais l'icône elle-même est toujours blanche (ou vice-versa). Donc, avec le même HTML qu'avant et quelque chose comme ce code svg, vous obtiendrez un fond rouge et un chemin de premier plan blanc:
la source
symbol
élément, c'est-à-dire que vous pouvez simplement donner unid
à l'élément svg, donc: `<svg id = example" xmlns = " w3.org/2000/svg " viewBox = "0 0 256 256 "> <path class =" background "d =" M120 ... "/> <path class =" icon "style =" fill: white; "d =" M20 ... "/> </ svg > `Vous pouvez inclure dans vos fichiers SVG un lien vers un fichier css externe en utilisant:
Vous devez mettre ceci après l'ouverture de la balise:
Ce n'est pas la solution parfaite, car vous devez modifier les fichiers svg, mais vous les modifiez une fois et que tous les changements de style peuvent être effectués dans un fichier css pour tous les fichiers svg.
la source
Il est possible de styliser un SVG en créant dynamiquement un élément de style en JavaScript et en l'ajoutant à l'élément SVG. Hacky, mais ça marche.
Vous pouvez générer le JavaScript dynamiquement en PHP si vous le souhaitez - le fait que cela soit possible en JavaScript ouvre une myriade de possibilités.
la source
Une approche que vous pouvez adopter consiste simplement à utiliser des filtres CSS pour modifier l'apparence des graphiques SVG dans le navigateur.
Par exemple, si vous avez un graphique SVG qui utilise une couleur de remplissage rouge dans le code SVG, vous pouvez le rendre violet avec un paramètre de rotation de teinte de 180 degrés:
Expérimentez avec d'autres paramètres de rotation de teinte pour trouver les couleurs souhaitées.
Pour être clair, le CSS ci-dessus va dans le CSS qui est appliqué à votre document HTML. Vous stylisez la balise img dans le code HTML, pas le code du SVG.
Et notez que cela ne fonctionnera pas avec les graphiques remplis de noir, de blanc ou de gris. Vous devez avoir une couleur réelle pour faire pivoter la teinte de cette couleur.
la source
Une solution très rapide pour avoir un style dynamique avec une feuille de style css externe, au cas où vous utiliseriez la
<object>
balise pour incorporer votre svg.Cet exemple ajoutera une classe à la
<svg>
balise racine en cliquant sur un élément parent.file.svg:
html:
Jquery:
sur l'élément parent click:
alors vous pouvez gérer votre css
svg.css:
la source
Cela devrait être possible en insérant d'abord les images svg externes. Le code ci-dessous vient de remplacer toutes les images SVG par SVG en ligne par Jess Frazelle.
la source
Lorsqu'il est utilisé dans une
<image>
balise, le SVG doit être contenu dans un seul fichier pour des raisons de confidentialité. Ce bogue bugzilla a plus de détails sur exactement pourquoi il en est ainsi. Malheureusement, vous ne pouvez pas utiliser une balise différente telle que an<iframe>
car cela ne fonctionnera pas comme un lien, vous devrez donc intégrer le CSS dans une<style>
balise dans le fichier lui-même.Une autre façon de faire cela serait d'avoir les données SVG dans le fichier html principal, c'est-à-dire
Vous pouvez styliser cela avec un fichier CSS externe en utilisant la
<link>
balise HTML .la source
Je vous suggère d'utiliser PHP pour cela. Il n'y a vraiment pas de meilleur moyen de le faire sans les polices d'icônes, et si vous résistez à leur utilisation, vous pouvez essayer ceci:
Et plus tard, vous pourrez utiliser ce fichier
filename.php?color=#ffffff
pour obtenir le fichier svg dans la couleur souhaitée.la source
if (!preg_match('/^[#][0-9a-f]{6}$/i', $_GET['color'])) die('Oops!');
(placez-le quelque part dans le bloc PHP de démarrage).Ce qui fonctionne pour moi: balise de style avec règle @import
la source
Je sais que c'est un ancien post, mais juste pour résoudre ce problème ... vous utilisez simplement vos classes au mauvais endroit: D
Tout d'abord, vous pouvez utiliser
dans votre
main.css
pour le rendre rouge. Cela a un effet. Vous pouvez également utiliser des sélecteurs de nœuds pour obtenir des chemins spécifiques.La deuxième chose est que vous avez déclaré la classe au
img
-Tag.Vous devriez en fait le déclarer dans votre SVG. si vous avez des chemins différents, vous pouvez bien sûr en définir plus.
maintenant vous pouvez changer la couleur de votre
main.css
goûtla source
<?xml-stylesheet href="stylesheets/main.css" type="text/css"?>
<?xml-stylesheet ... ?>
déclaration dans votre SVG. Je suppose que cela fonctionnerait. C'est similaire à d'autres réponses recommandant un<link rel="stylesheet" ... >
à l'intérieur du SVG. Il a également les mêmes problèmes (vous devez mettre à jour chaque SVG pour qu'il pointe vers la feuille de style, et tout changement de nom ou d'emplacement de la feuille de style signifie qu'il faut à nouveau changer tous les SVG).Remarque: les styles externes ne fonctionneront pas si vous incluez une
<img>
balise SVG à l'intérieur . Cela fonctionnera parfaitement à l'intérieur de la<div>
balisela source
@leo voici la version angularJS, merci encore
la source
Cette méthode fonctionnera si le svg est affiché dans un navigateur Web, mais dès que ce code est téléchargé sur le serveur et que la classe de l'icône svg est codée comme s'il s'agissait d'une image d'arrière-plan, la couleur est perdue et revient à la couleur par défaut . On dirait que la couleur ne peut pas être modifiée à partir de la feuille de style externe même si la classe svg pour la couleur et la classe de couche supérieure pour l'affichage et la position du svg sont toutes deux mappées dans le même répertoire.
la source