正如你所看到的我的测试页 http://phrogz.net/svg/use_style_precedence.xhtml,如果您定义内部元素的视觉样式<defs>
文档的一部分,您不能覆盖该样式<use>
例如,不通过视觉属性,style
属性,或应用于<use>
.
此外,您不能在<use>
将样式级联到源元素的元素;为此,您必须使用 CSS 样式。
你必须:
- 确保您定义的元素没有应用视觉样式,并且
-
使用 CSS 或设置手动解析或创建style
属性,例如
node.setAttribute('style','fill:blue');
As 此处注明 https://stackoverflow.com/questions/4882890/svg-in-xhtml5-setting-attributes-with-proper-namespace你可以使用setAttribute(...)
or setAttributeNS(null,...)
对于 SVG 属性。
Update: 回答你的第二个问题:
如果引用的元素是包含 2 个其他元素(如矩形和文本)的“g”怎么办?
您不能使用 CSS 规则来选择 a 的伪子级<use>
;它们根本不存在。但是,您可以做的是应用您想要在内部保留的不变样式<def>
然后应用style
你想要在<use>
.
例如:
<defs>
<g id="foo">
<!-- Every rect instance should be filled with blue -->
<rect width="54" height="58" x="1.5" y="1.5"
fill="blue" />
<!-- I want to be able to change text color per use
so I must be sure not to specify the fill style -->
<text x="-34" y="47" transform="matrix(0.668,-0.744,0.744,0.668,0,0)"
style="font-size:30px;stroke-width:0px">JC!</text>
</g>
</defs>
<use xlink:href="#foo" style="fill:orange" transform="translate(0,-100)" />
<use xlink:href="#foo" style="fill:yellow" transform="translate(0, 100)" />
仅当您希望所有可更改项目的属性都以相同方式设置时,此方法才有效。
与 HTML 不同,SVG 中的标记is演示文稿。我上面建议的是一些碰巧起作用的黑客,但总的来说<use>
元素旨在实例化定义的完整外观。如果您需要每个实例的自定义外观,也许您应该考虑克隆元素、修改属性并将它们添加到文档中,而不是黑客攻击<use>
.