如何选择CSS伪元素content属性中的SVG元素?
能否选择伪元素content属性内的SVG?
不行,你用div:before svg这种选择器根本控制不了content里的SVG,原因很简单:
当你通过content: url(path_to_my_svg)引入SVG时,这个SVG是作为伪元素的替换内容存在的,就像<img>标签加载的图片一样,属于外部资源,并没有被解析到DOM树里。CSS选择器只能作用于DOM中的元素,自然没法穿透到这个外部资源里去选择SVG内部的元素。
可行的替代方案
如果想控制SVG的样式,有几种实用办法:
- 内联SVG并使用CSS变量:把SVG代码转成data URI格式,在SVG内部用CSS变量定义样式,再通过伪元素的CSS修改这些变量。比如:
div:before { content: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath fill='%23%7BfillColor%7D' d='M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z'/%3E%3C/svg%3E"); --fillColor: #ff0000; }
(注意:data URI里的特殊字符需要正确转义,比如#转成%23,{}转成%7B%7D)
- 用背景图代替content引入:把SVG设为伪元素的
background-image,通过background-size、background-position调整大小位置,再用CSS滤镜(filter属性)修改整体色调、亮度等,但这种方式没法精细控制SVG内部的单个元素。
div:before { content: ""; display: inline-block; width: 24px; height: 24px; background-image: url(path_to_my_svg); background-size: cover; filter: hue-rotate(90deg); /* 调整色相 */ }
- 直接内联SVG到HTML:如果允许修改HTML结构,把SVG直接写在页面里,再用CSS选择器直接控制,这是最灵活的方式。
内容的提问来源于stack exchange,提问作者user3014233
相关产品推荐
相关产品推荐

