Chrome 在渲染多个渐变时在中间留下白色 space/gap

Chrome leaves white space/gap in between when rendering multiple gradients

我正在阅读 Lea Verou 的书 "CSS Secrets"。

有一个圆角径向多重渐变的例子: http://dabblet.com/gist/24484257bc6cf7076a8e

IE11、Edge 和 FF 按预期正确显示。但是 Chrome 在块内部创建了奇怪的边框。 我不明白为什么。它看起来像一个错误。谁能解释这种行为,这可能只是 Blink 规范的一部分?

div {
 background: #58a;
 background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left,
             radial-gradient(circle at top right, transparent 15px, #58a 0) top right,
             radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right,
             radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left;
 background-size: 50% 50%;
 background-repeat: no-repeat;
 
    width:4em;
    height:4em;
 padding: 1em 1.2em;
 max-width: 12em;
 color: white;
 font: 130%/1.6 Baskerville, Palatino, serif;
}
<div></div>

我没有任何官方消息来源支持这个答案(目前还没有,我正在努力寻找,如果我能找到的话会添加到这里)但我在 Chrome 中看到过类似的问题在过去,它们似乎是因为计算值在 Chrome 中的四舍五入方式。此处进行四舍五入是因为背景大小在 X 轴和 Y 轴上均为 50%,而 50% 的计算值是分数。计算在下面的代码片段中以内联注释的形式提供。

Blink/WebKit 似乎将计算值向下舍入,而不管它是否高于 0.5。在此演示中,元素的总高度为 124.8px,宽度为 133.12px。因此,50% 的值变为 62.4px 和 66.56px(四舍五入为 62 和 66px)。代码段中的第三个 div 将这些值明确设置为 background-size,我们可以看到它的输出看起来与第一个(具有 background-size: 50% 50%)相同,从而证明了解释。

这样四舍五入后,背景实际占用的面积横向为132px(比实际宽度少1.12px),纵向为124px(比实际高度少0.8px) .因此它在两者之间留下了差距。

This blog post by John Resig 还提供了一些关于浏览器中舍入处理方式的见解。正如我们所见,Blink/WebKit 正在向下舍入,而 IE 似乎正在向上舍入。四舍五入意味着计算值将变为 63px 和 67px,这不会明显显示任何问题,因为所有边的颜色都相同,所以它们只是重叠并填充 space(Chrome 也显示当我们为背景大小明确设置这些值时没有问题 - 请参阅第二个 div)。 Firefox 似乎有一个全面的舍入逻辑,它似乎将一些舍入,而另一些则舍入以完全填充 space,因此也没有显示任何问题。

div {
 background: #58a;
 background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left,
             radial-gradient(circle at top right, transparent 15px, #58a 0) top right,
             radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right,
             radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left;
 background-size: 50% 50%;
 background-repeat: no-repeat;
 
    width:4em;            /* 83.2px */
    height:4em;           /* 83.2px */
 padding: 1em 1.2em;   /* left/right padding = 24.96px, top padding = 20.8px */
 max-width: 12em;
 color: white;
 font: 130%/1.6 Baskerville, Palatino, serif;  /* font-size = 130% of 16px = 20.8px */
}

/* so,
total width = 83.2px + (24.96px * 2) = 133.12px (50% = 66.56px)
total height = 83.2px + (20.8px * 2) = 124.8px (50% = 62.4px)
*/

div:nth-of-type(2) {
  background-size: 67px 63px;
}
div:nth-of-type(3) {
  background-size: 66px 62px;
}

div{
  display: inline-block;
  margin: 10px;
}
<div></div>
<div></div>
<div></div>


不仅径向渐变会出现这种情况,线性渐变也会出现这种情况。

div {
 background: #58a;
 background: linear-gradient(red, red) top left,
             linear-gradient(blue, blue) top right,
             linear-gradient(green, green) bottom right,
             linear-gradient(tomato, tomato) bottom left;
 background-size: 50% 50%;
 background-repeat: no-repeat;
 
    width:4em;            /* 83.2px */
    height:4em;           /* 83.2px */
 padding: 1em 1.2em;   /* left/right padding = 24.96px, top padding = 20.8px */
 max-width: 12em;
 color: white;
 font: 130%/1.6 Baskerville, Palatino, serif;  /* font-size = 130% of 16px = 20.8px */
}

/* so,
total width = 83.2px + (24.96px * 2) = 133.12px (50% = 66.56px)
total height = 83.2px + (20.8px * 2) = 124.8px (50% = 62.4px)
*/

div:nth-of-type(2) {
  background-size: 67px 63px;
}
div:nth-of-type(3) {
  background-size: 66px 62px;
}

div{
  display: inline-block;
  margin: 10px;
}
<div></div>
<div></div>
<div></div>

还有图片。

div {
 background: #58a;
 background: url(http://lorempixel.com/100/100/animals/1) top left,
             url(http://lorempixel.com/100/100/animals/2) top right,
             url(http://lorempixel.com/100/100/animals/3) bottom right,
             url(http://lorempixel.com/100/100/animals/4) bottom left;
 background-size: 50% 50%;
 background-repeat: no-repeat;
 
    width:4em;            /* 83.2px */
    height:4em;           /* 83.2px */
 padding: 1em 1.2em;   /* left/right padding = 24.96px, top padding = 20.8px */
 max-width: 12em;
 color: white;
 font: 130%/1.6 Baskerville, Palatino, serif;  /* font-size = 130% of 16px = 20.8px */
}

/* so,
total width = 83.2px + (24.96px * 2) = 133.12px (50% = 66.56px)
total height = 83.2px + (20.8px * 2) = 124.8px (50% = 62.4px)
*/

div:nth-of-type(2) {
  background-size: 67px 63px;
}
div:nth-of-type(3) {
  background-size: 66px 62px;
}

div{
  display: inline-block;
  margin: 10px;
}
<div></div>
<div></div>
<div></div>

Note: I've been wanting to post a self Q & A for documenting this behavior for quite sometime now, so thank you for asking :)