外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好

Posted

技术标签:

【中文标题】外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好【英文标题】:Firefox SVG with fill:url(#id) style in external stylesheet broken, inline styles are fine 【发布时间】:2013-04-05 19:42:00 【问题描述】:

仅在 Firefox 中,如果我尝试为 svg 路径提供模式引用,例如:

路径 填充:网址(#ref);

在外部样式表中,它呈现为不可见。如果我内联或在页面上的标签中执行此操作,则它可以工作。

这是我的小提琴,这是我的代码转储,因为 SO 不会让我只发布小提琴。 http://jsfiddle.net/v5VDp/1/

    <pattern id="texture_base" x="0" y="0" patternUnits="userSpaceOnUse"  >
        <image x="0" y="0"   xlink:href=""/>
    </pattern>

        <pattern id="texture1" x="0" y="0" patternUnits="userSpaceOnUse"  >
        <rect fill='url(#color1)' stroke="none" x="0" y="0"  /> 
            <rect fill='url(#texture_base)' x="0" y="0"  / />

    </pattern>
</defs>
</svg>

.slice:nth-child(6n + 2) 路径 填充:网址(#texture1);

https://dl.dropbox.com/s/wkzaoiwnw6ghsmd/simple_svg_test.css

【问题讨论】:

【参考方案1】:

#texture1&lt;url of this file&gt; + #texturl 的缩写。因此,在外部样式表中,#texture1 将指向样式表本身中的某些内容,因为该元素在 svg 文件中,所以无法找到。

Webkit 总是犯这个错误,导致很多混乱。你应该会发现 Opera 和 IE 一样匹配 Firefox 的行为。

如果您想在样式表中执行此操作,您必须使用绝对 URL,例如网址(http://jsfiddle.net/v5VDp/1/#texture1)

CSS specification 涵盖了这一点。您可以随时联系CSS working group and suggest that they do something about it。

【讨论】:

那么如何在外部样式表中引用当前的dom呢?这似乎很反直觉 这是 CSS 样式表的规则。我猜他们并没有真正考虑到 SVG 用例。 我看到你评论了很多围绕这个案例提交的 firefox 错误......我知道样式表规范说你应该如何引用 url,但你基本上是在强迫我把我可能在页面上内联的任何 svg 样式......似乎 Chrome/webkit 做出的妥协是合乎逻辑的。 或者至少给我一个强制它的选项【参考方案2】:

当我们使用 css(外部和内部 css)分配以下代码时,SVG “fill: url(#…)”在 Firefox 中的行为很奇怪。

#myselector 
fill: url('#gradient-id');

解决方案

提供内联样式,这可以通过两种方式完成。静态或动态方式

动态方式

.attr('fill', 'url(#gradient-id)')

静态方式

fill="url(#gradient-id)" 

在静态中你必须把它放在 SVG html 中;

【讨论】:

这个也可以,用js替换css代码。

以上是关于外部样式表中带有 fill:url(#id) 样式的 Firefox SVG,内联样式很好的主要内容,如果未能解决你的问题,请参考以下文章

使用 jQuery 修改 css 中带有 !important 的样式属性

js操作元素样式

CSS

前端随堂笔录3

如何链接外部CSS样式表

刚刚接触样式表的时候应该注意的问题