改变svg颜色

时间:2014-03-07 14:15:04

标签: css svg

我想使用这种技术http://css-tricks.com/svg-fallbacks/并更改svg颜色,但到目前为止我还没能这样做。我把它放在css中,但不管是什么,我的形象总是黑的。我的代码:

.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>

27 个答案:

答案 0 :(得分:135)

要更改任何SVG的颜色,您可以通过在任何文本编辑器中打开svg文件直接更改svg代码。代码可能类似于以下代码

<?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>

您可以观察到某些XML标记,如路径,圆形,多边形等。在那里,您可以借助样式属性添加自己的颜色。请看下面的例子

<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"/>

将样式属性添加到所有标记,以便您可以获得所需颜色的SVG

答案 1 :(得分:101)

您不能以这种方式更改图像的颜色。如果您将SVG作为图像加载,则无法在浏览器中更改使用CSS或Javascript显示的方式。

如果您想更改SVG图片,则必须使用<object><iframe>或内联<svg>加载它。

如果要使用页面中的技术,则需要Modernizr库,您可以在其中检查SVG支持并有条件地显示或不显示后备图像。然后,您可以内联SVG并应用所需的样式。

见:

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

.my-svg-alternate {
  display: none;
}
.no-svg .my-svg-alternate {
  display: block;
  width: 100px;
  height: 100px;
  background-image: url(image.png);
}
<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" d="M256,50C142.229,50,50,142.229,50,256c0,113.77,92.229,206,206,206c113.77,0,206-92.23,206-206
	C462,142.229,369.77,50,256,50z M256,417c-88.977,0-161-72.008-161-161c0-88.979,72.008-161,161-161c88.977,0,161,72.007,161,161
	C417,344.977,344.992,417,256,417z M382.816,265.785c1.711,0.297,2.961,1.781,2.961,3.518v0.093c0,1.72-1.223,3.188-2.914,3.505
	c-37.093,6.938-124.97,21.35-134.613,21.35c-13.808,0-25-11.192-25-25c0-9.832,14.79-104.675,21.618-143.081
	c0.274-1.542,1.615-2.669,3.181-2.669h0.008c1.709,0,3.164,1.243,3.431,2.932l18.933,119.904L382.816,265.785z"/>
</svg>

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

您可以内联SVG,使用班级名称(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" />

在CSS中使用Modernizr的no-svg类(CDN:http://ajax.aspnetcdn.com/ajax/modernizr/modernizr-2.7.2.js)来检查SVG支持。如果没有SVG支持,将忽略SVG块并显示图像,否则图像将从DOM树中删除(display: none):

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

然后您可以更改内联元素的颜色:

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

答案 2 :(得分:73)

我遵循的更改SVG颜色的步骤:

  • 首先,使用 img 标签添加SVG图片。
 <img src="dotted-arrow.svg" class="filter-green"/>

例如,#00EE00 的输出是

filter: invert(42%) sepia(93%) saturate(1352%) hue-rotate(87deg) brightness(119%) contrast(119%);
  • 创建一个新类并将此过滤器添加到该类中。
.filter-green{
    filter: invert(48%) sepia(79%) saturate(2476%) hue-rotate(86deg) brightness(118%) contrast(119%);
}
  • 现在将此类添加到图像标签,SVG的颜色将更改为我们提供的十六进制。

答案 3 :(得分:23)

添加了测试页 - 通过过滤器设置为SVG着色:

E.G filter: invert(0.5) sepia(1) saturate(5) hue-rotate(175deg)

Upload & Color your SVG - Jsfiddle

https://blog.union.io/code/2017/08/10/img-svg-fill/

接受了这个想法

答案 4 :(得分:8)

最简单的方法是使用https://icomoon.io/app/#/select等服务从SVG创建字体。上传你的SVG,点击&#34;生成字体&#34;,将字体文件和css包含在你身边,然后像其他任何文字一样使用和设置样式。我总是这样使用它,因为它使造型更容易。

编辑:正如article中所提及的@ CodeMouse92图标字体搞砸屏幕阅读器(并且可能对搜索引擎优化不利)。所以要坚持使用SVG。

答案 5 :(得分:7)

您可以尝试使用过滤器黑客:

.colorize-pink {
  filter: brightness(0.5) sepia(1) hue-rotate(-70deg) saturate(5);
}

.colorize-navy {
  filter: brightness(0.2) sepia(1) hue-rotate(180deg) saturate(5);
}

.colorize-blue {
  filter: brightness(0.5) sepia(1) hue-rotate(140deg) saturate(6);
}

答案 6 :(得分:6)

仅包含路径信息的SVG 。你无法对图像这样做..作为你可以改变笔划和填充信息的路径,你就完成了。 喜欢Illustrator

所以:通过CSS你可以覆盖路径fill

path { fill: orange; }

但是如果您想要更灵活的方式,因为您希望在进行一些悬停效果时使用文本进行更改..使用

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>

答案 7 :(得分:5)

如果使用一些技巧,可以使用css更改SVG着色。 我写了一个小脚本。

  • 浏览具有svg图像的元素列表
  • 将svg文件加载为xml
  • 仅获取svg part
  • 更改路径的颜色
  • 将src替换为修改后的svg作为内嵌图像
$('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')));
  });

});

