前言

今天看到一个很有意思的 CSS3 属性:mix-blend-mode,其中 mix 和 blend 的中文意译均为混合,那么这个属性的作用直译过来就是混合模式,原谅我孤陋寡闻,工作这么久没有见过这个属性。

文字智能适配背景颜色

  1. 这个效果就是在黑色背景中显示白色文字,在白色背景中显示黑色文字,而且是自动的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    <style>
    .main {
    width: 600px;
    height: 200px;
    background: linear-gradient(45deg, #000 0, #000 50%, #fff 50%);
    position: relative;
    margin: 100px auto;
    }

    .main::before {
    content: '白雾茫茫丶';
    position: absolute;
    font-size: 50px;
    width: 100%;
    height: 100%;
    top: 40%;
    left: 20%;
    color: #fff;
    mix-blend-mode: difference;
    animation: move 3s infinite linear alternate;
    }

    @keyframes move {
    0% {
    transform: translateX(20%);
    }

    100% {
    transform: translateX(-20%);
    }
    }
    </style>
    <div class="main"></div>

    JtWSLi2lmToZacM.gif
    我们可以发现,代码非常简单,关键是这个属性:mix-blend-mode: difference

  2. 这是为什么呢?
    经过一番资料查阅,设置了这个属性后,它是这样计算的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    黑底白字:
    当前颜色: 255 255 255
    父元素: 0 0 0
    混合后的颜色:255 255 255

    白底黑字:
    当前颜色: 255 255 255
    父元素: 255 255 255
    混合后的颜色: 0 0 0

    由此可以得出结论:混合后的颜色 = 当前颜色 - 父元素背景色

实现文字镂空效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<style>
.parent {
background-image: url("../Desktop/images/4.jpg");
width: 600px;
height: 400px;
position: relative;
margin: 100px auto;
}

.parent .child {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-weight: 900;
font-size: 50px;
color: #000;
background-color: #fff;
mix-blend-mode: screen;
}
</style>
<div class="parent">
<div class="child">白雾茫茫丶</div>
</div>

image.png

mix-blend-mode 其他属性

属性值描述
normal默认值,没有混合效果
multiply正片叠底
screen滤色
overlay叠加
darken变暗
lighten变亮
color-dodge颜色减淡
color-burn颜色加深
hard-light强光
soft-light柔光
difference差值
exclusion排除
hue色相
color颜色
saturation饱和度
luminosity亮度

其它属性的效果,有兴趣的伙伴可以研究一下!