Come cambiare il colore di un elemento svg?


352

Voglio usare questa tecnica http://css-tricks.com/svg-fallbacks/ e cambiare il colore svg ma finora non sono stato in grado di farlo. L'ho messo nel CSS ma la mia immagine è sempre nera, non importa quale. Il mio codice:

.change-my-color {
  fill: green;
}
<svg>
    <image class="change-my-color" xlink:href="https://svgur.com/i/AFM.svg" width="96" height="96" src="ppngfallback.png" />
</svg>


Non sono un esperto di svg, ma hai provato a cambiare il riempimento con il colore di sfondo?
— Meg

@Megan in svg background-color è specificato con la proprietà 'fill' e il bordo con 'stroke' (come faresti in Illustrator). w3.org/TR/SVG/propidx.html
— Barbara

4
I CSS del tuo documento HTML non si applicheranno agli elementi SVG entro <img />
— pawel

1
Questo è possibile ora. Risposta semplice e funzionale qui: stackoverflow.com/a/53336754/467240
— mtyson

Risposte:


189

Non puoi cambiare il colore di un'immagine in quel modo. Se carichi SVG come immagine, non puoi cambiare il modo in cui viene visualizzato usando CSS o Javascript nel browser.

Se si desidera cambiare la vostra immagine in formato SVG, è necessario caricare utilizzando <object>, <iframe>o utilizzando <svg>in linea.

Se si desidera utilizzare le tecniche nella pagina, è necessaria la libreria Modernizr, in cui è possibile verificare il supporto SVG e visualizzare in modo condizionale o meno un'immagine di fallback. Puoi quindi incorporare il tuo SVG e applicare gli stili di cui hai bisogno.

Vedi:

Puoi incorporare il tuo SVG, taggare l'immagine di fallback con un nome di classe ( my-svg-alternate):

<svg width="96px" height="96px" viewBox="0 0 512 512" enable-background="new 0 0 512 512" xml:space="preserve">
<path id="time-3-icon" .../>
</svg>

<image class="my-svg-alternate" width="96" height="96" src="ppngfallback.png" />

E nei CSS usa la no-svgclasse di Modernizr (CDN: http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.7.2.js ) per verificare il supporto SVG. Se non è presente alcun supporto SVG, il blocco SVG verrà ignorato e l'immagine verrà visualizzata, altrimenti l'immagine verrà rimossa dall'albero DOM ( display: none):

.my-svg-alternate {
  display: none;
}
.no-svg .my-svg-alternate {
  display: block;
  width: 100px;
  height: 100px;
  background-image: url(image.png);
}

Quindi puoi cambiare il colore dell'elemento inline:

#time-3-icon {
   fill: green;
}

5
Non è possibile objectmodellare SVG incorporati dal documento di hosting.
— Javier Rey,

1
@JavierRey potresti inserire lo stile nel contenuto del tag oggetto tramite javascript. Ma hai ragione che non si applica se lo aggiungi al foglio di stile del documento di hosting.
— Robert Longson,

2
Sto usando la soluzione di @ manish-menaria e funziona perfettamente.
— Ryan Ellis

1
Risposta accettata deve essere cambiata in: stackoverflow.com/a/53336754/467240
— mtyson

377

2020 risposta

Il filtro CSS funziona su tutti i browser correnti

Per cambiare qualsiasi colore SVG

  1. Aggiungi l'immagine SVG usando un <img>tag.
<img src="dotted-arrow.svg" class="filter-green"/>
  1. Per filtrare un colore specifico, utilizzare il seguente codice (fare clic qui per aprire il codice) per convertire un codice di colore esadecimale in un filtro CSS:

Ad esempio, l'output per #00EE00è

filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);
  1. Aggiungi il CSS filterin questa classe.
    .filter-green{
        filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);
    }

