我有一个包含 SVG 图像的 HTML 网页。当我使用 iOS Safari 或 Android 浏览器访问它时,页面上出现了问题(如下图所示的白线过多)。屏幕截图分辨率为 2x,这条锯齿边缘是一张 SVG 图像。
我发现问题出现在 SVG 图像的页面 Y 轴位置不是 CSS 像素(px
)的整数倍时,即当位置是 ½px
时。当浏览器渲染网页时,它会将 SVG 图像位置四舍五入为整数 px
,而不会将其他元素位置四舍五入。这就是为什么会出现 ½px
的线。
你可以使用下面的代码片段(或这个 CodePen)重现此问题。您应该在像素密度较高的设备上运行代码。如果在响应式设计模式下选择 iPhone 或 iPad,您也可以在桌面 Safari 中重现此问题。
.common-bg {
background: #222;
fill: #222;
}
.block {
max-width: 300px;
margin: 20px auto;
}
.block_content {
height: 50.5px;
}
.block_edge {
display: block;
}
<div class="block">
<div class="block_content common-bg"></div>
<svg
class="block_edge"
width="100%"
height="10"
xmlns="http://www.w3.org/2000/svg"
version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
>
<defs>
<pattern id="sawPattern" x="50%" width="20" height="10" patternUnits="userSpaceOnUse">
<path d="M 0 0 L 10 10 L 20 0 Z" class="common-bg"/>
</pattern>
</defs>
<rect x="0" y="0" width="100%" height="10" fill="url(#sawPattern)"/>
</svg>
</div>
px
的SVG偏移?这是个bug吗?需要向WebKit开发者报告吗?也许有一种方法可以使浏览器将页面上的其他元素舍入为px
?我可以解决此问题,而无需防止½
px
的偏移:- 删除
.block_content
的非整数高度
- 进行这样的布局,其中半像素偏移不会导致白线但我想知道是否有一种方法可以防止½
px
的偏移,因为上述解决方案并非总是可行。
::after
CSS规则添加Zigzag。 - Ruskin