01 混合模式
mix-blend-mode ,混合模式。最常见于 photoshop 中,是 PS 中十分强大的功能之一。在 CSS 中,我们可以利用混合模式将多个图层混合得到一个新的效果。
我们使用 repeating-linear-gradient
重复线性渐变,制作两个角度相反的背景条纹图。正常而言,不使用混合模式,将两个图案叠加在一起,看看会发生什么。
这些都是ps中一些图形叠加的一些方式;
可以看到,不同的混合模式的叠加,效果相差非常之大。当然,运用不同的混合模式,我们也就可以创造出效果各异的图案。
02 借助 CSS-Doodle 随机生成图案
到这,就不得不引出一个写 CSS 的神器 — CSS-Doodle,我在其他非常多文章中也多次提到过 CSS-doodle,简单而言,它是一个基于 Web-Component 的库。允许我们快速的创建基于 CSS Grid 布局的页面,并且提供各种便捷的指令及函数(随机、循环等等),让我们能通过一套规则,得到不同 CSS 效果。
还是以上面的 DEMO 作为示例,我们将 repeating-linear-gradient
生成的重复条纹背景的颜色、粗细、角度随机化、采用的混合模式也是随机选取,然后利用 CSS-Doodle,快速随机的创建各种基于此规则的图案:
03 在不同的渐变背景中运用混合模式
html, body {
position: relative;
width: 100%;
height: 100%;
display: flex;
padding-bottom: 100px;
}
div {
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
div:nth-child(1) {
background: linear-gradient(
238deg,
rgb(130, 255, 0) 0%,
rgb(0, 84, 166) 100%
);
animation: move 12s infinite linear;
}
div:nth-child(2) {
background: linear-gradient(238deg, rgb(33, 200, 69) 0%, rgb(0, 0, 100) 100%);
mix-blend-mode: overlay;
animation: move 6s infinite linear;
}
div:nth-child(3) {
background: linear-gradient(238deg, rgb(200, 255, 255) 48%, rgb(3, 0, 151) 100%);
mix-blend-mode: multiply;
animation: move 6s infinite linear;
}
div:nth-child(4) {
background: radial-gradient(
100% 85% at 0% 100%,
rgb(0, 0, 0) 0%,
rgb(0, 131, 255) 50%,
rgb(255, 0, 0) 100%
);
mix-blend-mode: difference;
animation: move 6s infinite linear;
}
div:nth-child(5) {
background: radial-gradient(
100% 225% at 0% 100%,
rgb(255, 0, 0) 0%,
rgb(66, 255, 0) 100%
);
mix-blend-mode: difference;
animation: move 6s infinite linear;
}
div:nth-child(6) {
background: radial-gradient(
100% 140% at 100% 0%,
rgb(0, 134, 62) 0%,
rgb(0, 239, 255) 50%,
rgb(0, 113, 186) 100%
);
mix-blend-mode: overlay;
animation: move 6s infinite linear;
}
@keyframes move {
0% {
filter: unset;
}
100% {
filter: hue-rotate(360deg);
}
}
04 借助 CSS-Doodle 随机生成图案
噔噔噔,没错,这里我们又可以继续把 CSS-Doodle 搬出来了。
随机的渐变,随机的混合模式,叠加在一起,燥起来吧。
使用 CSS-Doodle 随机创建不同的渐变,在随机使用不同的混合模式,让他们叠加在一起,看看效果:
<css-doodle>
:container {
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
background:
linear-gradient(
@rand(1, 360)deg,
rgb(@rand(1, 150), @rand(150, 255), 0) 0%,
rgb(0, @rand(1, 150), @rand(150, 255)) 100%
),
linear-gradient(
@rand(1, 360)deg,
rgb(0, @rand(150, 255), @rand(1, 150)) 0%,
rgb(0, 0, 0) 100%),
linear-gradient(
@rand(1, 360)deg,
rgb(@rand(0, 255), @rand(0, 255), @rand(0, 255)) @rand(0, 70)%,
rgb(@rand(0, 255), 0, 151) 100%),
radial-gradient(
@rand(50, 100)% @rand(50, 100)% at @rand(0, 100)% @rand(0, 100)%,
rgb(@rand(0, 150), @rand(0, 150), @rand(0, 150)) 0%,
rgb(0, @rand(100, 200), @rand(200, 255)) 50%,
rgb(@rand(150, 255), @rand(150, 255), 0) 100%
),
radial-gradient(
@rand(100, 250)% @rand(100, 225)% at 0% 100%,
rgb(@rand(0, 255), @rand(0, 255), 0) 0%,
rgb(@rand(0, 50), @rand(150, 255), @rand(0, 150)) 100%
),
radial-gradient(
@rand(100, 250)% @rand(100, 225)% at @rand(0, 150)% @rand(0, 225)%,
rgb(@rand(0, 50), @rand(50, 150), 62) 0%,
rgb(@rand(0, 50), @rand(50, 150), 255) @rand(0, 100)%,
rgb(@rand(0, 50), @rand(50, 150), 186) 100%
);
background-blend-mode:
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
@pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten);
<!-- background-blend-mode: lighten, color-dodge, multiply, difference, difference, normal; -->
}
</css-doodle>
05 使用 mask
我们就完成了 background 与 mask 的结合。运用 mask 切割 background 的效果,我们就能制作出非常多有意思的背景图案:
-- mask-composite
OR -webkit-mask-composite
接下来,在运用 mask 切割图片的同时,我们会再运用到 -webkit-mask-composite
属性。这个是非常有意思的元素,非常类似于 mix-blend-mode
/ background-blend-mode
。
-webkit-mask-composite: 属性指定了将应用于同一元素的多个蒙版图像相互合成的方式。
通俗点来说,他的作用就是,当一个元素存在多重 mask
时,我们就可以运用 -webkit-mask-composite
进行效果叠加。
注意,这里的一个前提,就是当 mask 是多重 mask 的时候(类似于 background,mask 也是可以存着多重 mask),-webkit-mask-composite
才会生效。这也就元素的 mask 可以指定多个,逗号分隔。
mask 表述成 background
的话大概是这样:
如果,不添加任何 -webkit-mask-composite
,叠加融合之后的效果是这样:
如果添加一个 -webkit-mask-composite: xor
,则会变成这样:
可以看到,线条的交汇叠加处,有了不一样的效果。
06 借助 CSS-Doodle 随机生成图案
了解了基本原理之后,上 CSS-Doodle,我们利用多重 mask 和 -webkit-mask-composite
,便可以创造出各式各样的美妙背景图案: