【问题标题】:SVG arc rendering artifacts in SafariSafari 中的 SVG 弧形渲染工件
【发布时间】:2016-12-29 23:08:36
【问题描述】:

我有一个非常简单的 SVG 来渲染:https://jsfiddle.net/091y7uyr/3/

那里有很多数学代码,但重点是:

<svg style="position:fixed;top:0px;left:0px;width:100%;height:100%;
pointer-events:none;">

<path d="
  M 65 51
  A 434.180675278184 434.180675278184
  0 0 0
  275.01708984375 351.9502944946289

  M 65 51
  A 399.44622125592934 399.44622125592934
  0 0 0
  275.01708984375 351.9502944946289" 

  fill="black" fill-rule="evenodd">
</path>

</svg>

结果如下:

但是,在 Safari 中,无论是在 iOS (v9.3.4) 还是桌面(v9.1,内部版本 11601.5.17.1)上,它看起来都有些不同:

有谁知道为什么会出现弧边之间的那条线,以及如何消除它?

【问题讨论】:

  • 您可以报告webkit错误here
  • 如何将页面webkit.org/reporting-bugs 滚动到底部并阅读一个突出显示的大文本“注意:Safari 不是 WebKit。应向 Apple 报告 Safari 错误。”?
  • Webkit 是渲染引擎,Safari 是浏览器。如果您对 Apple 的浏览器 chrome 有问题,如果它是您想要 webkit 的网页渲染。
  • 哦,现在我明白了。感谢您的澄清。

标签: ios svg safari


【解决方案1】:

您的 SVG 路径的构造有点奇怪。

<svg width="400px" height="400px">
  <path d="M 59 110
           A 167.87197502859138 167.87197502859138
             0 0 0 
             200 301

           M 59 110 
           A 159.4783762771618 159.4783762771618
             0 0 0
             200 301"
        fill="black" fill-rule="evenodd"></path>
</svg>

您已经通过绘制两条从同一位置开始并沿同一方向弯曲的子路径来构建您的形状。所以你实际上有两个circular segments 重叠在一起。

如果我们分别绘制它们并带有一点不透明性,您可以看到实际发生的情况。

<svg width="400px" height="400px">
  <path d="M 59 110
           A 167.87197502859138 167.87197502859138
             0 0 0 
             200 301" fill="red" opacity="0.4"/>
  <path d="M 59 110
           A 159.4783762771618 159.4783762771618
             0 0 0
             200 301" fill="green" opacity="0.4"/>
</svg>

您只看到两者之间的差异(薄半月形)的原因是因为您使用的是even-odd fill rule。当您使用奇偶填充规则时,重叠的子路径通常会创建一个洞。

您在两个端点之间看到的细线是由于两个正好位于彼此顶部的段边缘之间的抗锯齿轻微差异导致的伪影。抗锯齿是使用颜色阴影使线条边缘看起来更平滑。这可能在某种程度上发生在所有浏览器上。出于某种原因,它在 Safari 中更加明显。

幸运的是,在您的情况下,有一个简单的解决方法。不要使用两个子路径,只需将它们组合成一个路径。从矩形 A 到 B 有一条弧线,然后有一条弧线回到起点。如果你这样做,你多余的多余的行就会消失。

<svg width="400px" height="400px">
  <path d="M 59 110
           A 167.87197502859138 167.87197502859138
             0 0 0 
             200 301
           A 159.4783762771618 159.4783762771618
             0 0 1
             59 110"
        fill="black"></path>
</svg>

【讨论】:

  • 多么棒的答案。如此简单。我绝对应该多练习绘画......非常感谢!
猜你喜欢
  • 2019-08-18
  • 2020-04-28
  • 1970-01-01
  • 2011-11-06
  • 2012-08-14
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
相关资源
最近更新 更多