【问题标题】:SVG filters fuzzy in Safari under some circumstances在某些情况下,SVG 过滤器在 Safari 中模糊
【发布时间】:2018-06-05 04:06:11
【问题描述】:

我有一个带有交互式 SVG 的页面,它在所有浏览器(Firefox、Chrome,甚至 IE/Edge)上看起来都很好,除了 Safari,其中一个 SVG 过滤器影响的所有内容都会变成模糊的糊状物(看起来像是渲染到使用双线性插值放大的低分辨率画布)。

现在这里有一个小测试用例也出现了问题:

<svg>
  <defs>
    <filter id="filter" y="-100" x="-100" height="300" width="300">
      <feGaussianBlur in="SourceAlpha" stdDeviation="3.5"></feGaussianBlur>
      <feColorMatrix type="matrix" values="0 0 0 2 0   0 0 0 2 0   0 0 0 0 0   0 0 0 1 0" result="lightenedBlur"></feColorMatrix>
      <feMerge>
        <feMergeNode in="lightenedBlur"></feMergeNode>
        <feMergeNode in="SourceGraphic"></feMergeNode>
      </feMerge>
    </filter>
  </defs>
  <g>
    <rect x="10" y="10" width="100" height="100" fill="blue" filter="url(#filter)"></rect>
  </g>
</svg>

它在 Apple Safari 11(在 OS X 10.13 上)上的外观:

分别与 Google Chrome 和 Mozilla Firefox 进行比较:

在查看other SVG filter demo pages on the web 时,虽然效果显然不存在。不太清楚到底是什么原因造成的。我注意到,过滤区域越大,问题就越明显(通过&lt;filter&gt;width/height 属性控制)。

这是一个已知问题吗?在什么情况下会发生?什么是合理的解决方法?

【问题讨论】:

  • 您是否注意到两个过滤器原语使用result="lightenedBlur"
  • @ccprog 改了,没什么区别。

标签: d3.js svg safari mobile-safari svg-filters


【解决方案1】:

这不是错误。 Safari 正在惩罚您在过滤器声明中的错误语法:

<filter id="filter" y="-100" x="-100" height="300" width="300">

根据规范,这应该读作 height="30000%" 和 width="30000%"。 Safari 说“好吧,我猜你的意思是这个”并自动调整过滤器分辨率,因此它不会为这个非常大的缓冲区分配大量内存 -> 因此分辨率很差。

如果您的意思是 300% - 那么您需要投入 300%。这是一个修复:

<filter id="filter" y="-100%" x="-100%" height="300%" width="300%">

如果您的意思是 300 像素(真正的用户空间单位) - 那么这是另一个修复:

<filter id="filter" y="100" x="-100" height="300" width="300" filterUnits="userSpaceOnUse">

您必须通过指定 userSpaceOnUse 明确告诉 Safari 您的意思是像素(否则它使用静默默认 objectBoundingBox)

另一个修复 - 是通过显式指定 filterRes 来覆盖 Safari 的过滤器分辨率调整。 filterRes 已在新的 Filters 1.0 规范中被弃用,并已从最新的 Chrome 和 Firefox 中删除,但 Safari 仍然支持它。由于这会导致大量内存命中(并且很难相信您打算像以前那样调整过滤器的大小) - 不建议这样做。但无论如何 - 为了完整性。

<filter id="filter" y="-100" x="-100" height="300" width="300" filterRes="100000">

(另外两个小注意事项 - 您可以通过使用自动关闭元素来减少过滤器的冗长。并且您正在进行的模糊调整不会减轻模糊,它只会调高不透明度。)

【讨论】:

  • 你是对的,多么尴尬,我想我出于某种原因假设百分比是默认单位。我想我可以创建一些虚拟过滤器来显示尺寸。不知道filterRes,不知道是否值得为automatic filter areas 的想法重振旗鼓。
  • 一点也不尴尬。 SVG 在应该接受的内容上比 HTML/CSS 严格得多——Chrome 通过接受错误的语法来误导人们。
猜你喜欢
  • 1970-01-01
  • 2018-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多