【问题标题】:img src SVG changing the styles with CSSimg src SVG 用 CSS 改变样式
【发布时间】:2019-05-02 18:11:23
【问题描述】:

html

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

css

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

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

【问题讨论】:

标签: css image svg


【解决方案1】:

您可以将 SVG 设置为遮罩。这样设置背景颜色将充当您的填充颜色。

HTML

<div class="logo"></div>

CSS

.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/
MDN: https://developer.mozilla.org/en-US/docs/Web/CSS/mask

请检查您的浏览器是否支持此功能: https://caniuse.com/#search=mask

【讨论】:

  • 所以除了内部网站以外的任何东西都无法使用。
  • 截至 2016 年 5 月 29 日,89% 的全球支持。
  • 对于here 中描述的情况,这是一个了不起的解决方案,在 css 中使用除数据 uris 之外的任何东西都会有点痛苦。谢谢!
  • 它不工作。它说mask 是invalid property value。我正在用 chrome 进行测试。
  • 这很好用!我在 div 中添加了&lt;img src="logo.svg" style="opacity:0" /&gt; 以获得正确的div 尺寸。
【解决方案2】:

如果您的目标只是更改徽标的颜色,并且您不一定需要使用 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>

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

【讨论】:

  • 如果我的徽标在页眉有一种颜色,而在页脚有另一种颜色怎么办?
  • .@ruben.lopes 两个不同的文件,或者两个不同的内联是最简单的
  • 您也可以使用fill="currentColor",然后在父元素css-tricks.com/cascading-svg-fill-color上使用color
  • 这显然是可能的,但并不是一个真正有用的答案。
【解决方案3】:

尝试纯 CSS:

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

【讨论】:

  • 最近我的一次尝试在 Edge 上获得了与其他浏览器不同的颜色。
  • 这适用于大多数浏览器,但我在使用 IOS-Safari 浏览器时遇到了一些问题。
  • 如何找到给定颜色代码的所有四个值?
  • 这行得通。使用颜色代码生成过滤器codepen.io/sosuke/pen/…
  • @funky-nd 不,我从未见过由于 css tbh 导致的性能问题。
【解决方案4】:

如果您想要动态颜色,不想使用 javascript 并且不想使用内联 SVG,请使用 CSS 变量。适用于 Chrome、Firefox 和 Safari。编辑:和边缘

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

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

【讨论】:

  • 在 SVG 2 中似乎是 deprecated
  • @northamerican - 作为“证明”的其他 stackoverflow 答案的链接是无关紧要的。任何人都可以在这个平台上写任何东西。 MDN:"This feature has been removed from the Web standards. Though some browsers may still support it, it is in the process of being dropped"
  • 似乎 xlink:href 已被 href 取代。所以这可能仍然有效。
  • @BenjaminIntal href 在 chrome 中似乎不适合我
  • 看起来很有希望,但可惜它不会加载图片。控制台中也没有错误消息。我正在使用 Firefox 78.4 esr。
【解决方案5】:

您首先必须将 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>

加载图像后,onload="SVGInject(this) 将触发注入,&lt;img&gt; 元素将替换为src 属性中提供的 SVG 文件的内容。

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

  1. 在注入完成之前可以隐藏 SVG。如果在加载期间已经应用了样式,这一点很重要,否则会导致短暂的“无样式内容闪烁”。

  2. &lt;img&gt; 元素会自动注入自身。如果动态添加SVG,就不用担心再次调用注入函数了。

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

SVGInject 是纯 Javascript,适用于所有支持 SVG 的浏览器。

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

【讨论】:

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

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

例如:

<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 139.435269383854" id="img" fill="currentColor">...
</svg>

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

之后,您可以使用 CSS 更改颜色,方法是设置元素的 color 属性或从其父级设置。

例子:

.div-with-svg-inside {
    color: red;
}

我忘了说,你必须以这种方式插入 SVG:

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

注意#img是svg文件中svg标签的id。

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

【讨论】:

【解决方案7】:

此答案基于答案 https://stackoverflow.com/a/24933495/3890888,但使用了该脚本的纯 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);

    });

});

