为什么将CSS混合模式应用于文档主体时无效?

5
以下是CSS混合模式针对指定的“背景”元素工作的示例:

body {
  position: relative;
}

.background {
  position: absolute;
  top: 0; left: 0;
  height: 100%;
  width: 100%;
  background: linear-gradient(red, blue);
}

.blend {
  background: green;
  mix-blend-mode: difference;
}
<body>
  <div class="background"></div>
  <div class="blend">BLEND ME</div>
</body>

这是一个混合模式未应用于 body 的例子:

body {
  background-image: linear-gradient(red, blue);
  background-size: 100%;
  background-repeat: no-repeat;
}

.blend {
  background: green;
  mix-blend-mode: difference;
}
<body>
  <div class="blend">BLEND ME</div>
</body>

什么情况?计算CSS混合模式时是否不考虑元素?这适用于所有浏览器吗?我是谁,为什么在这里?当尝试在具有“background-attachment: fixed”的上实现动态(通过滚动)混合时,就会出现这个问题。
更新:这似乎只适用于Chrome;Firefox / Safari的行为符合预期 - Chrome怎么了?

4
Chrome存在已知问题,似乎是这样。https://dev59.com/CJzha4cB1Zd3GeqPHZiD https://dev59.com/KqHia4cB1Zd3GeqPNQs5 在Firefox中看起来没问题。 - BoltClock
1个回答

6
元素在Chrome中确实会混合,但前提是其背景不会传播到画布上。
要停止这种情况,请为<html>元素添加背景。

html {
  background-color: white;
}
body {
  background-image: linear-gradient(red, blue);
  background-size: 100%;
  background-repeat: no-repeat;
}
.blend {
  background: green;
  mix-blend-mode: difference;
}
<body>
  <div class="blend">BLEND ME</div>
</body>


为什么Firefox即使将背景传播到视口中也不会出现混合问题?此外,如果作者确实打算将背景传播,那么当将渐变应用于html元素而不是body元素时,Chrome仍然无法混合它。这似乎更多是与画布有关,而不是与html或body元素有关的问题。 - BoltClock
@BoltClock - 真的,我不知道,但是看规范说明它确实说背景是通过组合之前所有元素的结果得到的。也许Chrome开发者认为画布不构成先前的“元素”。 - Alohci
@Alohci被接受了,因为这对我的特定用例非常有帮助,尽管我仍然非常好奇为什么Chrome会出现这种情况...懒得在询问之前检查更多的浏览器 -__- - benjaminben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接