mix-blend-mode 仅作用于同一层叠上下文内重叠的兄弟元素,不适用于普通HTML元素的背景与自身内容混合,且父容器不能设置 isolation: isolate 或 opacity。

mix-blend-mode 不能直接用在普通 HTML 元素上实现“背景+内容混合”——它只对**重叠的、处于同一 stacking context 中的兄弟元素**生效,且父容器不能有 isolation: isolate 或 opacity
mix-blend-mode 生效的前提条件
很多人写完 mix-blend-mode: multiply 没反应,第一反应是浏览器不支持,其实八成是结构/层叠问题:
- 必须有两个(或以上)**定位后发生视觉重叠**的元素,比如一个 和一个
,且它们没有被父级的isolation: isolate包裹- 父容器不能有
opacity: 0.99、transform: translateZ(0)、filter: blur(1px)等隐式创建新 stacking context 的属性- 元素不能是
display: inline(默认值),需设为block、inline-block或带定位(position: relative/absolute)才能参与混合- Chrome/Firefox/Edge 104+ 支持良好,但 Safari 对
mix-blend-mode在video或canvas上的支持仍不稳定常见 blend mode 值的实际效果差异
别死记定义,看颜色行为更准:假设底层是浅灰(#ccc),上层是亮红(#f00)
-
normal:无混合,红盖灰 -
multiply:变暗,“红 × 灰” → 暗红,适合叠加阴影或纹理 -
screen:变亮,“1 − (1−红) × (1−灰)” → 浅粉,适合光晕、高光 -
overlay:根据底层明暗自动切分 multiply/screen,保留对比度,文字压图常用 -
exclusion:类似差值但对比更低,常用于柔和褪色效果 -
color-burn:强烈加深,容易过曝,慎用;lighten/darken则只取 RGB 各通道最大/最小值,行为更可预测
和 background-blend-mode 的关键区别
这是最容易混淆的点:
background-blend-mode混合的是**同一个元素的多个 background 图层**(如渐变 + 图片),而mix-blend-mode混合的是**不同 DOM 元素之间的像素**。例如:
.card { background: linear-gradient(45deg, #ff6b6b, #4ecdc4); background-image: url("texture.png"); background-blend-mode: overlay; /* ✅ 合法:同元素多背景 */ } <p>.overlay { mix-blend-mode: hard-light; /<em> ✅ 合法:但需和下方兄弟元素重叠 </em>/ } </p>如果你试图对一个带背景图的
单独设mix-blend-mode,却没给它上面再盖一层元素,那它根本没东西可混合——值就等于没写。移动端与性能要注意的坑
mix-blend-mode在 iOS Safari 上可能触发强制 CPU 渲染,滑动时掉帧明显;Android Chrome 虽支持,但大量使用会显著增加合成层压力。- 避免在
scroll或hover动画中动态切换该属性(重绘开销大) - 不用
mix-blend-mode实现“文字镂空背景”——改用background-clip: text+-webkit-text-fill-color: transparent更高效 - 真要混合视频/Canvas,请先测 iOS 表现;Safari 目前对
mix-blend-mode在上的混合结果常为空白或闪烁 - 调试时可用 DevTools 的 “Rendering” 面板勾选 “Blend modes” 查看哪些元素实际参与了混合
最常被忽略的一点:混合不是滤镜,它不改变元素自身,只改变它和下面元素交叠区域的最终像素输出。一旦重叠关系断开(比如 margin 太大、z-index 错乱),效果立刻消失,而且不会报错、没有提示。
- 父容器不能有
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