然后,如果你这样做:

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

或者可能是:

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

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

【讨论】:

  • 伟大的..作品。此外,如果我们的页面有多个 svg,那么我们需要将 fetch 块放入 IIFE。
  • 太棒了!与 ES6 配合得很好。如果您不关心 IE 9,您甚至可以使用:parser.parseFromString(text, "image/svg+xml");
  • 在 iOS 9.3.5 上的 UIWebView 中不起作用。我认为这可能是由于使用了在 10.1 (developer.mozilla.org/en-US/docs/Web/API/Fetch_API) 中添加到 Safari 的fetch。上面的 jQuery 版本确实有效。
【解决方案8】:

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

【讨论】:

  • 如果你的 svg 有几个不同颜色的元素,这个解决方案会变得非常 hacky(插入几个元素)。
  • @kakaja 这仅适用于具有 1 种颜色的矢量图像的解决方案。有关详细信息,请参阅 bpulecio 的答案
  • 因为图标不是文字。字体用于文本。 Svgs 用于图标。
  • @LazarLjubenović - 从技术上讲,文本是由作为符号的字符组成的,而图标也是符号,所以这就是为什么许多人使用图标字体没有问题。这就像创建“另一种”文本语言一样。普通话使用“图标”而不是字母,在人类中使用图标作为“文本”的情况并不少见
  • 虽然这听起来是一个有趣的解决方案,但我真的建议将答案详细说明为“如何”而不是“为什么不”
【解决方案9】:

@Praveen 的回答很可靠。

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

CSS

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

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');
});

【讨论】:

  • 这不是只有在 SVG 开始内联的情况下才有效吗?
  • 是的,但如果您要处理许多 SVG 文件或定期更新它们,管理起来会很麻烦。
【解决方案10】:

使用滤镜转换为任何颜色。

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

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

过滤器来自How to transform black into any given color using only CSS filters 中提出的脚本 如果您想将白色更改为任何颜色,您可以调整每个滤镜中的反转值。

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