上面的代码可能无法正常工作,我已经为具有svg背景图像的元素实现了这一点,该图像与此类似。 但无论如何你必须修改这个脚本以适合你的情况。希望它有所帮助。

答案 8 :(得分:5)

要更改 SVG 元素的颜色,我在检查下面的 Google 搜索框搜索图标时找到了一种方法:

.search_icon {
  color: red;
  fill: currentColor;
  display: inline-block;
  width: 100px;
  height: 100px;
}
<span class="search_icon">
    <svg focusable="false" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M15.5 14h-.79l-.28-.27A6.471 6.471 0 0 0 16 9.5 6.5 6.5 0 1 0 9.5 16c1.61 0 3.09-.59 4.23-1.57l.27.28v.79l5 4.99L20.49 19l-4.99-5zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z"></path></svg>
</span>

我使用了带有“display:inline-block”、高度、宽度的 span 元素,并将特定样式“color: red; fill: currentColor;”设置为由继承的 span 标签子 svg 元素。

答案 9 :(得分:4)

定位svg中的路径:

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

您可以内联,例如:

<path fill="#ccc">

svg{
   path{
        fill: #ccc

答案 10 :(得分:3)

只需更改svg的颜色:

转到svg文件并在样式下,提及填充颜色。

<style>.cls-1{fill:#FFFFFF;}</style>

答案 11 :(得分:3)

这里是速度与激情的方式:)

 body{
 background-color: #deff05;
 }
 
 svg{
   width: 30%;
    height: auto;
 }
 
 svg path {
    color:red;
    fill: currentcolor;
}
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 514.666 514.666"><path d="M514.666,210.489L257.333,99.353L0,210.489l45.933,19.837v123.939h30V243.282l33.052,14.274v107.678l4.807,4.453  c2.011,1.862,50.328,45.625,143.542,45.625c93.213,0,141.53-43.763,143.541-45.626l4.807-4.452V257.557L514.666,210.489z   M257.333,132.031L439,210.489l-181.667,78.458L75.666,210.489L257.333,132.031z M375.681,351.432  c-13.205,9.572-53.167,33.881-118.348,33.881c-65.23,0-105.203-24.345-118.348-33.875v-80.925l118.348,51.112l118.348-51.111  V351.432z"></path></svg>

答案 12 :(得分:3)

  1. 方法1

简单有效的方法

使用任何文本编辑器打开.svg文件

<svg version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" 
   xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
   viewBox="0 0 477.526 477.526" style="enable-background:new 0 0 477.526 477.526; 
   fill: rgb(109, 248, 248);" xml:space="preserve"> 
<svg />

赋予样式属性并用颜色填充

  1. 另一种方式

在您的形状中填充颜色,我具有 rect 形状fill="white

<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
      <g>
          <title>background</title>
          <rect fill="#fff" id="canvas_background" height="602" width="802" y="-1" 
           x="-1"/>
           <g display="none" overflow="visible" y="0" x="0" height="100%" width="100%" 
           id="canvasGrid">
              <rect fill="url(#gridpattern)" stroke-width="0" y="0" x="0" height="100%" 
              width="100%"/>
           </g>
       </g>
</svg>

答案 13 :(得分:1)

解决方案 1 - 编辑 SVG 以指向 currentColor

<svg>... fill: currentColor stroke: currentColor ...</svg>

然后你可以从你的css中控制笔触的颜色和填充

svg {
  color: blue; // or any color of your choice.
}

优缺点:

  • 简单并使用传统的受支持的 css。

适用于:

  • 您可以控制 SVG
  • SVG 可以内嵌在 HTML 中。

解决方案 2 - css 掩码属性

<i class="icon"></i>
.icon {
  -webkit-mask-size: cover;
  mask-size: cover;
  -webkit-mask-image: url(https://url.of.svg/....svg);
  mask-image: url(https://url.of.svg/....svg);
  background-color: blue; // or any color of your choice.
  width: 20px; 
  height: 20px; 
}
}

优缺点

  • 相对容易使用
  • 浏览器对 mask css 属性的支持是部分的。

适用于:

  • SVG 是外部的,通过 URL 包含
  • 旨在用于现代已知浏览器。

解决方案 3 - css Filter 属性 - 静态颜色

如果预先知道颜色,您可以使用 https://codepen.io/sosuke/pen/Pjoqqp 找到将 SVG 更改为所需颜色所需的过滤器。例如,要将 svg 转换为 #00f

<img src="https://url.of.svg/....svg" class="icon">
.icon {
    filter: invert(8%) sepia(100%) saturate(6481%) hue-rotate(246deg) brightness(102%) contrast(143%); 
}

如果您的原始颜色不是黑色,则在过滤器列表前添加 brightness(0) saturate(100%) 以将其先转换为黑色。

优缺点:

  • 结果与所需颜色之间可能存在微小但不显着的差异。

适用于:

  • 预先知道所需的颜色。
  • 外部图片

答案 14 :(得分:1)

使用 svg <mask> 元素。

这比其他解决方案更好,因为:

  • 与您的原始代码非常匹配。
  • 可在 IE 中使用!
  • 嵌入的图像仍然可以是未修改的外部文件。
  • 图像甚至不必是 SVG。
  • 颜色继承自 font-color,因此易于与文本一起使用。
  • 颜色是普通的 CSS 颜色,而不是过滤器的奇怪组合。

<svg style="color: green; width: 96px; height: 96px" viewBox="0 0 100 100" preserveAspectRatio="none">
  <defs>
    <mask id="fillMask" x="0" y="0" width="100" height="100">
      <image xlink:href="https://svgur.com/i/AFM.svg" x="0" y="0" width="100" height="100" src="ppngfallback.png" />
    </mask>
  </defs>
  <rect x="0" y="0" width="100" height="100" style="stroke: none; fill: currentColor" mask="url(&quot;#fillMask&quot;)" />
</svg>

https://jsfiddle.net/jamiegl/5jaL0s1t/19/

答案 15 :(得分:1)

实际上,对于此问题有一个更为灵活的解决方案:编写一个Web Component,它将在运行时将SVG修补为文本。还发布在gist中,并带有指向JSFiddle的链接

?滤镜:反转(42%)棕褐色(93%)饱和(1352%)色相旋转(87deg)亮度(119%)对比度(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>

答案 16 :(得分:1)

例如,在您的HTML中:

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

使用jQuery:

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

答案 17 :(得分:1)

具有背景颜色的框元素上的SVG mask将导致:

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

.icon-bike{
  background: black;
  -webkit-mask-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/icon-bike-black.svg);
  mask-image: url(https://s3-us-west-2.amazonaws.com/s.cdpn.io/3/icon-bike-black.svg);
}

.icon-bike:hover{
  background: green;
}
<i class="icon icon-bike" style="--size:150px"></i>

答案 18 :(得分:1)

如果你想对内联svg执行此操作,例如,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");

当然,用您的内联图片代码替换...

答案 19 :(得分:0)

一个好的方法是使用mixin来控制笔触颜色和填充颜色。我的svg用作图标。

@mixin icon($color, $hoverColor) {
    svg {
        fill: $color;

        circle, line, path {
            fill: $color
        }

        &:hover {
            fill: $hoverColor;

            circle, line, path {
                fill: $hoverColor;
            }
        }
    }
}

然后您可以在scss中执行以下操作:

.container {
    @include icon(white, blue);
}

答案 20 :(得分:0)

如果要动态更改颜色:

  1. 在代码编辑器中打开svg
  2. fill的属性添加或重写到此fill="currentColor"
  3. 现在,该svg将采用字体颜色,因此您可以执行以下操作:
svg {
    color : "red";
}

答案 21 :(得分:0)

最短的Bootstrap兼容方式,没有JavaScript:

#include <iostream>
using namespace std;

int main() {
    char a;

    for (char a = 0; a <= 127; a++)
    {
        cout << a << " ";
        if (a % 16 == 0)
            cout << endl;
        if (a > 127)
            break;
    }
    return 0;
}

并像这样使用它:

.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;
}

答案 22 :(得分:0)

如果你想用css来改变颜色,你也可以使用这样的在线工具:https://change-svg-color.vercel.app/

答案 23 :(得分:0)

如果要对 svg 的颜色进行编程,则不应直接在 svg 图像上设置颜色。

2021年可以使用下面的css进行颜色的改变。

html{
  --iron-icon-fill-color-1:green;
  --iron-icon-fill-color-2:red;
  --iron-icon-stroke-color:white;
}


svg#icon-green{
  fill: var(--iron-icon-fill-color-1, currentcolor);
  stroke: var(--iron-icon-stroke-color, none);
}
svg#icon-red{
  fill: var(--iron-icon-fill-color-2, currentcolor);
  stroke: var(--iron-icon-stroke-color, none);
}
svg#icon{
  fill: var(--iron-icon-fill-color-x, currentcolor);
  stroke: white;
}
<html>
<body>
<svg id="icon-green" xmlns="http://www.w3.org/2000/svg" width="40px" height="40px" style="vertical-align:text-bottom" viewbox="0 0 40 40">
  <circle cx="20" cy="20" r="18" stroke-width="3"/>
  <path d="M 10,10 30,30 M 10,30 30,10" fill="none"  stroke-width="6"/>
