【问题标题】:Full width SVG, rounding errors in Safari全宽 SVG,Safari 中的舍入错误
【发布时间】:2020-10-05 15:31:24
【问题描述】:

在下图中,请注意粉色 SVG 的左右两侧是黑色边框:

演示:https://codepen.io/mhulse/pen/PoZGEqJ

在 Safari 中以特定视口大小查看时会发生这种情况(只需调整浏览器窗口的大小即可查看)。

我不想要黑色边框。

我能想到的一个解决方案是在父容器上添加一个插入框阴影,即白色背景的颜色(本质上是覆盖它)。

我不能接受的解决方案:

  • 1px 左侧/右侧边距。溢出是不可接受的,因为它会导致水平滚动(现实世界的用例会触及浏览器视口的边缘)。
  • 父级上隐藏的溢出(实际用例可能要求子级绝对位于容器外部)。

是否可以在 Safari 中强制 SVG 始终触摸容器边缘并且没有黑色间隙?

【问题讨论】:

  • 背景怎么样? updated codepen 这是因为抗锯齿,浏览器试图通过舍入坐标来避免大多数框(元素)。当然,Safari 对 HTML 和 SVG 元素有不同的规则,最终 HTML 元素会被拉伸,而 svg 路径会收缩到最近的像素坐标。请注意,即使在非 100% 缩放级别的 Firefox 上,您也会有相同的行为。强制在 SVG 图像中进行整个渲染将强制使用一致的舍入规则,因此可以避免该问题。
  • 哇!您的解决方案看起来很有希望!感谢您的回复/帮助!我现在正在测试。我会在这里回复我的结果。谢谢!!!!!!我仍在试图理解为什么 rect 似乎可以解决这个问题(现在重新阅读你的评论)你摇滚!再次,我会带着我的发现回来,所以我可以给你绿色的复选标记!

标签: svg safari rounding-error


【解决方案1】:

您可以直接在 svg 图片中使用 作为背景,而不是 CSS 背景。

body {
  padding: 20px;
}
.box .box-x-cap {
  display: block;
  width: 100%;
}
<div class="box">
  <svg class="box-x-cap" aria-hidden="true" viewBox="0 0 1600 227">
    <rect width="1600" height="277"/>
    <path d="m0 227v-227h1600v32z" fill="pink"></path>
  </svg>
  <p>This is some content.</p>
</div>

这里的问题是,大多数浏览器会尽力避免对 DOM 元素进行抗锯齿处理,为此,它们会将本应浮动的坐标四舍五入。
Safari 当然对 HTML 元素和 SVG 内容使用不同的规则,这会产生这种差异,在某些情况下 的 CSS 框会被拉伸,而内部 会缩小,导致背景在边缘。

通过在后面画一个,我们保持整个绘图区域在相同的规则下,并且舍入保持一致-> 将同时拉伸或收缩方向。

【讨论】:

  • 你摇滚!太感谢了!!!这完美地工作。我欠你一个人情! :)
猜你喜欢
  • 1970-01-01
  • 2014-08-09
  • 2020-12-27
  • 2018-03-01
  • 1970-01-01
  • 2010-10-31
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多