Appliquer des styles CSS à SVG : le guide complet

Les images SVG (Scalable Vector Graphics) offrent de nombreux avantages : légèreté, agrandissement infini et possibilité de manipulation via CSS. Cependant, leur stylisation peut s'avérer complexe selon la méthode d'intégration choisie. Ce guide vous explique comment appliquer efficacement des styles CSS sur vos SVG selon différents scénarios. Comprendre le contexte des SVG Les SVG fonctionnent dans leur propre espace de nommage XML. Cette particularité explique pourquoi les interactions entre le CSS de votre page et les éléments SVG ne sont pas toujours évidentes. Deux mondes coexistent : Le document HTML principal avec son CSS Le document SVG avec son propre contexte de style Les méthodes d'intégration des SVG La façon dont vous intégrez un SVG détermine comment vous pourrez le styliser : SVG inline : intégré directement dans le HTML (entièrement manipulable via CSS) SVG externe : référencé via une balise , background-image ou autres méthodes (limité en terme de stylisation), SVG via l'élément  : approche hybride permettant réutilisation et stylisation. 1. Styliser des SVG inline Les SVG inline (insérés directement dans le HTML) sont les plus flexibles en termes de stylisation, car ils font partie intégrante du DOM. Exemple de base .circle { fill: pink; /* Change la couleur de remplissage */ stroke: black; /* Ajoute un contour */ stroke-width: 2px; /* Définit l'épaisseur du contour */ transition: fill 0.3s; /* Ajoute une transition */ &:hover { fill: hotpink; /* Change la couleur au survol */ } } currentColor fait généralement le job La valeur currentColor fait office de "variable" en CSS puisqu'elle adopte automatiquement la couleur de texte environnante. En clair, elle copie la valeur de color du parent, même si celle-ci change. Idéalement, elle peut être appliquée aux attributs SVG fill et strokepar exemple : .circle { color: pink; /* Définit la couleur du cercle */ &:hover { color: hotpink; /* Change la couleur au survol */ } } Bonnes pratiques pour les SVG inline Utilisez currentColor pour que les éléments SVG héritent automatiquement de la couleur du texte parent (utilisez fill="currentColor" et/ou stroke="currentColor" pour les icônes qui doivent s'adapter à la couleur du texte), Nettoyez vos SVG des attributs de style superflus (voir outils en fin d'article), Ajoutez des classes pertinentes aux éléments que vous souhaitez cibler. 2. Styliser des SVG externes Les fichiers SVG externes (balise ou background-image) sont naturellement plus capricieux à styliser du fait de leur principe de compartimentage : rien n'entre ni ne sort d'un SVG, ou presque. Cas 1 : SVG externe modifiable Si vous avez accès au fichier SVG, vous pouvez y incorporer des styles directement via l'élément , mais vous n'irez pas très loin : .icon-path { fill: black; } Limitations importantes : Les valeurs doivent être stipulées en dur (pas de currentColor, ni de var(--ma-couleur)) Les interactions comme :hover fonctionnent uniquement dans certains contextes (SVG dans ou , pas dans ) Cas 2 : SVG externe non modifiable (masques CSS) Cette technique utilise la propriété CSS mask pour appliquer une couleur à un SVG externe sans devoir le modifier. Un élément HTML (comme un ) est utilisé comme conteneur, Une couleur de fond (background-color) est appliquée à cet élément, Le fichier SVG externe est utilisé comme masque via la propriété mask, Seules les parties opaques du SVG laissent apparaître la couleur de fond. C'est comme si le SVG agissait comme un pochoir : il définit la forme visible, mais la couleur provient de l'élément HTML lui-même. La contrepartie est que la teinte sera forcément monochrome. .icon { /* Dimensions */ display: inline-block; width: 1rem; height: 1rem; /* Couleur de l'icône (modifiable à volonté) */ background-color: currentColor; /* Application du masque SVG */ mask: var(--svg) no-repeat center; mask-size: contain; } .icon-star { --svg: url("icons/star.svg"); } .icon-cart { --svg: url("icons/cart.svg"); } /* Exemple d'interaction */ .icon:hover { background-color: hotpink; } /* Exemple pour dark mode */ @media (prefers-color-scheme: dark) { .icon { background-color: white; } } Voir une démo Les masques CSS en action : 3. Utiliser l'élément pour optimiser vos SVG L'élément offre un excellent compromis en permettant de regrouper des SVG en "sprites" tout en gardant la possibilité de les styliser individuellement. Rassemblement de plusieurs (sprite) Chaque élément (ici, chaque icône) est défini dans un avec un ID unique, le tout regroupé dans unique. Ces symboles sont ensuite instanciés via . est un conteneur qui ne sera pas affiché directement, mais qui peut être utilisé pour créer des instances de ce symbole (des clones) ailleurs dans le document. Affichage d'un avec use use permet d'instancier chacun des symbo

