CSS中的【mix-blend-mode属性】描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合;
序号 | 属性值 | 混合模式及说明 |
---|---|---|
1 | mix-blend-mode: normal; | 正常:此属性不应用任何混合; |
2 | mix-blend-mode: multiply; |
相乘:元素乘以背景并替换背景颜色,生成的颜色始终与背景一样暗; |
3 | mix-blend-mode: overlay; |
叠加:根据背景颜色对内容进行倍增或屏蔽,这与硬光混合模式相反; |
4 | mix-blend-mode: screen; |
屏幕:将背景和内容相乘,然后补充结果。这将导致内容比背景颜色更亮; |
5 | mix-blend-mode: darken; | 变暗;当内容变暗时,背景将被替换为内容,否则将保持原样; |
6 | mix-blend-mode: lighten; |
变亮:背景被替换为内容较亮的内容; |
7 | mix-blend-mode: color-dodge; | 颜色变淡:此属性使背景颜色变亮,以反映内容的颜色; |
8 | mix-blend-mode: color-burn; | 颜色变淡:这会使背景变暗,以反映内容的自然颜色; |
9 | mix-blend-mode: hard-light; | 硬光:根据内容的颜色,此属性将对其进行筛选或倍增; |
10 | mix-blend-mode: soft-light; | 柔光:根据内容的颜色,这会使其变暗或变亮; |
11 | mix-blend-mode: difference; | 差值:这将从最亮的颜色中减去两种颜色中较深的一种; |
12 | mix-blend-mode: exclusion; | 排除:与差值相似,但对比度较低; |
13 | mix-blend-mode: hue; | 色调:通过内容的色调与背景的饱和度和亮度相结合来创建颜色; |
14 | mix-blend-mode: saturation; | 饱和度:通过内容的饱和度和背景的色调和亮度来创建颜色; |
15 | mix-blend-mode: color; |
颜色混合:根据内容的色调和饱和度以及背景的亮度创建颜色; |
16 | mix-blend-mode: luminosity; | 光度:根据内容的光度和背景的色调和饱和度创建颜色。这与颜色属性相反; |
效果展示点击
mix-blend-mode属性的应用
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>mix-blend-mode属性的应用</title> <style> * { margin: 0; padding: 0; } .container { /* 定义变量 */ --mix-blend-mode: normal; position: relative; width: 300px; height: 400px; margin: 60px; padding: 20px; box-shadow: 0 0 6px 1px #999; border-radius: 6px; caret-color: transparent; } h3, h4 { margin-bottom: 10px; } .info-box { width: 100%; height: 24px; line-height: 24px; } .circle { position: absolute; width: 200px; height: 200px; border-radius: 50%; mix-blend-mode: var(--mix-blend-mode); } .red-box { left: 70px; top: 160px; background-color: red; } .green-box { left: 30px; top: 220px; background-color: lightgreen; } .blue-box { left: 110px; top: 220px; background-color: blue; } </style> </head> <body> <div class="container"> <h3>mix-blend-mode属性的应用</h3> <h4 class="value-box"></h4> <div class="info-box"></div> <div class="circle red-box"></div> <div class="circle green-box"></div> <div class="circle blue-box"></div> </div> </body> <script> // 获取元素 var container = document.querySelector(".container"); var valueBox = document.querySelector(".value-box"); var infoBox = document.querySelector(".info-box"); // mix-blend-mode属性的取值列表及说明; var values = [ { id: 1, name: "正常", value: "normal", info: "此属性不应用任何混合;" }, { id: 2, name: "相乘", value: "multiply", info: "元素乘以背景并替换背景颜色,生成的颜色始终与背景一样暗;" }, { id: 3, name: "叠加", value: "overlay", info: "根据背景颜色对内容进行倍增或屏蔽;这与硬光混合模式相反;" }, { id: 4, name: "屏幕", value: "screen", info: "将背景和内容相乘,然后补充结果。这将导致内容比背景颜色更亮;" }, { id: 5, name: "变暗", value: "darken", info: "当内容变暗时,背景将被替换为内容,否则将保持原样;" }, { id: 6, name: "变亮", value: "lighten", info: "背景被替换为内容较亮的内容;" }, { id: 7, name: "颜色变淡", value: "color-dodge", info: "此属性使背景颜色变亮,以反映内容的颜色;" }, { id: 8, name: "颜色变淡", value: "color-burn", info: "这会使背景变暗,以反映内容的自然颜色;" }, { id: 9, name: "硬光", value: "hard-light", info: "根据内容的颜色,此属性将对其进行筛选或倍增。" }, { id: 10, name: "柔光", value: " soft-light", info: "根据内容的颜色,这会使其变暗或变亮;" }, { id: 11, name: "差值", value: "difference", info: "这将从最亮的颜色中减去两种颜色中较深的一种;" }, { id: 12, name: "排除", value: "exclusion", info: "与差值相似,但对比度较低;" }, { id: 13, name: "色调", value: "hue", info: "通过内容的色调与背景的饱和度和亮度相结合来创建颜色;" }, { id: 14, name: "饱和度", value: "saturation", info: "通过内容的饱和度和背景的色调和亮度来创建颜色;" }, { id: 15, name: "颜色混合", value: "color", info: "根据内容的色调和饱和度以及背景的亮度创建颜色;" }, { id: 16, name: "亮度", value: "luminosity", info: "根据内容的光度和背景的色调和饱和度创建颜色。这与颜色属性相反;" } ] changeMode(); // 改变mix-blend-mode function changeMode() { let index = 0; modAttr(index); let timerId = setInterval(() => { if (index >= values.length) { clearInterval(timerId); return; } index++; modAttr(index) }, 3000) } function modAttr(index) { // 设置mix-blend-mode的属性值 container.style.setProperty('--mix-blend-mode', values[index].value); valueBox.innerHTML = `mix-blend-mode : ${values[index].value};`; infoBox.innerHTML = `${values[index].name}(${values[index].value}): ${values[index].info}` } </script> </html> |
很多时候,文字需要压着图片显示,如果文字和图片的颜色接近,可读性就会受到严重影响;
如何能让文字自动适配背景?
就可以利用mix-blend-mode属性,设置文字与背景的颜色混合,实现文字适配背景效果;
文字颜色为白色;在一些图片上的可读性很差;
1 2 3 4 |
.grid-item > h3 { color: rgb(255, 255, 255); ...... } |
设置mix-blend-mode属性为difference;
文字颜色的初始值是白色,但会与父元素背景对应的每像素颜色值进行差值计算,得到一个新的颜色值;
文字颜色值 - 背景颜色值 = 混合后的像素值;(每一像素)
例如:文字颜色(255, 255, 255),背景颜色(255, 255, 255),计算后的值(0, 0, 0),显示为黑色;
1 2 3 4 5 6 |
.grid-item>h3 { color: rgb(255, 255, 255); /* 设置混合模式 -- 计算差值 */ mix-blend-mode: difference; ...... } |
注意:这里的差值混合模式是应用在文字上的;
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 |
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>文字智能适配背景</title> <style> * { margin: 0; padding: 0; } .container { display: flex; width: 100vw; height: 60vh; justify-content: center; align-items: center; } .grid-container { display: grid; grid-template-columns: 400px 400px 400px; grid-template-rows: 200px 200px; gap: 10px; } .grid-item { background-repeat: no-repeat; background-size: cover; border-radius: 6px; box-shadow: 0 0 6px 1px #999; } .grid-item>h3 { color: rgb(255, 255, 255); font-size: 36px; /* 设置混合模式 -- 计算差值 */ mix-blend-mode: difference; } .grid-item:nth-child(1) { /* background-image: url("D:\\test\\zyl-img\\bg_1.jpg"); */ background-color: red } .grid-item:nth-child(2) { /* background-image: url("D:\\test\\zyl-img\\bg_2.jpg"); */ background-color: purple; } .grid-item:nth-child(3) { /* background-image: url("D:\\test\\zyl-img\\bg_3.jpg"); */ background-color: yellow; } .grid-item:nth-child(4) { /* background-image: url("D:\\test\\zyl-img\\bg_4.jpg"); */ background-color: green; } .grid-item:nth-child(5) { /* background-image: url("D:\\test\\zyl-img\\bg_5.jpg"); */ background-color: teal; } .grid-item:nth-child(6) { /* background-image: url("D:\\test\\zyl-img\\bg_6.jpg"); */ background-color: blue; } </style> </head> <body> <div class="container"> <div class="grid-container"> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> <div class="grid-item"> <h3>mix-blend-mode属性的应用</h3> </div> </div> </div> </body> </html> |