Posso alterar a cor de preenchimento de um caminho svg com CSS?


200

Eu tenho o seguinte código:

  <span>
     <svg height="32" version="1.1" width="32" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative; left: -0.0166626px; top: -0.983337px;">
        <desc></desc>
        <defs/>
        <path style="" fill="#333333" stroke="none" d="M15.985,5.972C8.422,5.972,2.289999999999999,10.049,2.289999999999999,15.078C2.289999999999999,17.955,4.302999999999999...............1,27.68,22.274Z"/>
      </svg>&nbsp;
  </span>

É possível alterar a cor de preenchimento do caminho SVG com CSS ou algum outro meio sem realmente alterá-lo dentro da tag path?



Atualmente, você pode incluir e estilizar arquivos externos via <symbol>e <use>. Veja esta resposta .
totymedli 26/02

Respostas:


218

Sim, você pode aplicar CSS ao SVG, mas precisa corresponder ao elemento, assim como ao estilizar HTML. Se você quiser aplicá-lo a todos os caminhos SVG, use, por exemplo:

path {
    fill: blue;
}​

CSS externo parece substituir o fillatributo do caminho , pelo menos nos navegadores WebKit e Gecko que testei. Obviamente, se você escrever, digamos, <path style="fill: green">isso também substituirá o CSS externo.


7
Isso ainda funciona com o Chrome? Estou com dificuldades para alterar a cor do meu caminho SVG com CSS.
Dallas Clark

5
Obrigado Nicholas, acredito que encontrei o motivo. Meu SVG foi incorporado à página por meio de uma tag <img>, o CSS não parece capaz de modificar nenhum conteúdo. Isso está correto?
Dallas Clark

40
Lembre-se de que, para que o CSS possa estilizar o SVG, é necessário incluir o código SVG na marcação, não funcionará se você incluir o SVG por meio da <svg>tag.
Ricardo Zea

2
@RicardoZea Uma ressalva: você pode incluir um objeto de um arquivo SVG externo <use href="external.svg#objId" />e o CSS local ainda será aplicado em algum grau.
Ken Bellows

1
@KenBellows Isso é verdade, eu aprendi isso agora. Uma coisa a observar é que precisamos usar propriedades específicas do SVG no CSS, caso contrário não funcionará. Por exemplo, para alterar a cor de fundo usada em fill: #000;vez de background: #000;.
Ricardo Zea

39

se você quiser alterar a cor passando o mouse sobre o elemento, tente o seguinte:

path:hover{
  fill:red;
}

28

Se você digitar o código-fonte de um arquivo SVG, poderá alterar o preenchimento de cor modificando a propriedade de preenchimento.

<svg fill="#3F6078" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
</svg> 

Use seu editor de texto favorito, abra o arquivo SVG e brinque com ele.


2
Tecnicamente correto, com base na redação da pergunta "... outros meios sem realmente alterá-lo dentro do caminho" e funcionou exatamente como eu precisava. Tenha um voto positivo!
Travis Watson

5
Como isso é uma resposta? A questão é sobre CSS, não SVG nativo
zhuhang.jasper

2
Você tem uma resposta própria, Sr. Jasper?
Samuel Ramzan

2
Isto não é resposta. Essa é a distorção da questão.
QMaster 9/03

16

você coloca esse css para o círculo svg.

svg:hover circle{
    fill: #F6831D;
    stroke-dashoffset: 0;
    stroke-dasharray: 700;
    stroke-width: 2;
}

8

Me deparei com um recurso incrível em css-tricks: https://css-tricks.com/using-svg/

Existem algumas soluções explicadas lá.

Eu preferi o que exigia edições mínimas ao svg de origem e também não exigia que ele fosse incorporado ao documento html. Esta opção utiliza a <object>tag.


Adicione o arquivo svg ao seu html usando <object>; Eu também declarei atributos html widthe height. Usando essas larguras e alturas, o documento svg não é dimensionado, resolvi isso usando uma transform: scale(...)instrução css para a svgtag no meu arquivo svg css associado.

