代码之家  ›  专栏  ›  技术社区  ›  Isaac

基于父对象填充颜色?

  •  1
  • Isaac  · 技术社区  · 4 年前

    a::before { content: url(filename.svg); }
    

    当我将鼠标悬停在标记上时,我真的希望SVG更改填充颜色,而不加载新的SVG文件,正如我现在所做的:

    a:hover::before { content: url(filename_white.svg); }
    

    这是否可以通过JavaScript、jQuery或者我不知道的纯CSS来实现?

    谢谢。

    0 回复  |  直到 11 年前
        1
  •  21
  •   Community pid    7 年前

    使用 content 属性生成(未公开的)标记,其功能等同于<img>元素中的svg。

    无法将样式应用于svg文档中的元素,因为:

    1. 样式不允许在文档之间层叠
    2. 使用<img>(或 内容 ,或任何引用svg的css图像属性)出于安全考虑,浏览器不会公开svg文档

    类似的问题,但是 background-image here here

    所以,要想做你想做的事,你必须绕过以上两点。有多种方法可供选择,例如使用内联svg、使用过滤器(应用于<img>)或生成不同的svg文件(或数据uri),如您的问题所示。

        2
  •  92
  •   lmaooooo    4 年前

    公认的答案是不正确的,这实际上可以通过使用

    p:after {
      width: 48px;
      height: 48px;
      display: inline-block;
      content: '';
      -webkit-mask: url(https://gist.githubusercontent.com/mmathys/fbbfbc171233a30e478ad5b87ec4f5d8/raw/cd9219e336b8f3b85579015bdce9665def091bb8/heart.svg) no-repeat 50% 50%;
      mask: url(https://gist.githubusercontent.com/mmathys/fbbfbc171233a30e478ad5b87ec4f5d8/raw/cd9219e336b8f3b85579015bdce9665def091bb8/heart.svg) no-repeat 50% 50%;
      -webkit-mask-size: cover;
      mask-size: cover;
    }
    
    .red:after {
      background-color: red;
    }
    
    .green:after {
      background-color: green;
    }
    
    .blue:after {
      background-color: blue;
    }
    <p class="red">red heart</p>
    <p class="green">green heart</p>
    <p class="blue">blue heart</p>

    实际上,您并不是在修改svgdom本身,而是在更改背景颜色。这样,您甚至可以使用图像或渐变作为背景。


    更新

    正如先生所说, this feature is sadly not widely supported

    六年后,对前缀使用的支持已经上升到 97%