img src SVG改变填充颜色

ngp*_*und 304 css svg image

HTML

<img src="logo.svg" alt="Logo" class="logo-img">
Run Code Online (Sandbox Code Playgroud)

CSS

.logo-img path {
  fill: #000;
}
Run Code Online (Sandbox Code Playgroud)

上面的svg加载并且是原生的,fill: #fff但是当我使用上面css的内容尝试将其更改为黑色时它不会改变,这是我第一次玩SVG而且我不确定它为什么不起作用.

Row*_*use 137

如果你的目标只是改变徽标的颜色,并且你不一定需要使用CSS,那么不要像之前的一些答案所建议的那样使用javascript或jquery.

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

  1. logo.svg在文本编辑器中打开您的.

  2. 寻找fill: #fff并替换它fill: #000

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

  • 这显然是可能的,但并不是一个真正有用的答案。 (48认同)
  • 你也可以使用`fill ="currentColor"`然后在父元素上使用`color` https://css-tricks.com/cascading-svg-fill-color/ (7认同)
  • ...如果没有"填充",你可以将它添加到`path}或`circle`项目,如`<path fill ="#777777"d ="m129.774,74.409c-5.523,. ..`. (5认同)
  • 如果我的徽标在页眉上有一种颜色而在页脚上有另一种颜色怎么办? (3认同)
  • @Timmmm `currentColor` 方法实际上非常好。 (2认同)

And*_*ann 71

您可以将svg设置为掩码.这样设置背景颜色就可以作为填充颜色.

HTML

<div class="logo"></div>
Run Code Online (Sandbox Code Playgroud)

CSS

.logo {
    background-color: red;
    -webkit-mask: url(logo.svg) no-repeat center;
    mask: url(logo.svg) no-repeat center;
}
Run Code Online (Sandbox Code Playgroud)

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

