mix-blend-mode能让重叠的<img>元素实现Photoshop式混合,但需同时满足四个条件:元素必须是普通DOM(非background-image)、视觉重叠、同属一个stacking context、且为兄弟元素;失效主因是父容器触发新层叠上下文,如transform/filter/isolation等。
直接说结论:mix-blend-mode 能让重叠的 <img> 元素实现 Photoshop 式混合,但极易因 stacking context 中断而失效,不是“设了就出效果”的 CSS 属性。
mix-blend-mode 生效必须满足的 4 个条件<img> 必须是普通流内元素(不能是 background-image),且彼此在视觉上重叠(比如都 position: absolute 叠在同一区域)isolation: isolate、transform、filter、opacity < 1 等会创建新 stacking context 的属性<img> 和父容器外的 <img> 不会混合)'multiply'、'screen'、'overlay' 在 Chrome/Firefox/Edge 中稳定,但 Safari 对 'hard-light'、'color-dodge' 等支持不全,需实测mix-blend-mode 却没反应?常见错误现象:
background-blend-mode 却能生效 → 说明不是浏览器问题,而是 stacking context 断了 排查步骤:
transform: translateZ(0) 或 filter: blur(1px) —— 这些都会隐式创建隔离上下文 isolation 是 auto 而非 isolate <img> 提到 <body> 直接子级试一下:如果这时混合生效,基本可断定是中间某层触发了 stacking context z-index 配合 position: relative 来“模拟重叠”——它不保证视觉重叠,也不保证同 context mix-blend-mode 和 background-blend-mode 别混用background-blend-mode 作用于单个元素的多个 background 图层(比如 background-image: url(a.jpg), url(b.png)),完全不依赖 stacking context,兼容性更好,但无法混合两个独立 <img> mix-blend-mode 是元素级混合,可以混合 <img>、<div>、<p> 等任意块级/替换元素,但对 DOM 结构和层叠规则极度敏感 真正容易被忽略的一点:mix-blend-mode 不是“图片特效开关”,它是渲染管线中 layer compositing 阶段的行为,一旦 context 断开,浏览器连尝试混合的逻辑都不会走——它不会报错,也不会警告,就是静默失效。 调试时别只盯着 CSS 是否写对,得用 Layers 面板(Chrome DevTools → Rendering → Paint flashing / Layer borders)确认是否真生成了可混合的 layer。
立即学习“前端免费学习笔记(深入)”;