5
Questo viene fornito con il solito avvertimento di non essere supportato nelle versioni precedenti del browser: developer.mozilla.org/en-US/docs/Web/CSS/…
— Kevin Wang

17
Come notato in CodePen, se il tuo SVG non è nero (il mio era grigio), l'aggiunta brightness(0) saturate(100%)all'inizio dell'elenco dei filtri lo renderà prima nero al 100%, il che consente agli altri filtri di cambiarlo con il colore corretto.
— jdunning,

2
Inoltre, molti affascinanti retroscena sulla soluzione in questa domanda StackOverflow che ha informato CodePen.
— jdunning,

3
Il mio ragazzo. Il supporto sembra accettabile caniuse.com/#feat=css-filters .
— Sam Doidge,

funziona così bene, ho usato questo codice non affiliato per mettere il mio esagono in un filtro: codepen.io/sosuke/pen/Pjoqqp
— WEBjuju

220

Per cambiare il colore di qualsiasi SVG puoi cambiare direttamente il codice svg aprendo il file svg in qualsiasi editor di testo . Il codice potrebbe apparire come il seguente codice

<?xml version="1.0" encoding="utf-8"?>
    <!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
    <!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" x="0px" y="0px"
         width="500px" height="500px" viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
    <g>
        <path d="M114.26,436.584L99.023,483h301.953l-15.237-46.416H114.26z M161.629,474.404h-49.592l9.594-29.225h69.223
            C181.113,454.921,171.371,464.663,161.629,474.404z"/>
    /*Some more code goes on*/
    </g>
    </svg>

Puoi osservare che ci sono alcuni tag XML come percorso, cerchio, poligono ecc . Lì puoi aggiungere il tuo colore con l'aiuto dell'attributo style . Guarda l'esempio seguente

<path style="fill:#AB7C94;" d="M114.26,436.584L99.023,483h301.953l-15.237-46.416H114.26z M161.629,474.404h-49.592l9.594-29.225h69.223
                C181.113,454.921,171.371,464.663,161.629,474.404z"/>

Aggiungi l'attributo di stile a tutti i tag in modo da poter ottenere il tuo SVG del colore richiesto


48
Perché non usare solo attributi fillcome questo fill = "#AB7C94":? Non sono sicuro del motivo per cui l' styleattributo è necessario
— bg17aw,

4
Ciao Daniel, sì, funziona. Non sapevo che il riempimento potesse essere usato come attributo. Ci scusiamo per non aver notato il tuo commento così a lungo @ bg17aw
— sushant047


21

Solo SVG con informazioni sul percorso . non puoi farlo all'immagine .. come percorso puoi cambiare il tratto e riempire le informazioni e il gioco è fatto. come Illustrator

quindi: tramite CSS è possibile sovrascrivere il fillvalore del percorso

path { fill: orange; }

ma se vuoi un modo più flessibile come vuoi cambiarlo con un testo quando hai qualche effetto hovering in corso ... usa

path { fill: currentcolor; }

body {
  background: #ddd;
  text-align: center;
  padding-top: 2em;
}

.parent {
  width: 320px;
  height: 50px;
  display: block;
  transition: all 0.3s;
  cursor: pointer;
  padding: 12px;
  box-sizing: border-box;
}

/***  desired colors for children  ***/
.parent{
  color: #000;
  background: #def;
}
.parent:hover{
  color: #fff;
  background: #85c1fc;
}

.parent span{
  font-size: 18px;
  margin-right: 8px;
  font-weight: bold;
  font-family: 'Helvetica';
  line-height: 26px;
  vertical-align: top;
}
.parent svg{
  max-height: 26px;
  width: auto;
  display: inline;
}

/****  magic trick  *****/
.parent svg path{
  fill: currentcolor;
}
<div class='parent'>
  <span>TEXT WITH SVG</span>
  <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="128" height="128" viewBox="0 0 32 32">