请注意,此方法不适用于Edge浏览器.您可以访问以下网站查看:https://caniuse.com/#search=mask

  • 截至2016年5月29日,全球支持率为89%. (7认同)
  • 在IE 11(11.608.15063.0)上不起作用 (6认同)
  • 这太棒了!我在 div 内添加了 `&lt;img src="logo.svg" style="opacity:0" /&gt;` 以获得正确的 `div` 尺寸。 (5认同)
  • 它不工作。它说“mask”是“无效的属性值”。我正在 Chrome 中测试这个。 (4认同)
  • 所以除了内部网站无法使用外. (2认同)
  • 对于[此处](https://css-tricks.com/lodge/svg/09-svg-data-uris/#comment-1586344)中描述的情况(使用数据以外的任何内容)来说,这是一个令人惊奇的解决方案css 中的 uris 有点麻烦。谢谢! (2认同)

小智 58

尝试纯CSS:

.logo-img {
  // to black
  filter: invert(1);
  // or to blue
  // filter: invert(1) sepia(1) saturate(5) hue-rotate(175deg);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这有效。使用颜色代码生成过滤器https://codepen.io/sosuke/pen/Pjoqqp?__cf_chl_jschl_tk__=ecc0b72797ae71bc009d6322e3e470773936b386-1604211766-0-ASpz720gXnc6Ej0vzlgY9-KLmlPkldgcOx1wAmGTUCj LZLOxkArNxpRzZ9m8woL-NGmP9LBGVPws8UxMJZrR7O1qFH6QkKtrGVPw6StRnXiK1XTQR_nY905r0XobAG2nOmyC6Zq8mdyPDp1MyHD7JLodJUXCRViXhtmLmRVE_-JGarVJRlxs6k3DzAOQQEJewfp0 0DjhlD0mxr8ZKpk2yq6IPTZZQ52XYxh26FC5MxLHhs7LuAwhtolmDZyp4_IuwRg8I5m-2--MmvGE8CCqjRWrkE85zgkMXPlOqcZtppRpZhn6Uz9DZAuKheHwVBb0ySIhFYG92bvQOgiKX0TTsw B1SHgOLIeqktuyUaAgxI_h (5认同)
  • 这适用于大多数浏览器,但我在使用 IOS-Safari 浏览器时遇到了一些问题。 (4认同)
  • 如何找到给定颜色代码的所有四个值? (2认同)

nor*_*can 20

2018:如果你想要一个动态颜色,不想使用javascript而不想要内联SVG,请使用CSS变量.适用于Chrome,Firefox和Safari.编辑:和边缘

<svg>
    <use xlink:href="logo.svg" style="--color_fill: #000;"></use>
</svg>
Run Code Online (Sandbox Code Playgroud)

在你的SVG,替换的任何实例style="fill: #000"style="fill: var(--color_fill)".

  • @northamerican - 链接到其他 stackoverflow 答案,因为“证明”是无关紧要的。任何人都可以在这个平台上写任何东西。MDN: *`"此功能已从 Web 标准中删除。虽然某些浏览器可能仍然支持它,但正在被删除"`* (6认同)
  • @BenjaminIntal `href` 似乎在 Chrome 中对我不起作用 (6认同)
  • 看起来很有希望,但是可惜它无法加载图片。控制台中也没有错误消息。我使用的是 Firefox 78.4 esr。 (6认同)
  • 似乎不建议使用xlink:href,而建议使用href。因此,这可能仍然有效。 (3认同)
  • 在* SVG 2 *中似乎[已弃用](https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute/xlink:href) (2认同)
  • 对我来说,原始的 svg 必须定义了 `xmlns:xlink` 和 `id`:/sf/answers/2092029131/ (2认同)
  • 为了清楚地显示 id,我可以这样做: `&lt;svg&gt;&lt;use href="/logo.svg#logo" /&gt;&lt;/svg&gt;` 其中 .svg 文件具有 svg 标签中指定的 id `&lt;svg id="logo"...&gt;` 在过去,我会将一堆 svg 定义打包到一个文件中,例如 svg sprite 表,然后我可以根据 id 的需要引用每个定义。 (2认同)
  • 为什么他们会反对改变 SVG url 颜色的唯一方法...... (2认同)

Mod*_*sto 17

编辑您的 SVG 文件,添加fill="currentColor"到 svg 标签并确保从文件中删除任何其他填充属性。

例如:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 139.435269383854" id="img" fill="currentColor">...
</svg>
Run Code Online (Sandbox Code Playgroud)

请注意,这currentColor是一个关键字(不是使用中的固定颜色)。

之后,您可以使用 CSS,通过设置color元素的属性或其父元素来更改颜色。

例子:

.div-with-svg-inside {
    color: red;
}
Run Code Online (Sandbox Code Playgroud)

我忘了说,你必须这样插入SVG:

      <svg>
        <use xlink:href='/assets/file.svg#img'></use>
      </svg>

Run Code Online (Sandbox Code Playgroud)

请注意,这#imgsvgsvg 文件中标签的 ID 。

另一种方法:https : //css-tricks.com/cascading-svg-fill-color/

  • `xlink:href` 是一项已弃用的功能,**不应使用** https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href (3认同)

Mat*_*jek 15

@Praveen的答案是可靠的.

我无法让它在我的工作中做出回应,所以我为它做了一个jquery悬停功能.

CSS

.svg path {
   transition:0.3s all !important;
}
Run Code Online (Sandbox Code Playgroud)

JS/JQuery

// 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');
});
Run Code Online (Sandbox Code Playgroud)

  • 仅当 SVG 开始内联时,这才有效吗? (4认同)

Seb*_*736 14

这个答案基于答案/sf/answers/1745344681/,但在那里使用的脚本是纯JavaScript版本.

您需要使SVG成为内联SVG.您可以通过向svg图像添加类来使用此脚本:

