为什么样式不适用于 Firefox 中的 svg 元素?
Why is style not applied to svg element in Firefox?
我想将 CSS 样式应用于 SVG <defs>
元素内的 SVG 元素。在 Chrome 和 Internet Exporer(版本 11)中,以下代码可以正常工作,但在 Firefox 中却不行。如何在 Firefox 中也将样式应用于 defs
内的 SVG 元素?
#symbolcontainer.green #mysymbol { fill: green; }
<svg>
<g id="symbolcontainer" class="green">
<defs>
<g id='mysymbol'>
<defs>
<circle id="myCircle" r="2" cx="2" cy="2"/>
</defs>
<use href="#myCircle"/>
</g>
</defs>
<use href="#mysymbol" />
</g>
</svg>
在 chrome 和 Internet Explorer 中圆圈是绿色的(应用了样式)在 Firefox 中是黑色的(未应用样式)。
查看并测试此 fiddle。
我在 Whosebug 上搜索了“svg firefox style defs”,但没有找到我的问题的答案。
在 SVG 2 中,如果样式 cross the shadow-element boundary,则不会应用它们。
影子树由 <use>
个元素创建,由 <use>
元素指向的 "shadows" 个元素(及其子元素)组成。
换句话说,如果您有一个复杂的选择器(包含 2 个或更多元素)并且其中一个元素从主文档中选择,而另一个在 use 元素的子元素中选择,则不会应用它.
让我们看看您的选择器。
- 符号容器在主文档中
- mysymbol 在影子树中,它被克隆到
<use>
元素中。
因此该选择器在符合 SVG 2 的实现中不应执行任何操作。
如果您想要应用一种样式,只需将选择器设置为一个或另一个部分,这样它就不会越界。例如
#symbolcontainer.green { fill: green; }
<svg viewBox="0 0 5 5">
<g id="symbolcontainer" class="green">
<defs>
<g id='mysymbol'>
<defs>
<circle id="myCircle" r="2" cx="2" cy="2"/>
</defs>
<use href="#myCircle"/>
</g>
</defs>
<use href="#mysymbol" />
</g>
</svg>
Firefox 实现了 SVG 2 规范的这一部分,其他浏览器可能会在某个时候赶上并实现它。
我想将 CSS 样式应用于 SVG <defs>
元素内的 SVG 元素。在 Chrome 和 Internet Exporer(版本 11)中,以下代码可以正常工作,但在 Firefox 中却不行。如何在 Firefox 中也将样式应用于 defs
内的 SVG 元素?
#symbolcontainer.green #mysymbol { fill: green; }
<svg>
<g id="symbolcontainer" class="green">
<defs>
<g id='mysymbol'>
<defs>
<circle id="myCircle" r="2" cx="2" cy="2"/>
</defs>
<use href="#myCircle"/>
</g>
</defs>
<use href="#mysymbol" />
</g>
</svg>
在 chrome 和 Internet Explorer 中圆圈是绿色的(应用了样式)在 Firefox 中是黑色的(未应用样式)。
查看并测试此 fiddle。
我在 Whosebug 上搜索了“svg firefox style defs”,但没有找到我的问题的答案。
在 SVG 2 中,如果样式 cross the shadow-element boundary,则不会应用它们。
影子树由 <use>
个元素创建,由 <use>
元素指向的 "shadows" 个元素(及其子元素)组成。
换句话说,如果您有一个复杂的选择器(包含 2 个或更多元素)并且其中一个元素从主文档中选择,而另一个在 use 元素的子元素中选择,则不会应用它.
让我们看看您的选择器。
- 符号容器在主文档中
- mysymbol 在影子树中,它被克隆到
<use>
元素中。
因此该选择器在符合 SVG 2 的实现中不应执行任何操作。
如果您想要应用一种样式,只需将选择器设置为一个或另一个部分,这样它就不会越界。例如
#symbolcontainer.green { fill: green; }
<svg viewBox="0 0 5 5">
<g id="symbolcontainer" class="green">
<defs>
<g id='mysymbol'>
<defs>
<circle id="myCircle" r="2" cx="2" cy="2"/>
</defs>
<use href="#myCircle"/>
</g>
</defs>
<use href="#mysymbol" />
</g>
</svg>
Firefox 实现了 SVG 2 规范的这一部分,其他浏览器可能会在某个时候赶上并实现它。