<path d="M30.148 5.588c-2.934-3.42-7.288-5.588-12.148-5.588-8.837 0-16 7.163-16 16s7.163 16 16 16c4.86 0 9.213-2.167 12.148-5.588l-10.148-10.412 10.148-10.412zM22 3.769c1.232 0 2.231 0.999 2.231 2.231s-0.999 2.231-2.231 2.231-2.231-0.999-2.231-2.231c0-1.232 0.999-2.231 2.231-2.231z"></path>
</svg>
</div>


12

il modo più semplice sarebbe creare un font dall'SVG usando un servizio come https://icomoon.io/app/#/select o simili. carica il tuo SVG, fai clic su "genera carattere", includi file di caratteri e CSS nella tua parte e usalo e modellalo come qualsiasi altro testo. Lo uso sempre così perché rende lo styling molto più semplice.

EDIT: Come menzionato nel articolo commentato da @ CodeMouse92 icona font rovinare i lettori di schermo (e sono forse un male per SEO). Quindi piuttosto attenersi agli SVG.


5
Inoltre confonde gli screen reader. Vedi "Death to Icon Fonts" di Seren Davies
— CodeMouse92

7

La maschera SVG su un elemento casella con un colore di sfondo risulterà:

.icon{
  --size     : 70px;
  display    : inline-block;
  width      : var(--size);
  height     : var(--size);
  transition : .12s;
  -webkit-mask-size: cover;
  mask-size  : cover;
}