Avr 10, 2025 - 11:34
 0
Appliquer des styles CSS à SVG : le guide complet

Les images SVG (Scalable Vector Graphics) offrent de nombreux avantages : légèreté, agrandissement infini et possibilité de manipulation via CSS. Cependant, leur stylisation peut s'avérer complexe selon la méthode d'intégration choisie. Ce guide vous explique comment appliquer efficacement des styles CSS sur vos SVG selon différents scénarios.

Comprendre le contexte des SVG

Les SVG fonctionnent dans leur propre espace de nommage XML. Cette particularité explique pourquoi les interactions entre le CSS de votre page et les éléments SVG ne sont pas toujours évidentes. Deux mondes coexistent :

  • Le document HTML principal avec son CSS
  • Le document SVG avec son propre contexte de style

Les méthodes d'intégration des SVG

La façon dont vous intégrez un SVG détermine comment vous pourrez le styliser :

  1. SVG inline : intégré directement dans le HTML (entièrement manipulable via CSS)
  2. SVG externe : référencé via une balise , background-image ou autres méthodes (limité en terme de stylisation),
  3. SVG via l'élément  : approche hybride permettant réutilisation et stylisation.

1. Styliser des SVG inline

Les SVG inline (insérés directement dans le HTML) sont les plus flexibles en termes de stylisation, car ils font partie intégrante du DOM.

Exemple de base


  

.circle {
  fill: pink; /* Change la couleur de remplissage */
  stroke: black; /* Ajoute un contour */
  stroke-width: 2px; /* Définit l'épaisseur du contour */
  transition: fill 0.3s; /* Ajoute une transition */

  &:hover {
    fill: hotpink; /* Change la couleur au survol */
  }
}

currentColor fait généralement le job

La valeur currentColor fait office de "variable" en CSS puisqu'elle adopte automatiquement la couleur de texte environnante. En clair, elle copie la valeur de color du parent, même si celle-ci change. Idéalement, elle peut être appliquée aux attributs SVG fill et strokepar exemple :


  

.circle {
  color: pink; /* Définit la couleur du cercle */

  &:hover {
    color: hotpink; /* Change la couleur au survol */
  }
}

