CSS mix-blend-mode 实现元素融合效果

一、什么是 mix-blend-mode?

mix-blend-mode 是 CSS Compositing and Blending Module 的核心属性之一,它定义了一个元素的内容如何与其背后的背景(包括父元素内容和下层元素)进行颜色混合。其工作原理类似于图像处理软件(如 Photoshop)中的图层混合模式,通过数学算法将当前元素的像素颜色与下方背景颜色的对应像素进行计算,生成新的视觉效果。


二、属性值详解

mix-blend-mode 支持多种混合模式,可分为以下几类:

类别 属性值 效果描述
基础模式 normal 默认值,不混合,元素颜色覆盖下方内容。
multiply 正片叠底:颜色相乘,结果更暗(白色不变,黑色变黑)。
screen 滤色:颜色反相后相乘再反相,结果更亮(黑色不变,白色变白)。
overlay 叠加:结合 multiply 和 screen,增强对比度。
明暗调节模式 darken 取较暗的颜色作为结果。
lighten 取较亮的颜色作为结果。
color-dodge 颜色减淡:降低对比度使背景变亮。
color-burn 颜色加深:提高对比度使背景变暗。
高级特效模式 difference 差值:黑白叠加会反转颜色。
exclusion 排除:类似差值但对比度更低,效果更柔和。
hard-light 强光:源色决定叠加方式(亮则屏幕,暗则正片叠底)。
soft-light 柔光:类似强光但效果更柔和。
HSL色彩模式 hue 保留源颜色的色相,背景的饱和度和亮度。
saturation 保留源颜色的饱和度,背景的色相和亮度。
color 保留源颜色的色相和饱和度,背景的亮度。
luminosity 保留源颜色的亮度,背景的色相和饱和度。

三、兼容性

现代浏览器均支持此属性,无需前缀,但旧版 IE 不支持

四、实战示例:根据不同背景颜色,显示不一样的文字颜色

如果文字颜色设置成白色,当遇到白色背景时就看不到文字了,这该怎办?莫慌,今天的主角mix-blend-mode: difference;就要闪亮登场了。

html 复制代码
<div class="container">
  <div class="overlay background1">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background2">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background3">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background4">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background5">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background6">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background7">
    <div className="difference">difference</div>
  </div>
  <div class="overlay background8">
    <div className="difference">difference</div>
  </div>
</div>
css 复制代码
.container{
  display: flex;
  flex-wrap: wrap;
  gap: 10px;
}
.overlay {
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
  width: 100px;
  height: 50px;
  color: #fff;
}
.difference {
  mix-blend-mode: difference;
}
.background1 {
  background: white;
}
.background2 {
  background: red;
}
.background3 {
  background: blue;
}
.background4 {
  background: #000;
}
.background5 {
  background: #5c0011;
}
.background6 {
  background: #5b8c00;
}
.background7 {
  background: #9e1068;
}
.background8 {
  background: #13c2c2;
}

效果如下图:

difference是差值计算,举个例子,默认字体白色,如果背景是黑色,差之后就是(255-0, 255-0, 255-0),最后的结果是255,255,255(白色),如果背景是白色,差之后就是(255-255, 255-255, 255-255),最后的结果是0,0,0(黑色)。

相关推荐
hkNaruto1 小时前
【AI】基于大模型的AI游戏地图生成、控制方案:AI Native Game Harness 迁移操作手册
前端·人工智能·游戏
IT_陈寒1 小时前
Java序列化踩坑记:对象循环引用让我加班两小时
前端·人工智能·后端
Acro2 小时前
快给macOS 上的Grok Bot换一套皮肤
前端
flash俊杰2 小时前
双引擎 OCR 编排:逐页判定、视觉优先、partial 语义与三层超时
前端
计算机魔术师2 小时前
Reddit 每周被 Google 偷走 100 万次点击,CEO 摊牌了
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一栋能编辑的教学楼数字孪生
前端
前端繁华如梦2 小时前
用 React Three Fiber 做一套智慧医院数字孪生:编辑器、大屏和 BIM 浏览器
前端
俊昭喜喜里3 小时前
理解全局跨域CORS配置
前端
锋行天下6 小时前
DeepSeek写Langgraph就是个大傻逼,一本正经胡说八道
前端·人工智能·后端
jktantan6 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript