01 混合模式

mix-blend-mode ,混合模式。最常见于 photoshop 中,是 PS 中十分强大的功能之一。在 CSS 中,我们可以利用混合模式将多个图层混合得到一个新的效果。

我们使用 repeating-linear-gradient 重复线性渐变,制作两个角度相反的背景条纹图。正常而言,不使用混合模式,将两个图案叠加在一起,看看会发生什么。
image.png
这些都是ps中一些图形叠加的一些方式;
image.png
可以看到,不同的混合模式的叠加,效果相差非常之大。当然,运用不同的混合模式,我们也就可以创造出效果各异的图案。

02 借助 CSS-Doodle 随机生成图案

到这,就不得不引出一个写 CSS 的神器 — CSS-Doodle,我在其他非常多文章中也多次提到过 CSS-doodle,简单而言,它是一个基于 Web-Component 的库。允许我们快速的创建基于 CSS Grid 布局的页面,并且提供各种便捷的指令及函数(随机、循环等等),让我们能通过一套规则,得到不同 CSS 效果。
image.png
还是以上面的 DEMO 作为示例,我们将 repeating-linear-gradient 生成的重复条纹背景的颜色、粗细、角度随机化、采用的混合模式也是随机选取,然后利用 CSS-Doodle,快速随机的创建各种基于此规则的图案:

03 在不同的渐变背景中运用混合模式

  1. html, body {
  2. position: relative;
  3. width: 100%;
  4. height: 100%;
  5. display: flex;
  6. padding-bottom: 100px;
  7. }
  8. div {
  9. position: absolute;
  10. top: 0;
  11. left: 0;
  12. bottom: 0;
  13. right: 0;
  14. }
  15. div:nth-child(1) {
  16. background: linear-gradient(
  17. 238deg,
  18. rgb(130, 255, 0) 0%,
  19. rgb(0, 84, 166) 100%
  20. );
  21. animation: move 12s infinite linear;
  22. }
  23. div:nth-child(2) {
  24. background: linear-gradient(238deg, rgb(33, 200, 69) 0%, rgb(0, 0, 100) 100%);
  25. mix-blend-mode: overlay;
  26. animation: move 6s infinite linear;
  27. }
  28. div:nth-child(3) {
  29. background: linear-gradient(238deg, rgb(200, 255, 255) 48%, rgb(3, 0, 151) 100%);
  30. mix-blend-mode: multiply;
  31. animation: move 6s infinite linear;
  32. }
  33. div:nth-child(4) {
  34. background: radial-gradient(
  35. 100% 85% at 0% 100%,
  36. rgb(0, 0, 0) 0%,
  37. rgb(0, 131, 255) 50%,
  38. rgb(255, 0, 0) 100%
  39. );
  40. mix-blend-mode: difference;
  41. animation: move 6s infinite linear;
  42. }
  43. div:nth-child(5) {
  44. background: radial-gradient(
  45. 100% 225% at 0% 100%,
  46. rgb(255, 0, 0) 0%,
  47. rgb(66, 255, 0) 100%
  48. );
  49. mix-blend-mode: difference;
  50. animation: move 6s infinite linear;
  51. }
  52. div:nth-child(6) {
  53. background: radial-gradient(
  54. 100% 140% at 100% 0%,
  55. rgb(0, 134, 62) 0%,
  56. rgb(0, 239, 255) 50%,
  57. rgb(0, 113, 186) 100%
  58. );
  59. mix-blend-mode: overlay;
  60. animation: move 6s infinite linear;
  61. }
  62. @keyframes move {
  63. 0% {
  64. filter: unset;
  65. }
  66. 100% {
  67. filter: hue-rotate(360deg);
  68. }
  69. }

image.png

04 借助 CSS-Doodle 随机生成图案

噔噔噔,没错,这里我们又可以继续把 CSS-Doodle 搬出来了。
随机的渐变,随机的混合模式,叠加在一起,燥起来吧。
使用 CSS-Doodle 随机创建不同的渐变,在随机使用不同的混合模式,让他们叠加在一起,看看效果:

  1. <css-doodle>
  2. :container {
  3. position: absolute;
  4. top: 0;
  5. left: 0;
  6. width: 100vw;
  7. height: 100vh;
  8. background:
  9. linear-gradient(
  10. @rand(1, 360)deg,
  11. rgb(@rand(1, 150), @rand(150, 255), 0) 0%,
  12. rgb(0, @rand(1, 150), @rand(150, 255)) 100%
  13. ),
  14. linear-gradient(
  15. @rand(1, 360)deg,
  16. rgb(0, @rand(150, 255), @rand(1, 150)) 0%,
  17. rgb(0, 0, 0) 100%),
  18. linear-gradient(
  19. @rand(1, 360)deg,
  20. rgb(@rand(0, 255), @rand(0, 255), @rand(0, 255)) @rand(0, 70)%,
  21. rgb(@rand(0, 255), 0, 151) 100%),
  22. radial-gradient(
  23. @rand(50, 100)% @rand(50, 100)% at @rand(0, 100)% @rand(0, 100)%,
  24. rgb(@rand(0, 150), @rand(0, 150), @rand(0, 150)) 0%,
  25. rgb(0, @rand(100, 200), @rand(200, 255)) 50%,
  26. rgb(@rand(150, 255), @rand(150, 255), 0) 100%
  27. ),
  28. radial-gradient(
  29. @rand(100, 250)% @rand(100, 225)% at 0% 100%,
  30. rgb(@rand(0, 255), @rand(0, 255), 0) 0%,
  31. rgb(@rand(0, 50), @rand(150, 255), @rand(0, 150)) 100%
  32. ),
  33. radial-gradient(
  34. @rand(100, 250)% @rand(100, 225)% at @rand(0, 150)% @rand(0, 225)%,
  35. rgb(@rand(0, 50), @rand(50, 150), 62) 0%,
  36. rgb(@rand(0, 50), @rand(50, 150), 255) @rand(0, 100)%,
  37. rgb(@rand(0, 50), @rand(50, 150), 186) 100%
  38. );
  39. background-blend-mode:
  40. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
  41. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
  42. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
  43. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
  44. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten),
  45. @pick(color-dodge, overlay, difference, difference, normal, exclusion, lighten);
  46. <!-- background-blend-mode: lighten, color-dodge, multiply, difference, difference, normal; -->
  47. }
  48. </css-doodle>

05 使用 mask

我们就完成了 background 与 mask 的结合。运用 mask 切割 background 的效果,我们就能制作出非常多有意思的背景图案:

image.png

-- 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 的话大概是这样:
Mix-blend-mode - 图6
如果,不添加任何 -webkit-mask-composite,叠加融合之后的效果是这样:
Mix-blend-mode - 图7
如果添加一个 -webkit-mask-composite: xor,则会变成这样:
Mix-blend-mode - 图8
可以看到,线条的交汇叠加处,有了不一样的效果。

06 借助 CSS-Doodle 随机生成图案

了解了基本原理之后,上 CSS-Doodle,我们利用多重 mask 和 -webkit-mask-composite,便可以创造出各式各样的美妙背景图案:
image.png