Chrome 中重复线性渐变的渲染问题
Rendering issue with repeating linear gradient in Chrome
我遇到了一个重复线性渐变的错误,它影响了 Chrome 中的渲染质量。它们在 FireFox 中看起来很完美。
我有 60 度条纹的元素。在 FireFox 中,条纹的边缘非常光滑并且看起来不错。
然而,在 Chrome 中,每个条纹的边缘都是锯齿状的,与 FireFox 中的渲染相比,看起来有些不起眼。
background: repeating-linear-gradient(-60deg, rgba(231, 117, 29, 1.0), rgba(231, 117, 29, 1.0) 10px,rgba(236, 144, 74,1.0) 10px, rgba(236, 144, 74, 1.0) 20px) repeat scroll 0% 0% / 23px 100%;
看看 1 倍和 5 倍变焦的一些比较图像:
在 5 倍缩放图像中,您可以看到在 FireFox 中条纹边缘被抗锯齿,而抗锯齿在 Chrome 中不存在或非常差。
我有Fiddle显示效果,在FireFox中运行和Chrome并排时非常有特色:Fiddle
我已经尝试了什么?
我知道并尝试过之前的问题和网络中的建议,包括添加各种 CSS 技巧来强制 3d 加速(即 translate(0)
、perspective: 1000
等.) 和 transform-style: preserve-3d
.
我也知道在 Chrome 中使用 45 度角是平滑的。但是,由于我使用的矩形的形状,我想尽可能使用 60 度角。
我想要什么结果?
我真的很想看到条纹在 Chrome 中呈现得像在 FireFox 中一样流畅。
对于如何实现这一点,我只是没有其他想法。
在接受了几个月的低质量之后,我终于找到了解决这个问题的方法,涉及使用 SVG 而不是 repeating-linear-gradiant
。
我创建了一个包含条纹的 SVG,然后将其嵌入到条纹范围内:
body {
background: #20262E;
}
.slide {
background-color: rgba(231, 117, 29, 1.0);
border: 1px solid black;
height: 80px;
overflow: hidden;
}
.stripe {
width: 120%;
height: 100%;
display: inline-block;
}
.stripe svg {
animation: slide 1s linear infinite;
color: rgba(236, 144, 74,1.0);
}
@keyframes slide {
0% { transform: translateX(0); }
100% { transform: translateX(-40px); }
}
<div class="slide">
<span class="stripe">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<defs>
<pattern id="stripe" patternUnits="userSpaceOnUse" width="20" height="20" patternTransform="rotate(60)">
<line x1="0" y="0" x2="0" y2="20" stroke="currentColor" stroke-width="20" />
</pattern>
</defs>
<rect width="100%" height="100%" fill="url(#stripe)" opacity="1" />
</svg>
</span>
</div>
.stripe
元素的宽度设置为父元素的 120%,以允许条纹的右侧在容器内正确设置动画。
这里的结果清晰可见:
您可以看到,尽管 Chrome 和 FireFox 对条纹的渲染略有不同,但 Chrome 正确地对其进行了抗锯齿处理,因此看起来比以前平滑得多。
还有一个 Fiddle 显示此工作。
我遇到了同样的问题。我在没有 SVG 的情况下解决了这个问题,方法是在颜色变化时添加一个渐变像素。示例:
background: repeating-linear-gradient(-60deg, white 0, blue 1px, blue 10px, white 11px, white 20px);
我遇到了一个重复线性渐变的错误,它影响了 Chrome 中的渲染质量。它们在 FireFox 中看起来很完美。
我有 60 度条纹的元素。在 FireFox 中,条纹的边缘非常光滑并且看起来不错。 然而,在 Chrome 中,每个条纹的边缘都是锯齿状的,与 FireFox 中的渲染相比,看起来有些不起眼。
background: repeating-linear-gradient(-60deg, rgba(231, 117, 29, 1.0), rgba(231, 117, 29, 1.0) 10px,rgba(236, 144, 74,1.0) 10px, rgba(236, 144, 74, 1.0) 20px) repeat scroll 0% 0% / 23px 100%;
看看 1 倍和 5 倍变焦的一些比较图像:
在 5 倍缩放图像中,您可以看到在 FireFox 中条纹边缘被抗锯齿,而抗锯齿在 Chrome 中不存在或非常差。
我有Fiddle显示效果,在FireFox中运行和Chrome并排时非常有特色:Fiddle
我已经尝试了什么?
我知道并尝试过之前的问题和网络中的建议,包括添加各种 CSS 技巧来强制 3d 加速(即 translate(0)
、perspective: 1000
等.) 和 transform-style: preserve-3d
.
我也知道在 Chrome 中使用 45 度角是平滑的。但是,由于我使用的矩形的形状,我想尽可能使用 60 度角。
我想要什么结果?
我真的很想看到条纹在 Chrome 中呈现得像在 FireFox 中一样流畅。
对于如何实现这一点,我只是没有其他想法。
在接受了几个月的低质量之后,我终于找到了解决这个问题的方法,涉及使用 SVG 而不是 repeating-linear-gradiant
。
我创建了一个包含条纹的 SVG,然后将其嵌入到条纹范围内:
body {
background: #20262E;
}
.slide {
background-color: rgba(231, 117, 29, 1.0);
border: 1px solid black;
height: 80px;
overflow: hidden;
}
.stripe {
width: 120%;
height: 100%;
display: inline-block;
}
.stripe svg {
animation: slide 1s linear infinite;
color: rgba(236, 144, 74,1.0);
}
@keyframes slide {
0% { transform: translateX(0); }
100% { transform: translateX(-40px); }
}
<div class="slide">
<span class="stripe">
<svg xmlns="http://www.w3.org/2000/svg" width="100%" height="100%">
<defs>
<pattern id="stripe" patternUnits="userSpaceOnUse" width="20" height="20" patternTransform="rotate(60)">
<line x1="0" y="0" x2="0" y2="20" stroke="currentColor" stroke-width="20" />
</pattern>
</defs>
<rect width="100%" height="100%" fill="url(#stripe)" opacity="1" />
</svg>
</span>
</div>
.stripe
元素的宽度设置为父元素的 120%,以允许条纹的右侧在容器内正确设置动画。
这里的结果清晰可见:
您可以看到,尽管 Chrome 和 FireFox 对条纹的渲染略有不同,但 Chrome 正确地对其进行了抗锯齿处理,因此看起来比以前平滑得多。
还有一个 Fiddle 显示此工作。
我遇到了同样的问题。我在没有 SVG 的情况下解决了这个问题,方法是在颜色变化时添加一个渐变像素。示例:
background: repeating-linear-gradient(-60deg, white 0, blue 1px, blue 10px, white 11px, white 20px);