如何用CSS为<use>引用的<symbol>内部指定<path>设置fill样式
问题根源
<use>元素引用的<symbol>内容会被渲染在封闭的 Shadow DOM 子树 中,主文档的普通 CSS 选择器无法穿透这个边界选中内部节点,主文档的 DOM 查询也默认不会遍历 Shadow DOM 内部,所以你直接查询use path.purple会返回空。- 你原有样式的 hover 规则存在属性名错误,把
fill写成了path,也会导致样式失效。
解决方案
1. 样式生效方案
推荐用 CSS 变量 + currentColor 组合实现自定义,不需要穿透 Shadow DOM,兼容性更好:
<svg> <defs> <style> symbol#DateCard path.purple { /* 用CSS变量接收外部传入的颜色,fallback设默认值 */ fill: var(--datecard-purple-fill, currentColor); transition: fill .6s; } /* 直接给use元素设置变量,会自动继承到内部symbol节点 */ use[*|href="#DateCard"] { --datecard-purple-fill: #ff0095; } /* hover直接作用在use元素上,修改变量即可 */ use[*|href="#DateCard"]:hover { --datecard-purple-fill: #ff0000; } </style> <symbol id="DateCard"> <path class="purple" d="..."/> </symbol> </defs> <use xlink:href="#DateCard"/> </svg>
2. 访问<use>内部DOM节点方案
如果确实需要操作内部的path节点,需要先选中<use>元素,再访问它的shadowRoot属性来查询内部节点:
const useNode = document.querySelector('use[*|href="#DateCard"]'); // 等待shadowRoot渲染完成,避免返回null if (useNode && useNode.shadowRoot) { const purplePath = useNode.shadowRoot.querySelector('path.purple'); // 接下来就可以操作这个path节点 console.log(purplePath); }
注:该DOM访问方案仅兼容 Chrome 90+、Firefox 105+、Safari 16.4+ 及以上版本,低版本环境优先选择CSS变量方案即可。
内容的提问来源于stack exchange,提问作者itsmikem
相关产品推荐
相关产品推荐

