CSS mask 的妙用
<style>.mybox {
margin: 20px auto;
position: relative;
width: 300px;
height: 300px;
border-radius: 50%;
border: 10px solid green;
background: radial-gradient(orange,yellow);
-webkit-mask:
repeating-linear-gradient(to top right,black 10%,transparent 17%),
repeating-linear-gradient(to bottom right,black 10%,transparent 17%);
-webkit-mask-composite: xor;
}
</style>
<p>先看成品:</p>
<div class="mybox"></div>
本帖最后由 马黑黑 于 2024-1-13 11:16 编辑 <br /><br /><h2><span style="font-size: 14px; font-weight: normal;">先做一个径向渐变背景的盒子</span></h2><p><br></p>
<p></p><ol><li><style></li><li>.mybox1 {</li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>margin: 20px auto;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>position: relative;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>width: 300px;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>height: 300px;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>border-radius: 50%;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>border: 10px solid green;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>background: radial-gradient(orange,yellow);</span></li><li>}</li><li></style></li><li><br></li><li><div class="mybox1"></div></li></ol><p></p>
<p><br></p><p>效果如下:</p>
<style>
.mybox1 {
margin: 20px auto;
position: relative;
width: 300px;
height: 300px;
border-radius: 50%;
border: 10px solid green;
background: radial-gradient(orange,yellow);
}
</style>
<div class="mybox1"></div> 本帖最后由 马黑黑 于 2024-1-13 11:52 编辑 <br /><br /><p>二楼的效果已经很漂亮了,不过和一楼的效果比不了。这时我们可以祭出 mask 属性。祭出之前,我们先用<font color="#ff0000">重复性线性渐变</font>做一个盒子,用来观察效果——因为mask和background语法一致,我们就先看看要设置的mask属性的原本效果:</p><p><br></p><p></p><ol><li><style></li><li>.mybox2 {</li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>margin: 20px auto;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>position: relative;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>width: 300px;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>height: 300px;</span></li><li><span style="white-space: normal;"><span style="color: rgb(255, 0, 0); white-space: pre;"> </span><font color="#0000ff">background: </font></span></li><li><span style="white-space: normal;"><font color="#ff0000"><span style="white-space:pre"> </span>repeating-linear-gradient(to top right,black 10%,transparent 17%),</font></span></li><li><span style="white-space: normal;"><font color="#ff0000"><span style="white-space:pre"> </span>repeating-linear-gradient(to bottom right,black 10%,transparent 17%);</font></span></li><li>}</li><li></style></li><li><br></li><li><div class="mybox2"></div></li></ol><p></p>
<p><br></p>
<style>
.mybox2 {
margin: 20px auto;
position: relative;
width: 300px;
height: 300px;
background:
repeating-linear-gradient(to top right,black 10%,transparent 17%),
repeating-linear-gradient(to bottom right,black 10%,transparent 17%);
}
</style>
<div class="mybox2"></div>
<p>这效果看上去没啥美感,不过没关系,它只是用来观察、不是最终呈现的样纸,它的重复性线性背景语句我们将剥离出来,用到一楼的盒子里做 mask 属性用。下面是在二楼代码基础上加了mask属性后的代码:</p><p><br></p><p><ol><li><style></li><li>.mybox1 {</li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>margin: 20px auto;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>position: relative;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>width: 300px;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>height: 300px;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>border-radius: 50%;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>border: 10px solid green;</span></li><li><span style="white-space: normal;"><span style="white-space:pre"> </span>background: radial-gradient(orange,yellow);</span></li><li><span style="color: rgb(255, 0, 0); white-space: pre;"> </span><font color="#0000ff">-webkit-mask: </font></li><li><font color="#ff0000"><span style="white-space: pre;"> </span><span style="white-space: pre;"> </span>repeating-linear-gradient(to top right,black 10%,transparent 17%),</font></li><li><font color="#ff0000"><span style="white-space: pre;"> </span><span style="white-space: normal;"><span style="white-space:pre"> </span>repeating-linear-gradient(to bottom right,black 10%,transparent 17%);</span></font></li><li>}</li><li></style></li><li><br></li><li><div class="mybox1"></div></li></ol><div><br></div><div>运行上面的代码,差不多就是一楼的效果了。</div></p><p></p> 本帖最后由 马黑黑 于 2024-1-13 11:51 编辑
最后还差一步:使用 mask-composite 属性,这个可以称为遮罩复合。遮罩复合针对同时设置多个遮罩值的情形,缺省值为累加 add,还有更多的值,有兴趣的朋友可以自行网补,一楼使用的是 xor(位运算、异域运算),之前在svg滤镜中也曾在某个属性值用过。
下面就是在三楼最后代码段的基础上加入 mask-composite 属性后的代码,也就是一楼所使用的代码:
[*]<style>
[*].mybox1 {
[*] margin: 20px auto;
[*] position: relative;
[*] width: 300px;
[*] height: 300px;
[*] border-radius: 50%;
[*] border: 10px solid green;
[*] background: radial-gradient(orange,yellow);
[*] -webkit-mask:
[*] repeating-linear-gradient(to top right,black 10%,transparent 17%),
[*] repeating-linear-gradient(to bottom right,black 10%,transparent 17%);
[*] -webkit-mask-composite: xor;
[*]}
[*]</style>
[*]
[*]<div class="mybox1"></div>
又是个神奇的效果,等着看是怎么弄出来的{:4_173:} 红影 发表于 2024-1-13 11:23
又是个神奇的效果,等着看是怎么弄出来的
讲完了。这是mask用法举例,用重复线性渐变(位图)去遮罩径向渐变背景。 好! 真是玩出花来了{:5_106:} 马黑黑 发表于 2024-1-13 11:46
讲完了。这是mask用法举例,用重复线性渐变(位图)去遮罩径向渐变背景。
我去试了一下,如果不加 mask-composite ,感觉更有立体感呢{:4_173:} 哇,好大好成熟的瓜,小冬雨@冬天的雨 快来一起分享。{:4_170:} 樵歌 发表于 2024-1-13 15:17
哇,好大好成熟的瓜,小冬雨@冬天的雨 快来一起分享。
大又甜 红影 发表于 2024-1-13 13:37
我去试了一下,如果不加 mask-composite ,感觉更有立体感呢
不加也用了 mask-composite,缺省值是各层遮罩累加 add 马黑黑 发表于 2024-1-13 17:53
大又甜
还变色,真好{:4_189:} 马黑黑 发表于 2024-1-13 17:55
不加也用了 mask-composite,缺省值是各层遮罩累加 add
这里面扩展下去还有很多东西呢{:4_187:} 红影 发表于 2024-1-13 20:29
这里面扩展下去还有很多东西呢
点到为止就好 马黑黑 发表于 2024-1-13 21:57
点到为止就好
这个很好玩啊,用它应该能玩出很多想不到的效果呢。{:4_173:} 红影 发表于 2024-1-14 10:55
这个很好玩啊,用它应该能玩出很多想不到的效果呢。
可能吧 马黑黑 发表于 2024-1-14 11:31
可能吧
空了我得再学一个,好好感受一下它{:4_173:} 红影 发表于 2024-1-14 17:31
空了我得再学一个,好好感受一下它
{:4_181:} 马黑黑 发表于 2024-1-14 18:16
最近事情多了点,都来不及跟上黑黑的教学好好玩一下呢{:4_187:} 红影 发表于 2024-1-14 19:56
最近事情多了点,都来不及跟上黑黑的教学好好玩一下呢
没关系慢慢来