当前位置: 首页 > Web前端 > HTML5

进阶切割技巧!基于单张图片的任意颜色变换

时间:2023-04-05 23:50:51 HTML5

今天介绍一个基于CSSmask-composite的进阶技巧。掌握了它,我们可以通过一张图片获得关于它的各种变换,甚至可以得到不同颜色的各种变换。通过单个PNG/SVG获取其反切图像。事情的过程是这样的。有一天,我们得到了这样一张PNG/SVG图片:就这张图片而言,它是一张PNG图片,灰色部分透明。随着需求的推进,到了一定的时候,我们需要在上图的基础上做一个反向镂空的图形:emmm,需要注意的是这里的白色部分需要透明,这样可以显露出不同的底色,像这样:怎么办,一般来说只能找UI,做个镂空图。当然,今天我们只需要一个PNG/SVG,我们可以使用CSS轻松完成上述转换。这里我们需要使用mask-composite。什么是掩膜复合材料?那么,什么是mask-composite?当然,这个阶段需要加上浏览器前缀,-webkit-mask-composite。首先,要学习使用mask-composite,你必须先知道CSS中另一个非常重要和有用的属性——mask。如果你对mask还比较陌生,建议你先看看这篇文章——精彩的CSSMASK使用mask对图片进行遮罩和裁剪,我们也可以同时使用mask-composite属性。这是一个非常有趣的元素。-webkit-mask-composite:属性指定应用于同一元素的多个蒙版图像将如何相互合成。通俗地说,它的作用就是当一个元素有多个遮罩时,我们可以使用-webkit-mask-composite来叠加效果。举个栗子:

.original{background:#000;mask:radial-gradient(circleat00,#000,#000200px,transparent200px);}我们用一个Radial-gradient作为mask来切割原来的矩形得到一个新的图形。如果再次改变方向:
.original{background:#000;mask:radial-gradient(circleat100%0,#000,#000200px,transparent200px);}如果我想得到这样的效果:我应该怎么做?我们尝试结合以上两种蒙版的效果:.mask{background:#000;mask:radial-gradient(circleat100%0,#000,#000200px,transparent200px),radial-gradient(circleat00,#000,#000200px,transparent200px);}效果如下:和我们想象的不太一样,因为两个蒙版的图形叠加就是上面图形的效果,所以上面的效果是没有问题的。只不过我们要得到的是两个mask图形重叠的部分:这时候我们可以使用mask-composite:.mask{background:#000;蒙版:径向渐变(圆圈在100%0,#000,#000200px,透明200px),径向渐变(圆圈在00,#000,#000200px,透明200px);-webkit-mask-composite:source-in;}添加了-webkit-mask-composite:source-in之后,我们就可以得到两个遮罩图形的重叠部分,然后将重叠部分应用于整个遮罩遮罩:CodePenDemo--mask-compositeDemo-webkit-mask-composite也可以实现很多不同的功能,包括但不限于:-webkit-mask-composite:clear;/*清除,不显示任何遮罩*/-webkit-mask-composite:copy;/*只显示上掩码,不显示下掩码*/-webkit-mask-composite:source-over;-webkit-mask-composite:来源;/*只显示重叠的地方*/-webkit-mask-composite:source-out;/*只显示上面的mask,重叠的地方不显示*/-webkit-mask-composite:source-atop;-webkit-mask-composite:destination-over;-webkit-mask-composite:destination-in;/*只显示重叠的地方*/-webkit-mask-composite:destination-out;/*只显示下面的mask,重叠的地方不显示*/-webkit-mask-composite:destination-atop;-webkit-mask-复合:异或;/*只显示不重叠的地方*/看这张图,一目了然(图图片来源于cssmask实现鼠标跟随镂空效果)使用-webkit-mask-composite实现图片的展开基于以上知识,回到我们的主题,我们有了透明图片(PNG/SVG)后),我们可以很方便的使用-webkit-mask-composite得到它的反向镂空图片:.mask{background:#000;遮罩:url($img)、线性渐变(#fff、#000);mask-composite:exclude;}不仅如此,我们还可以利用这个技巧,将图片本身作为遮罩,配合-webkit-mask-composite,将纯色图片展开成各种颜色,甚至渐变色!
.original{背景:url($img);背景大小:封面;}.mask{背景:#000;遮罩:url($img)、线性渐变(#fff、#000);mask-composite:exclude;}.mask-color{背景:绿色;遮罩:url($img)、线性渐变(#fff、#000);mask-composite:source-in;}.mask-gradient{background:linear-gradient(blue,yellowgreen);掩码:url($img),线性渐变(#fff,#000);mask-composite:source-in;}CodePenDemo--mask-composite的威力这样我们只需要使用一张原始的PNG/SVG图片就可以得到反向镂空图片等纯色渐变图片可以有效的节省图片资源,起到一定的优化效果!之前我也写过一个基于白底黑图的任意颜色转换,但是有很大的局限性:两行css代码就可以实现图片的任意颜色着色技术,但是今天这个技术很纯粹,做不影响原图。不需要任意颜色转换!当然,唯一的缺点是目前受限于mask-composite和-webkit-mask-composite的兼容性,两者在语法上存在一定差异。实际使用中需要注意根据业务场景灵活选择。最后一个很有意思的技能,你学会了吗?本篇到此结束,希望对大家有所帮助:)有什么问题或者建议可以多交流,原创文章,写的有限,缺乏天赋和学习,如有不妥之处文章,请告诉我。