【讨论】:

    【解决方案11】:

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

    等于

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

    最终的 sn-p

    .filterit{
    width:270px;
    filter: invert(88%) sepia(21%) saturate(935%) hue-rotate(123deg) brightness(85%) contrast(97%);
    }
    <img src="https://www.flaticon.com/svg/static/icons/svg/1389/1389029.svg"
    class="filterit
    
    />

    【讨论】:

    • 这在我无法更改标记的情况下真的很有帮助。
    • 即使使用亮度(0) 饱和度(100%) 时,结果也几乎不是我想要的结果,所以虽然为此付出了很多努力,但结果与应有的结果相差甚远。
    • @e11world SVG 文件本身不应该有颜色请确定
    • 我只是想反转我的黑暗主题,这正是我想要的。谢谢
    【解决方案12】:

    简单..

    您可以使用此代码:

    <svg class="logo">
      <use xlink:href="../../static/icons/logo.svg#Capa_1"></use>
    </svg>
    

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

    在css中:

    .logo {
      fill: red;
    }
    

    【讨论】:

    • kabrice,您可以使用此代码codepen.io/hmzajmal/pen/ZEGvWYa
    • 这应该被标记为一个解决方案。添加要链接的 svg 的 id (#...) 非常重要。
    • tbh 我找不到 svg 的 id
    【解决方案13】:

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

    {过滤器:无;}

    另一个是:

    {filter:grayscale(100%);}
    

    【讨论】:

      【解决方案14】:

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

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

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

      <div class="fill-class"><?php echo $content;?></div>
      

      最后在 CSS 上为容器的 SVG 子元素设置规则

      .fill-class > svg { 
          fill: orange;
      }
      

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

      Mozilla Firefox 59.0.2(64 位)Linux

      Google Chrome66.0.3359.181(官方构建)(64 位)Linux

      Opera 53.0.2907.37 Linux

      【讨论】:

      • 我不这样做的原因是这会阻止浏览器缓存 SVG。另一种方法是使用此处其他一些答案中提到的 SVG 注入器。 SVG 文件仍然会被浏览器缓存,并且注入的 SVG 仍然可以用 CSS 设置样式。但我不会对你投反对票。
      • 我明白了,但无论如何,缓存没有提到。最佳答案有 JavaScript 代码,可以通过标题过期操作或在文件名链接后强制哈希每次重新加载(或不)。感谢不要拒绝投票,但我仍然相信我的答案解决了使用 CSS 填充属性更改 SVG 的问题。跨度>
      【解决方案15】:

      为了扩展@gringo 答案,其他答案中描述的 Javascript 方法有效,但需要用户下载不必要的图像文件,而 IMO,它会使您的代码膨胀。

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

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

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

      【讨论】:

      • 你应该试试 SVG sprites。根据我的经验,网络字​​体在浏览器版本之间存在随机问题。试试这个:fontastic.me - 但使用 SVG sprite 版本 - 看看你的想法。 :)
      【解决方案16】:

      您的主要问题是您从 &lt;img&gt; 标记导入 svg,这将隐藏 SVG 结构。

      您需要将&lt;svg&gt; 标记与&lt;use&gt; 结合使用才能获得所需的效果。为了让它工作,你需要给你想要在 SVG 文件 &lt;path id='myName'...&gt; 中使用的路径提供一个 id,然后才能从 &lt;use xlink:href="#myName"/&gt; 标记中检索它们。 试试下面的截图。

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

      请注意,如果您想从 external source 加载 SVG(而不是将其嵌入到您的 HTML 中),您可以在片段 # 之前放置任何 URL。此外,通常您不会在 CSS 中指定填充。最好考虑在 SVG 本身中使用 fill:"currentColor"。相应元素的 CSS 颜色值将在适当的位置使用。

      【讨论】:

        【解决方案17】:

        这对于将PHP 与.svg 图像结合使用的人可能会有所帮助,他们想通过CSS 进行操作。

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

        首先包含 svg 文件:

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

        它包括这个图标,例如:

        <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 轻松更改填充颜色:

        svg path {
          fill: blue;
        }
        

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

        【讨论】:

        • require_once() 比file_get_contents() 快怎么办?因为这是一个纯粹的本地电话?
        • 是的。据我所知,file_get_contents() 做了一个 GET 请求,并且 require_once 在本地包含它。
        【解决方案18】:

        在代码编辑器中打开 svg 图标并在路径标记后添加一个类:

        <path class'colorToChange' ...
        

        您可以将类添加到 svg 并像这样更改颜色:

        codepen

        【讨论】:

          【解决方案19】:

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

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

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

          【讨论】:

            【解决方案20】:

            对我来说,我的 svg 在将它们作为 img 和 svg 时看起来不同。所以我的解决方案将 img 转换为 csv,在内部更改样式并返回到 img(尽管它需要更多的工作),我相信“blob”也比使用“mask”的赞成答案具有更好的兼容性。

              let img = yourimgs[0];
              if (img.src.includes(".svg")) {
                var ajax = new XMLHttpRequest();
                ajax.open("GET", img.src, true);
                ajax.send();
                ajax.onload = function (e) {
                 
                  svg = e.target.responseText;
            
                 
                  svgText = "";
                  //change your svg-string as youd like, for example
                  // replacing the hex color between "{fill:" and ";"
                  idx = svg.indexOf("{fill:");
                  substr = svg.substr(idx + 6);
                  str1 = svg.substr(0, idx + 6);
                  str2 = substr.substr(substr.indexOf(";"));
                  svgText = str1 + "#ff0000" + str2;
                  
            
                  let blob = new Blob([svgText], { type: "image/svg+xml" });
                  let url = URL.createObjectURL(blob);
                  let image = document.createElement("img");
                  image.src = url;
                  image.addEventListener("load", () => URL.revokeObjectURL(url), {
                    once: true,
                  });
                  img.replaceWith(image);
                };
              }
            

            【讨论】:

              【解决方案21】:

              为此,您必须将 SVG 用作内联 HTML。

              说这是你的 logo.svg 代码(当你在 textEditor 上打开它时):

              Logo.SVG

              <svg width="139" height="100" xmlns="http://www.w3.org/2000/svg">
                  <!-- Note that I've Added Class Attribute 'logo-img' Here -->
                  <g transform="translate(-22 -45)" fill="none" fill-rule="evenodd">
                      <path
                          d="M158.023 48.118a7.625 7.625 0 01-.266 10.78l-88.11 83.875a7.625 7.625 0 01-10.995-.5l-33.89-38.712a7.625 7.625 0 0111.475-10.045l28.653 32.73 82.353-78.394a7.625 7.625 0 0110.78.266z"
                          fill="#00000" />
                  </g>
              </svg>
              

              向其中添加您想要的类/ID(我添加了“logo-img”):

              已编辑的 Svg

              <svg class="logo-img" width="139" height="100" xmlns="http://www.w3.org/2000/svg">
                  <!-- Note that I've Added Class Attribute 'logo-img' Here -->
                  ...
              </svg>
              

              现在应用你的 Css 规则:

              CSS

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

              专业版

              • 通过这种方式,您可以根据用户的操作(悬停、选中、...)制作动画

              骗局

              • 您的 HTML 文件会一团糟。

              这是一个堆栈片段

              <style>
                      body {
                          display: flex;
                          justify-content: center;
                      }
                      .logo-img path {
                          transition: .5s all linear;
                      }
                      .logo-img path {
                          fill: coral;
                      }
                      .logo-img:hover path{
                          fill: darkblue;
                      }
                      
                  </style>
              <!DOCTYPE html>
              <html lang="en">
              
              <head>
                  <meta charset="UTF-8">
                  <meta name="viewport" content="width=device-width, initial-scale=1.0">
                  <title>Document</title>
                  
              </head>
              
              <body>
                  <svg class="logo-img" width="139" height="100" xmlns="http://www.w3.org/2000/svg">
                      <!-- Note that I've Added Class Attribute 'logo-img' Here -->
                      <g transform="translate(-22 -45)" fill="none" fill-rule="evenodd">
                          <path
                              d="M158.023 48.118a7.625 7.625 0 01-.266 10.78l-88.11 83.875a7.625 7.625 0 01-10.995-.5l-33.89-38.712a7.625 7.625 0 0111.475-10.045l28.653 32.73 82.353-78.394a7.625 7.625 0 0110.78.266z"
                              fill="#00000" />
                      </g>
                  </svg>
              </body>
              
              </html>

              【讨论】:

                【解决方案22】:

                直接到 svg 填充 css 将不起作用,您可以如下使用

                <style>
                svg path {
                    fill: red;
                }
                </style>
                <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>
                

                这对我有用

                【讨论】:

                  【解决方案23】:

                  为什么不直接使用 CSS 的 filter 属性来操作 :hover 或其他任何状态的颜色?我发现它可以将 SVG 图像转换为 img 标签。至少,它在 2020 年几乎得到完全支持。它对我来说是最简单的解决方案。唯一需要注意的是必须调整过滤器属性才能找到目标颜色。但是你也有这个非常有用的tool。

                  【讨论】:

                    【解决方案24】:

                    如果您的形状始终是一种纯色并且您有多个,您可以使用 Fontello 并使用一系列您自己的自定义 SVG 形状制作自定义图标字体。然后,您可以单独使用 CSS 设置/动画所有它们的大小和颜色。

                    对于这个问题的所有可能用例,这是一个需要考虑的基本范式。我在 许多 项目中使用过它。无论如何,如果您还没有听说过 Fontello,您需要了解一下。如果您知道更好的类似解决方案,我很想知道。

                    可能的失败:

                    1. 众所周知,图标/形状字体会干扰屏幕阅读器,因此可能需要一些处理。

                    2. Fontello 对导入形状可能很挑剔,并且在创作和导出它们时可能需要反复试验。 避免任何和所有分组,并仅使用单个非嵌套复合形状。

                    【讨论】:

                      猜你喜欢
                      • 2020-12-20
                      • 2011-09-27
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多