直接给两张加mix-blend-mode通常无效,因为二者默认处于同一层叠上下文且无“上下”关系;需用position: absolute构造视觉重叠,并确保容器有非白背景、未触发isolation或transform等隔离属性。

直接给两张 <img> 加 mix-blend-mode 通常没效果——因为浏览器默认把它们放在同一层叠上下文里,没有“上下层”关系可混。得手动构造重叠结构,且必须确保底层内容真实存在、可见、非纯白。
为什么两张图片叠一起却看不到混合效果?
常见错误是把两个 <img> 并列写在 HTML 里,然后只给其中一个加 mix-blend-mode: screen。问题在于:mix-blend-mode 不作用于兄弟元素之间,而是作用于“当前元素”与其**z 轴下方的内容**(比如父容器背景、伪元素、或 position: absolute 的底层元素)。
- 两张
<img>默认都在同一 stacking context,彼此不构成“上下”关系 - 父容器没设背景色/图 → 下方是纯白或透明,
screen混合后几乎看不出变化 - 用了
transform、opacity: 0.99或isolation: isolate→ 隔离了层叠上下文,混合被切断
怎么构造可靠可用的双重曝光结构?
核心是让一张图当“底”,另一张当“叠层”,且叠层必须参与混合。推荐用 position: absolute + 容器 position: relative 控制层级。
- 外层容器设
position: relative,并提供非白色背景(哪怕只是background: #eee) - 第一张图(底图)用
position: absolute; top: 0; left: 0; width: 100%; height: 100% - 第二张图(叠层)同样
position: absolute,但加mix-blend-mode: screen或multiply - 避免对容器设
isolation: isolate,除非你明确需要隔离其他子元素
示例结构:
.dual-exposure {
position: relative;
width: 400px;
height: 300px;
background: #f5f5f5; /* 关键:非白底 */
}
.dual-exposure img:first-child {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.dual-exposure img:last-child {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
mix-blend-mode: screen;
}
选哪个混合模式更接近传统双重曝光?
传统双重曝光强调“透光感”和“轮廓叠加”,screen 最贴近;若想保留更多暗部细节,可尝试 overlay 或 lighten。别用 normal 或 multiply ——前者无混合,后者会让整体变灰黑。
-
screen:亮部透出,暗部淡化,适合人像+风景类组合 -
overlay:自动区分明暗区,增强对比,但中间调易过曝 -
lighten:逐像素取两图中更亮值,保留高光结构,适合线稿+纹理 - 所有模式都依赖叠层图的透明度 —— 如果叠层是 JPG,建议用 PNG 带 Alpha 通道,或加
opacity: 0.8微调
iOS Safari 和旧版 Chrome 的兼容性陷阱
iOS Safari 14–15 在动画中切换 mix-blend-mode 值会直接失效;部分 Android WebView 对 screen 渲染偏灰。真机调试时容易忽略这点。
- 降级方案:固定用
screen,改用background-color或opacity动画代替模式切换 - 测试必做:打开 Chrome DevTools → Rendering → 勾选 “Paint flashing”,确认两图确实在同一区域重绘
- 不要依赖
background-blend-mode—— 它只管单个元素的多个背景层,不适用于两张独立<img>
最易被忽略的是容器背景色和层叠上下文隔离——这两点一错,整个效果就静默失败,连报错都没有。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











