Firefox SVG 图形模糊

Posted

技术标签:

【中文标题】Firefox SVG 图形模糊【英文标题】:Firefox SVG graphics blurry 【发布时间】:2012-02-15 18:19:11 【问题描述】:

我有一个带有 SVG 徽标/图像的响应式网页设计,它的容器是动态的。所有主流浏览器似乎都支持 SVG 真的很好。

我的 SVG 是动态的,所以如果我放大浏览器窗口,SVG 也会这样做。在 Chrome 和 IE9 中,它就像一个魅力。在 Firefox 中,SVG 在某些尺寸下是模糊的。但是当它超过初始 SVG 大小时,我不能说它一直是模糊的。在我放大浏览器窗口时,它似乎并没有一直正确地重新渲染。

这就是它有时的样子(在fullsize 中查看它以了解不同之处):

也许我使用了错误的方式来嵌入它。这就是我的 CSS 和 html 的样子:

<div id="logo"></div>

CSS:

#logo 
   background-image: url('http://dl.dropbox.com/u/569168/jess.svg');
   height: 22em;
   background-repeat: no-repeat;
   -webkit-background-size: 100%;
   -moz-background-size: 100%;
   -o-background-size: 100%;
   background-size: 100%;

如果您想查看它,请使用 CSS 中的链接获取 SVG。它是用 Adob​​e Illustrator 制作的。

知道如何解决这个问题吗?

【问题讨论】:

【参考方案1】:

问题在于,当您使用 SVG 作为背景图像时,Firefox 会选择将矢量渲染到的大小,然后根据需要放大这些基于图像的像素。这是一个相关的错误:https://bugzilla.mozilla.org/show_bug.cgi?id=600207

这里最简单的解决方法是不使用 SVG 作为背景图片,而是直接嵌入您的 SVG,或者通过 &lt;img&gt; 标签引用它。

如果您提交了一个显示问题和文件的工作测试用例,那么我们可以帮助您提供实际代码和修复。

【讨论】:

【参考方案2】:

我自己也遇到了完全相同的问题。通过在文本编辑器中编辑 SVG 并将 &lt;svg&gt; 元素的宽度属性值更改为 100%,我能够在 Firefox 中修复它,但保留所有其他属性值。在您的特定示例中,要进行以下更改:

<svg version="1.1" 
    xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/" 
    x="0px"
    y="0px"
    
     
    viewBox="0 0 347 189" 
    enable-background="new 0 0 347 189" 
    xml:space="preserve">

这对我有用,也应该对你有用;但是,如果没有测试用例,我就不能 100% 工作。

注意:在我的特殊情况下,将宽度 高度都设置为 100% 破坏了 Safari 对 SVG 的渲染。请务必仅将宽度设置为 100%。

【讨论】:

【参考方案3】:

2013-10 更新:确认已在 v24 中修复,现已进入发布渠道


2013 年 7 月更新:Bug is solved! 修复将使其进入 Firefox 24,该版本将在 9 月至 10 月之间发布


我在某个地方读到了一个关于这个问题的简单解决方案,我现在在我的项目中使用它(当我再次找到它时会添加源代码):

只需将 svg 容器的宽度和高度设置为图像可能具有的最大值,就可以了。在所有当前浏览器中都可以正常工作。唯一的限制是,firefox 和 opera(是的,导致这种混乱的两个浏览器)不能很好地处理非常大的图像 --> 不要对尺寸使用太高的值

原始文件:

<svg  > 

假设最大宽度将是 3 倍那么大,那么您的 SVG 应该包含以下内容:

<svg  > 

(是的,svg 节点可以有更多属性...)

之所以可行,是因为 Opera 和 FF 会在调整 SVG 大小之前渲染 SVG,而不是像使用矢量 gfx 那样反过来进行渲染

更新:感谢 David Bushell,他在 Resolution Independence With SVG 上写了一篇精彩的文章。

【讨论】:

似乎在100% 设置widthheight 属性也可以解决问题。 是的,这可以提供帮助,但它在我的测试中表现不佳,导致 FF 消耗的 CPU 比正常情况多。此外:浏览器将不再知道您文件的正确纵横比 +1 因为将 SVG 的尺寸设置为最大尺寸可能会解决我遇到的模糊问题。我注意到这只是 SVG 精灵的一个主要问题。如果 SVG 类似于徽标,您可以删除 widthheight 属性,或者不设置 background-size 或将其设置为 cover - SVG 将是节点的大小并且不会在 Firefox 或 Safari 中似乎很模糊 使用transform="scale()"时问题依旧存在。 @Josh Mozilla 的跟踪器中是否有一个开放的错误?如果没有,你能创建一个吗?【参考方案4】:

要制作 SVG 图像 scale to the size of its container,请确保您的 svg 标签设置了 viewBox

<svg viewBox="0 0 347 189">

但没有widthheight 属性,即没有:

<svg   viewBox="0 0 347 189">

默认情况下,这将通过放大到适合的最大宽度或高度来保持其纵横比,无论哪个维度首先到达边界。

您可以通过各种有趣的方式更改 preserveAspectRatio 策略,如果该特定行为不是您想要的。

【讨论】:

background-size 一起正常工作,而标记的答案则不能。 在 FF36 中按预期工作。【参考方案5】:

最简单的解决方案是在 Illustrator 等矢量图像编辑器中放大 SVG。将其缩放到浏览器中的渲染分辨率(或更高)。由于它是矢量,因此将其放大不会影响文件大小。

【讨论】:

【参考方案6】:

我发现另一个类似的“陷阱”是当我从 illustrator 导出 svg 时,宽度和高度不是整数 - 所以当我在编辑器中打开 SVG 时,宽度类似于“100.6789px”。通过在 illustrator 中仔细地将图像编辑为整数,然后在 Firefox 中使用相同的宽度和高度,它为我解决了模糊图像。

【讨论】:

以上是关于Firefox SVG 图形模糊的主要内容,如果未能解决你的问题,请参考以下文章

过滤器:mozilla firefox <svg> 的模糊不工作

SVG defs 使用不同图形之间的关系 Firefox

如何在 Firefox 和 Internet Explorer 中使 SVG 更清晰

SVG 过滤器仅在添加样式属性 (Firefox) 时有效

Firefox 没有抗锯齿缩放背景 svg

SVG "fill: url(#....)" 在 Firefox 中表现异常