Bonnes pratiques pour les SVG inline

  • Utilisez currentColor pour que les éléments SVG héritent automatiquement de la couleur du texte parent (utilisez fill="currentColor" et/ou stroke="currentColor" pour les icônes qui doivent s'adapter à la couleur du texte),
  • Nettoyez vos SVG des attributs de style superflus (voir outils en fin d'article),
  • Ajoutez des classes pertinentes aux éléments que vous souhaitez cibler.

2. Styliser des SVG externes

Les fichiers SVG externes (balise ou background-image) sont naturellement plus capricieux à styliser du fait de leur principe de compartimentage : rien n'entre ni ne sort d'un SVG, ou presque.

Cas 1 : SVG externe modifiable

Si vous avez accès au fichier SVG, vous pouvez y incorporer des styles directement via l'élément

Limitations importantes :

  • Les valeurs doivent être stipulées en dur (pas de currentColor, ni de var(--ma-couleur))
  • Les interactions comme :hover fonctionnent uniquement dans certains contextes (SVG dans ou , pas dans )

    Cas 2 : SVG externe non modifiable (masques CSS)

    Cette technique utilise la propriété CSS mask pour appliquer une couleur à un SVG externe sans devoir le modifier.

    • Un élément HTML (comme un ) est utilisé comme conteneur,
    • Une couleur de fond (background-color) est appliquée à cet élément,
    • Le fichier SVG externe est utilisé comme masque via la propriété mask,
    • Seules les parties opaques du SVG laissent apparaître la couleur de fond.

    C'est comme si le SVG agissait comme un pochoir : il définit la forme visible, mais la couleur provient de l'élément HTML lui-même. La contrepartie est que la teinte sera forcément monochrome.

    
    
    
    .icon {
      /* Dimensions */
      display: inline-block;
      width: 1rem;
      height: 1rem;
    
      /* Couleur de l'icône (modifiable à volonté) */
      background-color: currentColor;
    
      /* Application du masque SVG */
      mask: var(--svg) no-repeat center;
      mask-size: contain;
    }
    
    .icon-star {
      --svg: url("icons/star.svg");
    }
    
    .icon-cart {
      --svg: url("icons/cart.svg");
    }
    
    /* Exemple d'interaction */
    .icon:hover {
      background-color: hotpink;
    }
    
    /* Exemple pour dark mode */
    @media (prefers-color-scheme: dark) {
      .icon {
        background-color: white;
      }
    }
    

    Voir une démo

    Les masques CSS en action :


    3. Utiliser l'élément pour optimiser vos SVG

    L'élément offre un excellent compromis en permettant de regrouper des SVG en "sprites" tout en gardant la possibilité de les styliser individuellement.

    Rassemblement de plusieurs (sprite)

    Chaque élément (ici, chaque icône) est défini dans un avec un ID unique, le tout regroupé dans unique. Ces symboles sont ensuite instanciés via .

    est un conteneur qui ne sera pas affiché directement, mais qui peut être utilisé pour créer des instances de ce symbole (des clones) ailleurs dans le document.

    
    
      
        
      
    
      
        
      
    
    

    Affichage d'un avec use

    use permet d'instancier chacun des symboles définis précédemment. Vous pouvez les placer où vous le souhaitez dans la page et les styliser comme n'importe quel autre SVG inline.

    
      
    
    
    
      
    
    
    .icon {
      width: 1rem;
      height: 1rem;
      fill: currentColor;
    
      &:hover {
        fill: hotpink;
      }
    }
    
    .icon-big {
      width: 2rem;
      height: 2rem;
    }
    

    Référencer un fichier SVG externe avec

    Il est également possible de faire référence à un fichier SVG externe contenant plusieurs symboles. Cette fonctionnalité évite de devoir insérer l'ensemble du sprite SVG de manière inline :

    
    
      
    
    

    Voir une démo

    Les sprites CSS en action :

    Remarques importantes :

    • Le SVG référencé doit être sur le même domaine ou avec CORS configuré (Cross-Origin Resource Sharing),
    • Le SVG doit contenir des éléments avec ID pour y faire référence.

    Des outils pour symbol et use

    Diverses applications permettent de faciliter la composition de symboles (sprites) de SVG.

    Pour commencer, l'excellente ressource Icônes.js du talentueux Anthony Fu propose une palette de plusieurs milliers d'icônes SVG récupérables dans tous les formats possibles (y compris frameworks) et notamment sous forme de symbol SVG.

    Option symbol" pour une icone SVG

    L'outil svgsprit.es quant à lui s'applique à générer votre sprite SVG à partir d'un lot de fichiers que vous lui téléversez.

    Outil pour générer des sprites SVG


    Adaptation au thème clair/sombre (Dark Mode)

    S'adapter au mode d'apparence (clair ou sombre) offre une expérience utilisateur souvent grandement améliorée. SVG est parfaitement malléable sur ce sujet également.

    Dark Mode avec SVG inline

    Manipuler le mode de couleurs des SVG inline est relativement simple. Il est possible d'utiliser :

    • currentColor pour que la couleur du SVG s'adapte à la couleur du texte parent,
    • light-dark() pour appliquer des couleurs spécifiques au SVG sans être dépendant de la couleur du parent,
    • des media queries pour appliquer des styles spécifiques selon le mode de l'utilisateur,
    • des attributs data pour appliquer des styles spécifiques selon le mode de l'utilisateur.
    
      
    
    
    .icon {
      /* S'adapte automatiquement à la couleur du texte */
      fill: currentColor;
    
      /* OU avec la fonction light-dark() */
      fill: light-dark(#333333, #ffffff);
    
      /* OU avec media query */
      @media (prefers-color-scheme: dark) {
        fill: #ffffff;
      }
    
      /* OU avec attribut data */
      [data-theme="dark"] & {
        fill: #ffffff;
      }
    }
    

    Dark Mode avec SVG externe modifiable

    Légèrement plus contraignant, il est possible ajouter un élément

    SVG et Dark Mode


    Bonnes pratiques et astuces

    Selon vos contraintes (SVG inline ou externe, modifiables ou non), divers scénarios permettent d'appliquer des styles CSS aux éléments SVG. Dans tous les cas, pensez à respecter quelques bonnes pratiques générales :

    1. Optimisez vos SVG : Utilisez des outils comme SVGOMG pour nettoyer vos fichiers SVG de métadonnées et attributs inutiles.
    2. Testez différentes approches : Utilisez la technique la plus adaptée selon le contexte. Un sprite SVG combiné avec est souvent la solution la plus flexible, mais aucune approche n'est réellement parfaite.
    3. Évitez les styles inline : Pour faciliter la maintenabilité et la cohérence des fichiers, préférez les styles "classiques" dans un fichier CSS plutôt que des styles inline ( dans le SVG applique des styles CSS (les styles sont compartimentés),
    4. Couleurs en dur (ex. fill/stroke="#FF69B4"), pas de currentColor, ni de var(--ma-couleur),
    5. Media Queries (dont dark mode) possibles.
    6. SVG via l'élément  : Facile à manipuler en CSS, mais nécessite une préparation préalable.
      • Chaque élément est un identifié via id, tous regroupés dans "sprite" et clonés via ,
      • Le sprite peut être un fichier SVG externe ou inline,
      • Tous les styles CSS sont appliquables comme pour les SVG inline.

    Ressources complémentaires

    Retrouvez l'intégralité de ce tutoriel en ligne sur Alsacreations.com

    Ce site utilise des cookies. En continuant à naviguer sur le site, vous acceptez notre utilisation des cookies.