关于css:img src SVG更改填充颜色

img src SVG changing the fill color

HTML

1
<img src="logo.svg" alt="Logo" class="logo-img">

CSS

1
2
3
.logo-img path {
  fill: #000;
}

上面的svg加载并且本机是fill: #fff,但是当我使用上面的css尝试将其更改为黑色时,它并没有改变,这是我第一次使用SVG,我不确定为什么它不起作用。


您需要使SVG成为嵌入式SVG。您可以通过在图像中添加类svg来使用此脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/*
 * Replace all SVG images with inline SVG
 */

jQuery('img.svg').each(function(){
    var $img = jQuery(this);
    var imgID = $img.attr('id');
    var imgClass = $img.attr('class');
    var imgURL = $img.attr('src');

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

        // Add replaced image's ID to the new SVG
        if(typeof imgID !== '
undefined') {
            $svg = $svg.attr('
id', imgID);
        }
        // Add replaced image'
s classes to the new SVG
        if(typeof imgClass !== 'undefined') {
            $svg = $svg.attr('class', imgClass+' replaced-svg');
        }

        // Remove any invalid XML tags as per http://validator.w3.org
        $svg = $svg.removeAttr('xmlns:a');

        // Check if the viewport is set, if the viewport is not set the SVG wont't scale.
        if(!$svg.attr('
viewBox') && $svg.attr('height') && $svg.attr('width')) {
            $svg.attr('
viewBox', '0 0 ' + $svg.attr('height') + ' ' + $svg.attr('width'))
        }

        // Replace image with new SVG
        $img.replaceWith($svg);

    }, '
xml');

});

然后,如果您这样做:

1
2
3
.logo-img path {
  fill: #000;
}

或者可能:

1
2
3
.logo-img path {
  background-color: #000;
}

这可行!

小提琴:http://jsfiddle.net/wuSF7/462/

以上脚本的功劳:使用CSS和jQuery更改SVG图像的颜色,以及如何使用CSS更改SVG图像的颜色(jQuery SVG图像替换)?


如果您的目标只是更改徽标的颜色,而不必使用CSS,则不要使用以前的答案所建议的javascript或jquery。

要精确回答原始问题,只需:

  • 在文本编辑器中打开logo.svg

  • 寻找fill: #fff并将其替换为fill: #000

  • 例如,在文本编辑器中打开logo.svg时,它可能看起来像这样:

    1
    2
    3
    4
    <svg fill="#000000" height="24" viewBox="0 0 24 24" width="24" xmlns="http://www.w3.org/2000/svg">
      <path d="M0 0h24v24H0z" fill="none"/>
      <path d="M1 21h22L12 2 1 21zm12-3h-2v-2h2v2zm0-4h-2v-4h2v4z" fill="#fff"/>
    </svg>

    ...只需更改填充并保存。


    您可以将svg设置为蒙版。这样,设置背景颜色将充当您的填充颜色。

    HTML

    1
     

    CSS

    1
    2
    3
    4
    5
    .logo {
        background-color: red;
        -webkit-mask: url(logo.svg) no-repeat center;
        mask: url(logo.svg) no-repeat center;
    }

    JSFiddle:https://jsfiddle.net/KuhlTime/2j8exgcb/

    请注意,此方法不适用于Edge浏览器。您可以通过以下网站进行检查:https://caniuse.com/#search=mask


    尝试纯CSS:

    1
    2
    3
    4
    5
    6
    .logo-img {
      // to black
      filter: invert(1);
      // or to blue
      // filter: invert(1) sepia(1) saturate(5) hue-rotate(175deg);
    }

    本文中的更多信息https://blog.union.io/code/2017/08/10/img-svg-fill/


    2018年:如果您想要动态颜色,不想使用javascript且不需要嵌入式SVG,请使用CSS变量。适用于Chrome,Firefox和Safari。编辑:和边缘

    1
    2
    3
    <svg>
        <use xlink:href="logo.svg" style="--color_fill: #000;"></use>
    </svg>

    在您的SVG中,将style="fill: #000"的所有实例替换为style="fill: var(--color_fill)"


    @Praveen的回答很可靠。

    我无法在工作中响应它,所以我为此做了一个jquery悬停功能。

    CSS

    1
    2
    3
    .svg path {
       transition:0.3s all !important;
    }

    JS / jQuery

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // code from above wrapped into a function
    replaceSVG();

    // hover function
    // hover over an element, and find the SVG that you want to change
    $('.element').hover(function() {
        var el = $(this);
        var svg = el.find('svg path');
        svg.attr('fill', '#CCC');
    }, function() {
        var el = $(this);
        var svg = el.find('svg path');
        svg.attr('fill', '#3A3A3A');
    });


    该答案基于答案https://stackoverflow.com/a/24933495/3890888,但此处使用的脚本是纯JavaScript版本。

    您需要使SVG成为嵌入式SVG。您可以通过在图像中添加类svg来使用此脚本:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    /*
     * Replace all SVG images with inline SVG
     */

    document.querySelectorAll('img.svg').forEach(function(img){
        var imgID = img.id;
        var imgClass = img.className;
        var imgURL = img.src;

        fetch(imgURL).then(function(response) {
            return response.text();
        }).then(function(text){

            var parser = new DOMParser();
            var xmlDoc = parser.parseFromString(text,"text/xml");

            // Get the SVG tag, ignore the rest
            var svg = xmlDoc.getElementsByTagName('svg')[0];

            // Add replaced image's ID to the new SVG
            if(typeof imgID !== '
    undefined') {
                svg.setAttribute('
    id', imgID);
            }
            // Add replaced image'
    s classes to the new SVG
            if(typeof imgClass !== 'undefined') {
                svg.setAttribute('class', imgClass+' replaced-svg');
            }

            // Remove any invalid XML tags as per http://validator.w3.org
            svg.removeAttribute('xmlns:a');

            // Check if the viewport is set, if the viewport is not set the SVG wont't scale.
            if(!svg.getAttribute('
    viewBox') && svg.getAttribute('height') && svg.getAttribute('width')) {
                svg.setAttribute('
    viewBox', '0 0 ' + svg.getAttribute('height') + ' ' + svg.getAttribute('width'))
            }

            // Replace image with new SVG
            img.parentNode.replaceChild(svg, img);

        });

    });

    然后,如果您这样做:

    1
    2
    3
    .logo-img path {
      fill: #000;
    }

    或者可能:

    1
    2
    3
    .logo-img path {
      background-color: #000;
    }

    JSFiddle:http://jsfiddle.net/erxu0dzz/1/


    为什么不使用您的一个或多个svg图像创建webfont,将webfont导入css,然后仅使用css color属性更改字形的颜色?
    不需要JavaScript


    首先,您必须将SVG注入HTML DOM。

    有一个名为SVGInject的开源库可以为您完成此操作。它使用onload属性触发注入。

    这是使用SVGInject的一个最小示例:

    1
    2
    3
    4
    5
    6
    7
    8
    <html>
      <head>
        <script src="svg-inject.min.js">
      </head>
      <body>
        <img src="image.svg" onload="SVGInject(this)" />
      </body>
    </html>

    加载图像后,onload="SVGInject(this)将触发注入,并且元素将由src属性中提供的SVG文件的内容替换。

    它解决了SVG注入的几个问题:

  • 可以隐藏SVG,直到完成注射。如果在加载期间已应用样式,则这很重要,否则会导致短暂的"未样式化内容闪烁"。

  • 元素自动自动注入。如果您动态添加SVG,则不必担心再次调用注入函数。

  • 如果将SVG多次注入,则将随机字符串添加到SVG中的每个ID,以避免在文档中多次具有相同的ID。

  • SVGInject是纯Javascript,可与所有支持SVG的浏览器一起使用。

    免责声明:我是SVGInject的合著者


    为了扩展@gringo答案,可以使用其他答案中描述的Javascript方法,但是需要用户下载不必要的图像文件,并且IMO会使代码膨胀。

    我认为更好的方法是将所有1色矢量图形迁移到webfont文件。过去我曾经使用过Fort Awesome,它将您的SVG格式的自定义图标/图像以及您可能使用的任何第三方图标(Font Awesome,Bootstrap图标等)组合到单个webfont文件中的效果非常好用户必须下载。您也可以对其进行自定义,因此仅包含您正在使用的第三方图标。这减少了页面必须发出的请求的数量,并且使页面具有整体重量,特别是如果您已经包含任何第三方图标库的情况下。

    如果您更喜欢面向开发人员的选项,则可以使用Google" npm svg webfont",并使用最适合您的环境的节点模块之一。

    一旦完成了这两个选项中的任何一个,就可以通过CSS轻松更改颜色,并且很可能在此过程中加快了网站的速度。


    如果您只是在实色和黑白之间切换图像,则可以将一个选择器设置为:

    {滤波器:无;}

    另一个为:

    1
    {filter:grayscale(100%);}


    由于SVG基本上是代码,因此只需要内容。我使用PHP获取内容,但是您可以使用任何内容。

    1
    2
    3
    <?php
    $content    = file_get_contents($pathToSVG);
    ?>

    然后,我将内容按原样打印在div容器中

    1
    <?php echo $content;?>

    最终在CSS上为容器的SVG子项设置规则

    1
    2
    3
    .fill-class > svg {
        fill: orange;
    }

    我得到了带有材料图标SVG的结果:

    Mozilla Firefox 59.0.2(64位)Linux

    enter image description here

    Google Chrome66.0.3359.181(正式版)(64位)Linux

    enter image description here

    Opera 53.0.2907.37 Linux

    enter image description here


    您遇到的主要问题是要从标记导入svg,这将隐藏SVG结构。

    您需要将标记与结合使用才能获得所需的效果。为了使其正常工作,您需要在SVG文件中要使用的路径上指定id,然后才能从标记中检索它们。
    尝试下面的片段。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    .icon {
      display: inline-block;
      width: 2em;
      height: 2em;
      transition: .5s;
      fill: currentColor;
      stroke-width: 5;
      }
      .icon:hover {
        fill: rgba(255,255,255,0);
        stroke: black;
        stroke-width: 2;
        }

    .red {
      color: red;
      }

    .blue {
      color: blue;
      }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <svg width="0" height="0">
      <defs>
        <path id="home" d="M100 59.375l-18.75-18.75v-28.125h-12.5v15.625l-18.75-18.75-50 50v3.125h12.5v31.25h31.25v-18.75h12.5v18.75h31.25v-31.25h12.5z"/>
    </svg>

     
      <span class="icon red">
              <svg viewbox="0 0 100 100">
                <use xlink:href="#home"/>
              </svg>
            </span>
     
        <span class="icon blue">
              <svg viewbox="0 0 100 100">
                <use xlink:href="#home"/>
              </svg>
            </span>

    请注意,如果要从外部来源加载SVG(而不是将其嵌入HTML),则可以在片段#之前放置任何URL。同样,通常您不指定CSS的填充。最好考虑在SVG本身中使用fill:"currentColor"。然后,将使用相应元素的CSS颜色值。


    知道这是一个老问题,但是最近我们遇到了同样的问题,我们从服务器端解决了这个问题。这是特定于php的答案,但我肯定其他环境也有类似的东西。
    而不是使用img标签,而是从一开始就将svg呈现为svg。

    1
    2
    3
    4
    5
    6
    public static function print_svg($file){
        $iconfile = new \DOMDocument();
        $iconfile->load($file);
        $tag = $iconfile->saveHTML($iconfile->getElementsByTagName('svg')[0]);
        return $tag;
    }

    现在,当您渲染文件时,您将获得完整的内嵌svg


    这对于将PHP与要使用CSS操纵的.svg图像结合使用的人可能会有所帮助。

    您无法使用CSS覆盖img标签内的属性。 但是,当将svg源代码嵌入HTML时,您肯定可以。 我想使用require_once函数解决此问题,其中包含一个.svg.php文件。 这就像导入图像一样,但是您仍然可以使用CSS覆盖样式!

    首先包含svg文件:

    1
    <?php require_once( '/assets/images/my-icon.svg.php' ); ?>

    其中包括此图标,例如:

    1
    <svg xmlns="http://www.w3.org/2000/svg" width="20.666" height="59.084" viewBox="0 0 20.666 59.084"><g transform="translate(-639.749 -3139)"><path d="M648.536,3173.876c0-2.875-1.725-3.8-3.471-3.8-1.683,0-3.49.9-3.49,3.8,0,3,1.786,3.8,3.49,3.8C646.811,3177.676,648.536,3176.769,648.536,3173.876Zm-3.471,2.341c-.883,0-1.437-.513-1.437-2.341,0-1.971.615-2.381,1.437-2.381.862,0,1.438.349,1.438,2.381,0,1.907-.616,2.339-1.438,2.339Z" fill="#142312"/><path d="M653.471,3170.076a1.565,1.565,0,0,0-1.416.9l-6.558,13.888h1.2a1.565,1.565,0,0,0,1.416-.9l6.559-13.887Z" fill="#142312"/><path d="M655.107,3177.263c-1.684,0-3.471.9-3.471,3.8,0,3,1.766,3.8,3.471,3.8,1.745,0,3.49-.9,3.49-3.8C658.6,3178.186,656.851,3177.263,655.107,3177.263Zm0,6.139c-.884,0-1.438-.514-1.438-2.34,0-1.972.617-2.381,1.438-2.381.862,0,1.437.349,1.437,2.381,0,1.909-.616,2.34-1.437,2.34Z" fill="#142312"/><path d="M656.263,3159.023l-1.49-14.063a1.35,1.35,0,0,0,.329-.293,1.319,1.319,0,0,0,.268-1.123l-.753-3.49a1.328,1.328,0,0,0-1.306-1.054h-6.448a1.336,1.336,0,0,0-1.311,1.068l-.71,3.493a1.344,1.344,0,0,0,.276,1.112,1.532,1.532,0,0,0,.283.262l-1.489,14.087c-1.7,1.727-4.153,4.871-4.153,8.638v28.924a1.339,1.339,0,0,0,1.168,1.49,1.357,1.357,0,0,0,.17.01h17.981a1.366,1.366,0,0,0,1.337-1.366v-29.059C660.414,3163.893,657.963,3160.749,656.263,3159.023Zm-8.307-17.349h4.274l.176.815H647.79Zm9.785,43.634v10.1H642.434v-17.253a4.728,4.728,0,0,1-2.028-4.284,4.661,4.661,0,0,1,2.028-4.215v-2c0-3.162,2.581-5.986,3.687-7.059a1.356,1.356,0,0,0,.4-.819l1.542-14.614H652.1l1.545,14.618a1.362,1.362,0,0,0,.4.819c1.109,1.072,3.688,3.9,3.688,7.059v9.153a5.457,5.457,0,0,1,0,8.5Z" fill="#142312"/></g></svg>

    现在,我们可以使用CSS轻松更改填充颜色:

    1
    2
    3
    svg path {
      fill: blue;
    }

    我首先尝试使用file_get_contents()解决此问题,但上述解决方案要快得多。


    如果您可以访问JQuery,则可以通过以下方式扩展到Praveen的答案,以编程方式更改SVG中不同嵌套元素的颜色:

    $('svg').find('path, text').css('fill', '#ffffff');

    在find中,您可以提及需要更改颜色的不同元素。