.icon-bike{
  background: black;
  -webkit-mask-image: url(https://image.flaticon.com/icons/svg/89/89139.svg);
  mask-image: url(hhttps://image.flaticon.com/icons/svg/89/89139.svg);
  animation: 1s frames infinite ease;
}

@keyframes frames {
  50% { background:red;  }
}
<i class="icon icon-bike" style="--size:150px"></i>


Nota: le maschere SVG non sono supportate nei browser Internet Explorer


1
Grazie mille, @vsync questo è solo il miglior trucco per ciò di cui ho bisogno.
— Vixson,

6

È possibile modificare la colorazione SVG con CSS se si utilizzano alcuni trucchi. Ho scritto una piccola sceneggiatura per questo.

  • passare attraverso un elenco di elementi che hanno un'immagine in formato svg
  • carica il file svg come xml
  • recupera solo la parte svg
  • cambia colore del percorso
  • sostituisci src con lo svg modificato come immagine incorporata
$('img.svg-changeable').each(function () {
  var $e = $(this);
  var imgURL = $e.prop('src');

  $.get(imgURL, function (data) {
    // Get the SVG tag, ignore the rest
    var $svg = $(data).find('svg');

    // change the color
    $svg.find('path').attr('fill', '#000');

    $e.prop('src', "data:image/svg+xml;base64," + window.btoa($svg.prop('outerHTML')));
  });

});

il codice sopra potrebbe non funzionare correttamente, l'ho implementato per gli elementi con un'immagine di sfondo svg che funziona in modo simile a questo. Ma comunque devi modificare questo script per adattarlo al tuo caso. spero che abbia aiutato.


A proposito: se sei uno sviluppatore RoR, puoi aggiungere un nuovo metodo per il precompilatore sass che può fare anche il lavoro. Questo è molto meglio perché avrai il colore64 corretto codificato base64 nel tuo file CSS compilato. Non è più necessario JS! Forse potrei fornire il codice che ho scritto, parlare con il CTO.
— cydoc,

2
+1 per fornire una soluzione, piuttosto che dire che non può essere fatto. Questa risposta è anche rilevante: stackoverflow.com/questions/11978995/...
— claytronicon

6

Indirizza il percorso all'interno dello svg:

<svg>
   <path>....
</svg>

Puoi fare in linea, come:

<path fill="#ccc">

O

svg{
   path{
        fill: #ccc


2

Se vuoi farlo con uno svg in linea che è, ad esempio, un'immagine di sfondo nel tuo css:

background: url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='rgba(31,159,215,1)' viewBox='...'/%3E%3C/svg%3E");

ovviamente, sostituisci il ... con il tuo codice immagine incorporato


2

Ad esempio, nel tuo HTML:

<body>
  <svg viewBox="" width="" height="">
    <path id="struct1" fill="#xxxxxx" d="M203.3,71.6c-.........."></path>
  </svg>
</body>

Usa jQuery:

$("#struct1").css("fill","<desired colour>");

Funziona solo se includi il file SVG in linea nell'HTML. Ho modificato la tua risposta per chiarirlo.
— Flimm,

0

In realtà, esiste una soluzione molto più flessibile a questo problema: scrivere un componente Web che correggerà SVG come testo in fase di esecuzione. Anche pubblicato in sintesi con un link a JSFiddle

👍 filtro: inverti (42%) seppia (93%) saturo (1352%) tonalità-rotazione (87 gradi) luminosità (119%) contrasto (119%);

<html>

<head>
  <title>SVG with color</title>
</head>

<body>
  <script>
    (function () {
      const createSvg = (color = '#ff9933') => `
          <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="76px" height="22px" viewBox="-0.5 -0.5 76 22">
            <defs/>
              <g>
                <ellipse cx="5" cy="10" rx="5" ry="5" fill="#ff9933" stroke="none" pointer-events="all"/>
                <ellipse cx="70" cy="10" rx="5" ry="5" fill="#ff9933" stroke="none" pointer-events="all"/>
                <path d="M 9.47 12.24 L 17.24 16.12 Q 25 20 30 13 L 32.5 9.5 Q 35 6 40 9 L 42.5 10.5 Q 45 12 50 6 L 52.5 3 Q 55 0 60.73 3.23 L 66.46 6.46" fill="none" stroke="#ff9933" stroke-miterlimit="10" pointer-events="stroke"/>
              </g>
          </svg>`.split('#ff9933').join(color);

      function SvgWithColor() {
        const div = Reflect.construct(HTMLElement, [], SvgWithColor);
        const color = div.hasAttribute('color') ? div.getAttribute('color') : 'cyan';
        div.innerHTML = createSvg(color);
        return div;
      }

      SvgWithColor.prototype = Object.create(HTMLElement.prototype);
      customElements.define('svg-with-color', SvgWithColor);

      document.body.innerHTML += `<svg-with-color
        color='magenta' 
      ></svg-with-color>`;

    })();

  </script>
</body>

</html>

-1

il modo più breve compatibile con Bootstrap, senza JavaScript:

.cameraicon {
height: 1.6em;/* set your own icon size */
mask: url(/camera.svg); /* path to your image */
-webkit-mask: url(/camera.svg) no-repeat center;
}

e usalo come:

<td class="text-center">
    <div class="bg-secondary cameraicon"/><!-- "bg-secondary" sets actual color of your icon -->
</td>

-1

Apri la tua immagine usando un browser, fai clic destro sull'immagine, fai clic su Visualizza sorgente pagina e vedrai il tag svg dell'immagine. Copia e incolla nel tuo html, quindi cambia il riempimento con il colore che preferisci


La risposta accettata suggerisce già di allineare e quindi impostare il colore come soluzione.
— Robert Longson,

-1

Aggiungi semplicemente riempimento: "desideratoColore" nel tag svg dell'immagine: esempio:

<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="#bbb9c6">
<path d="M20 2H4c-1.1 0-1.99.9-1.99 2L2 22l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-2 12H6v-2h12v2zm0-3H6V9h12v2zm0-3H6V6h12v2z"/><path d="M0 0h24v24H0z" fill="none"/></svg>

Questo è fondamentalmente lo stesso suggerimento di questa risposta o questa
— Robert Longson,

quelle risposte hanno menzionato compilare il tag path, ha funzionato per me nel tag svg, quindi l'ho pubblicato
— Shivani
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.