[英]Change SVG fill color in :before or :after CSS
我有一个这样的 SVG 图形:
a::before { content: url(filename.svg); }
当我将鼠标悬停在标签上时,我真的希望 SVG 更改填充颜色,而无需加载新的 SVG 文件,就像我现在所做的那样:
a:hover::before { content: url(filename_white.svg); }
这是否可以使用我不知道的 JavaScript、jQuery 或纯 CSS 来实现?
谢谢。
接受的答案是不正确的,这实际上可以通过使用SVG 蒙版和背景颜色的解决方法来实现:
p:after { width: 48px; height: 48px; display: inline-block; content: ''; -webkit-mask: url(https://gh.max.ax/heart.svg) no-repeat 50% 50%; mask: url(https://gh.max.ax/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>
您实际上并没有修改 SVG DOM 本身,您只是更改了背景颜色。 这样,您甚至可以使用图像或渐变作为背景。
正如 MisterJ 所提到的,
遗憾的是,此功能并未得到广泛支持。
六年后,对前缀使用的支持率上升到了97% 。
一种类似于@lmaooooo 的回答的技术,无需设置display: inline-block
。 当您想要保留display: inline
以确保:after
内容不会换行到独立于前面的文本内容的新行时,这在措辞内容时很有用。
还使用剪辑路径来防止背景颜色在 Safari 中泄漏(这取决于图像/行高/等)。
a[target="_blank"]:after { background-color: currentColor; content: ""; padding: 0 0.5em; margin: 0 0.125rem; -webkit-mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2048 2048'%3E%3Cpath d='M1792 256v640h-128V475l-851 850-90-90 850-851h-421V256h640zm-512 1007h128v529H256V640h529v128H384v896h896v-401z'/%3E%3C/svg%3E"); mask-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 2048 2048'%3E%3Cpath d='M1792 256v640h-128V475l-851 850-90-90 850-851h-421V256h640zm-512 1007h128v529H256V640h529v128H384v896h896v-401z'/%3E%3C/svg%3E"); -webkit-mask-repeat: no-repeat; mask-repeat: no-repeat; -webkit-mask-position: center; mask-position: center; clip-path: padding-box inset(0.28125em 0); }
Lorem ipsum sumit dolar <a href="#" target="_blank">hello world</a>
还有另一种方法可以做到这一点。 您可以通过使用过滤器来实现它。
只需在内容中添加 svg url 并使用 hue-rotate 来更改颜色。
根据CanIUse所有流行的浏览器都支持它。
p:after { width: 48px; height: 48px; content: url(https://gh.max.ax/heart.svg); } .red:after { filter: hue-rotate(14deg); } .green:after { filter: hue-rotate(120deg); } .blue:after { filter: hue-rotate(210deg); } .black:after { filter: grayscale(100%); }
<p class="red">red heart</p> <p class="green">green heart</p> <p class="blue">blue heart</p> <p class="black">black heart</p>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.