/*
 * 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);

    });

});
Run Code Online (Sandbox Code Playgroud)

然后,现在,如果你这样做:

.logo-img path {
  fill: #000;
}
Run Code Online (Sandbox Code Playgroud)

或者可能:

.logo-img path {
  background-color: #000;
}
Run Code Online (Sandbox Code Playgroud)

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


Jas*_*elf 14

使用过滤器转换为任何颜色。

我最近找到了这个解决方案,希望有人可以使用它。由于该解决方案使用过滤器,因此它可以用于任何类型的图像。不仅仅是svg。

如果您只想更改单色图像的颜色,则可以借助一些过滤器来完成此操作。它当然也适用于多色图像,但您不能针对特定颜色。只有整个图像。

过滤器来自如何仅使用 CSS 过滤器将黑色转换为任何给定颜色中提出的脚本 如果您想将白色更改为任何颜色,您可以调整每个过滤器中的反转值。

.startAsBlack{
  display: inline-block;
  width: 50px;
  height: 50px;
  background: black;
}

.black-green{
  filter: invert(43%) sepia(96%) saturate(1237%) hue-rotate(88deg) brightness(128%) contrast(119%);
}

.black-red{
  filter: invert(37%) sepia(93%) saturate(7471%) hue-rotate(356deg) brightness(91%) contrast(135%);
}

.black-blue{
  filter: invert(12%) sepia(83%) saturate(5841%) hue-rotate(244deg) brightness(87%) contrast(153%);
}

.black-purple{
  filter: invert(18%) sepia(98%) saturate(2657%) hue-rotate(289deg) brightness(121%) contrast(140%);
}
Run Code Online (Sandbox Code Playgroud)
Black to any color: <br/>
<div class="startAsBlack black-green"></div>
<div class="startAsBlack black-red"></div>
<div class="startAsBlack black-blue"></div>
<div class="startAsBlack black-purple"></div>
Run Code Online (Sandbox Code Playgroud)


War*_*ama 11

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

有一个名为SVGInject的开源库可以为您完成此任务.它使用该onload属性来触发注入.

这是使用SVGInject的最小示例:

<html>
  <head>
    <script src="svg-inject.min.js"></script>
  </head>
  <body>
    <img src="image.svg" onload="SVGInject(this)" />
  </body>
</html>
Run Code Online (Sandbox Code Playgroud)

加载图像后,onload="SVGInject(this)将触发注入,<img>元素将被src属性中提供的SVG文件的内容替换.

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

  1. 注射完成后,可以隐藏SVG.如果在加载时已经应用了样式,则这很重要,否则会导致短暂的"无格式内容闪烁".

  2. <img>元件自动注入据为己有.如果动态添加SVG,则不必担心再次调用注入函数.

  3. 如果SVG被多次注入,则向SVG中的每个ID添加随机字符串,以避免在文档中多次使用相同的ID.

SVGInject是简单的Javascript,适用于所有支持SVG的浏览器.

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

  • 这是最直接的答案。我在 Chrome、Firefox 和 Edge 中对其进行了测试,效果很好。 (4认同)
  • 这是一个有效的解决方案,但我认为“最直接”是一个很大的延伸。 (3认同)

小智 11

简单的..

您可以使用此代码:

<svg class="logo">
  <use xlink:href="../../static/icons/logo.svg#Capa_1"></use>
</svg>
Run Code Online (Sandbox Code Playgroud)

首先指定 svg 的路径,然后写入它的 ID,在本例中为“Capa_1”。您可以通过在任何编辑器中打开来获取 svg 的 ID。

在 CSS 中:

.logo {
  fill: red;
}
Run Code Online (Sandbox Code Playgroud)


小智 10

为什么不用svg图像或图像创建webfont,在css中导入webfont然后只使用css颜色属性更改字形的颜色?不需要JavaScript

  • 如果你的svg有几个不同颜色的元素,这个解决方案变得非常hacky(插入几个元素). (4认同)
  • 因为图标不是文字。字体用于文本。Svgs 用于图标。 (2认同)
  • @LazarLjubenović - 从技术上讲,文本由作为符号的字符组成,而图标也是符号,所以这就是为什么许多人在使用图标字体时没有问题的原因。这就像创造“另一种”文本语言。普通话使用“图标”而不是字母,使用图标作为“文本”在人类中并不少见 (2认同)
  • 虽然这听起来是一个有趣的解决方案,但我真的建议将答案详细说明为“如何”而不是“为什么不” (2认同)

小智 7

我建议选择您的颜色,然后转到这支笔 https://codepen.io/sosuke/pen/Pjoqqp 它会将 HEX 转换为 css 过滤器,例如:#64D7D6

平等的

filter: invert(88%) sepia(21%) saturate(935%) hue-rotate(123deg) brightness(85%) contrast(97%);
Run Code Online (Sandbox Code Playgroud)

最后的片段

filter: invert(88%) sepia(21%) saturate(935%) hue-rotate(123deg) brightness(85%) contrast(97%);
Run Code Online (Sandbox Code Playgroud)
.filterit{
width:270px;
filter: invert(88%) sepia(21%) saturate(935%) hue-rotate(123deg) brightness(85%) contrast(97%);
}
Run Code Online (Sandbox Code Playgroud)


小智 6

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

{过滤器:无;}

另一个为:

{filter:grayscale(100%);}
Run Code Online (Sandbox Code Playgroud)


Ben*_*min 5

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

<?php
$content    = file_get_contents($pathToSVG);
?>
Run Code Online (Sandbox Code Playgroud)

然后,我在 div 容器内“按原样”打印内容

<div class="fill-class"><?php echo $content;?></div>
Run Code Online (Sandbox Code Playgroud)

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

.fill-class > svg { 
    fill: orange;
}
Run Code Online (Sandbox Code Playgroud)

我用材质图标 SVG 得到了这个结果:

Mozilla Firefox 59.0.2(64 位)Linux

在此输入图像描述

Google Chrome66.0.3359.181(官方版本)(64位)Linux

在此输入图像描述

歌剧 53.0.2907.37 Linux

在此输入图像描述