<object type="image/svg+xml" data="myfile.svg" width="64" height="64"></object>

Crie um arquivo css para anexar ao seu documento svn. Meu caminho svg de origem foi redimensionado para 16px, eu o ampliei para 64 com um fator de quatro. Ele tinha apenas um caminho, então não precisei selecioná-lo mais especificamente, no entanto, o caminho tinha um atributo de preenchimento, então tive que usar !IMPORTANTpara forçar o css a ter precedência.

#svg2 {
    width: 64px; height: 64px;
    transform: scale(4);
}
path {
    fill: #333 !IMPORTANT;
}

Edite seu arquivo svg de destino, antes da <svgtag de abertura , para incluir uma folha de estilo; Observe que o href é relativo ao URL do arquivo svg.

<?xml-stylesheet type="text/css" href="myfile.css" ?>

4

Você pode usar essa sintaxe, mas será necessário fazer algumas alterações no arquivo SVG. E remova qualquer preenchimento / traço do próprio SVG.

icon.svg

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">
<!-- use symbol instead of defs and g, 
  must add viewBox on symbol just copy yhe viewbox from the svg tag itself
  must add id on symbol
-->
<symbol id="location" viewBox="0 0 430.114 430.114">
  <!-- add all the icon's paths and shapes here -->
  <path d="M356.208,107.051c-1.531-5.738-4.64-11.852-6.94-17.205C321.746,23.704,261.611,0,213.055,0   C148.054,0,76.463,43.586,66.905,133.427v18.355c0,0.766,0.264,7.647,0.639,11.089c5.358,42.816,39.143,88.32,64.375,131.136   c27.146,45.873,55.314,90.999,83.221,136.106c17.208-29.436,34.354-59.259,51.17-87.933c4.583-8.415,9.903-16.825,14.491-24.857   c3.058-5.348,8.9-10.696,11.569-15.672c27.145-49.699,70.838-99.782,70.838-149.104v-20.262   C363.209,126.938,356.581,108.204,356.208,107.051z M214.245,199.193c-19.107,0-40.021-9.554-50.344-35.939   c-1.538-4.2-1.414-12.617-1.414-13.388v-11.852c0-33.636,28.56-48.932,53.406-48.932c30.588,0,54.245,24.472,54.245,55.06   C270.138,174.729,244.833,199.193,214.245,199.193z"/>
</symbol>

icon.html

<svg><use xlink:href="file_path/location.svg#location"></use></svg>

„Remover qualquer preenchimento / traçado“ - remover o preenchimento e o traçado pode quebrar os svg (pelo menos os meus fazem isso, quando fazem isso na minha ideia e observam o resultado em uma janela de visualização). Alternativamente, pode-se usarcurrentColor
Frank Nocke

4

É possível alterar a cor do preenchimento do caminho do svg. Veja abaixo o trecho CSS:

  1. Para aplicar a cor a todo o caminho: svg > path{ fill: red }

  2. Para aplicar para o primeiro caminho d: svg > path:nth-of-type(1){ fill: green }

  3. Para aplicar para o segundo caminho d: svg > path:nth-of-type(2){ fill: green}

  4. Para solicitar o caminho d diferente, altere apenas o número do caminho:
    svg > path:nth-of-type(${path_number}){ fill: green}

  5. Para dar suporte ao CSS no Angular 2 a 8, use o conceito de encapsulamento:

:host::ng-deep svg path:nth-of-type(1){
        fill:red;
    }

2

Coloque todo o seu svg:

fill="var(--svgcolor)"

Em Css:

:root {
  --svgcolor: tomato;
}

Para usar pseudo-classes:

span.github:hover {
  --svgcolor:aquamarine;
}

Explicação

raiz = página html.
--svgcolor = uma variável.
span.github = selecionando um elemento span com um github de classe, um ícone svg dentro e atribuindo um pseudo-class pair.


Bem-vindo ao StackOverflow, Neto. Parece uma boa resposta. Obrigado por ajudar.
srm 10/06
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.