</svg>


<svg id="icon-red" xmlns="http://www.w3.org/2000/svg" width="40px" height="40px" style="vertical-align:text-bottom" viewbox="0 0 40 40">
  <circle cx="20" cy="20" r="18" stroke-width="3"/>
  <path d="M 10,10 30,30 M 10,30 30,10" fill="none"  stroke-width="6"/>
</svg>

<svg id="icon" xmlns="http://www.w3.org/2000/svg" width="40px" height="40px" style="vertical-align:text-bottom" viewbox="0 0 40 40">
  <circle cx="20" cy="20" r="18" stroke-width="3"/>
  <path d="M 10,10 30,30 M 10,30 30,10" fill="none"  stroke-width="6"/>
</svg>

</body>

</html>

答案 24 :(得分:0)

@Manish Menaria 的回答存在一些问题,如果我们将白色转换为灰色,则显示为灰色。

所以添加了一些调整,下面的例子具体展示了如何改变材质图标的颜色

<mat-icon class="draft-white" svgIcon="draft" aria-hidden="false"></mat-icon>


.draft-white{
    filter: brightness(0) invert(1);
}

答案 25 :(得分:-1)

只需在图像的svg标签中添加fill:“ desiredColor”: 例如:

<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>

答案 26 :(得分:-1)

使用浏览器打开图像,右键单击图像,然后单击查看页面源,您将看到图像的svg标签。应对并粘贴到您的html中,然后将填充颜色更改为您选择的颜色