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.