【问题标题】:How to prevent pixelation on Safari browser when using filter?使用过滤器时如何防止Safari浏览器上的像素化​​?
【发布时间】:2020-02-18 21:54:03
【问题描述】:

在下面的演示中,我在 Safari 中看到通过应用

svg { filter: blur(0); /* even with no-op filter */ }

这种情况只发生在 Safari 中,而不发生在 Chrome 中

#scene {
   filter: blur(0); /* even with no-op filter */
   transform-origin: 0 0;
   transform: scale(6);
}
<div id="scene">
  hello
</div>

如何在保持 SVG 上的投影的同时防止像素化?

【问题讨论】:

  • It's not limited to svg,只是他们先渲染 css 过滤器然后转换结果,我怀疑是否有解决方法,但肯定值得报告错误。
  • @Kaiido 谢谢,这确实缩小了问题范围,我向 Safari 团队提出了一个错误

标签: javascript css svg safari svg-filters


【解决方案1】:

这是因为 Safari 正在优化规模并在 GPU 上进行转换。您想阻止 Safari 执行此操作并强制它在 CPU 上重新渲染(这会降低电源效率。)

您要更改的函数很可能是 panzoom.js 中的这个函数

  function applyTransform(transform) {
    svgElement.setAttribute('transform', 'matrix(' +
      transform.scale + ' 0 0 ' +
      transform.scale + ' ' +
      transform.x + ' ' + transform.y + ')')
  }

您想在此处添加另一个属性以启动 Safari 重新渲染。您可能必须尝试添加诸如 enable-background: new 或 shape-rendering:geometricPrecision 之类的属性,以查看可能有效的方法。注意 - 您可能需要进行大量实验,并且无法保证任何有效的方法都会继续有效。

【讨论】:

  • 我怀疑一个简单的属性会在这里做任何事情。虽然当我强制禁用“Accelerated Compositing”时,我的 Safari 根本不渲染任何内容,但禁用“*Full Page Accelerated Drawing¨”并不会改变任何内容。请注意,它不仅限于 svg 渲染,它对 css 过滤器是全局的。问题是他们首先在位图画布上绘制过滤器,然后转换这些画布。
  • geometricPrecision 没有帮助,我发现的唯一方法是对变换值进行四舍五入,但这会扼杀平移和缩放的全部目的jsfiddle.net/dota2pro/q2syfLjv
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2017-03-07
  • 2016-05-14
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多