百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

CSS 奇思妙想 background-clip(奇思妙想作品更新)

myzbx 2025-01-23 19:54 21 浏览

作者:SbCoco来源:iCSS前端趣闻

说起 background-clip ,可能很多人都很陌生。Clip 的意思为修剪,那么从字面意思上理解,background-clip 的意思即是背景裁剪。

我曾经在 从条纹边框的实现谈盒子模型[1] 一文中谈到了这个属性,感兴趣的可以回头看看。

简单而言,background-clip 的作用就是设置元素的背景(背景图片或颜色)的填充规则。

与 box-sizing 的取值非常类似,通常而言,它有 3 个取值:

{?????background-clip:?border-box;??//?背景延伸到边框外沿(但是在边框之下)?????background-clip:?padding-box;?//?边框下面没有背景,即背景延伸到内边距外沿。?????background-clip:?content-box;?//?背景裁剪到内容区?(content-box)?外沿。?}?

不过这些都不是本文的主角。本文的主角是 background-clip: text; ,当然现在只有 chrome 支持,所以通常想使用它,需要
-webkit-background-clip:text;。

何为 -webkit-background-clip:text

使用了这个属性的意思是,以区块内的文字作为裁剪区域向外裁剪,文字的背景即为区块的背景,文字之外的区域都将被裁剪掉。

看个最简单的 Demo ,没有使用
-webkit-background-clip:text :

Clip
???

效果如下:



CodePen Demo - Clip[2]

使用 -webkit-background-clip:text

我们稍微改造下上面的代码,添加
-webkit-background-clip:text:

div?{???font-size:?180px;???font-weight:?bold;???color:?deeppink;???background:?url($img)?no-repeat?center?center;???background-size:?cover;???-webkit-background-clip:?text;?}?

效果如下:



CodePen Demo - clip[3]

看到这里,可能有人就纳闷了,



,啥玩意呢,这不就是文字设置 color 属性嘛。

将文字设为透明 color: transparent

别急!当然还有更有意思的,上面由于文字设置了颜色,挡住了 div 块的背景,如果将文字设置为透明呢?文字是可以设置为透明的 color: transparent 。

div?{???color:?transparent;???-webkit-background-clip:?text;?}?

效果如下:



CodePen Demo - clip[4]

通过将文字设置为透明,原本 div 的背景就显现出来了,而文字以为的区域全部被裁剪了,这就是
-webkit-background-clip:text 的作用。

嗨起来

了解了最基本的用法,接下来可以想想如何去运用这个元素制作一些效果。

大大增强了文字的颜色填充选择

文字颜色的动画效果

配合其他元素,实现一些其他巧妙的用法

实现文字渐变效果

利用这个属性,我们可以十分便捷的实现文字的渐变色效果。

?background-clip:?text
?
div?{?????font-size:?54px;?????color:?transparent;?????background:?linear-gradient(45deg,?#ffeb3b,?#009688,?yellowgreen,?pink,?#03a9f4,?#9c27b0,?#8bc34a);?????background-clip:?text;?????animation:?huerotate?3s?infinite;?}??@keyframes?huerotate?{?????100%?{?????????filter:?hue-rotate(360deg);?????}?}?



CodePen Demo -- background-clip: text 文字渐变色[5];

背景渐变动画 && 文字裁剪

因为有用到 background 属性,回忆一下,我在上一篇 巧妙地制作背景色渐变动画![6] 利用了渐变 + animation 巧妙的实现了一些背景的渐变动画。可以很好的和本文的知识结合起来。

结合渐变动画,当然不一定需要过渡动画,这里我使用的是逐帧动画。配合
-webkit-background-clip:text,实现了一种,嗯,很红灯区的感觉:

保健沐足按摩
?
.text?{?????font-size:?80px;?????background:?linear-gradient(90deg,?red?0,?orange?15%,?yellow?30%,?green?45%,?teal?60%,?blue?75%,?purple?90%?,purple?100%);?????background-clip:?text;?????color:?transparent;?????animation:?changeColor?.5s?linear?infinite?alternate;?}??@keyframes?changeColor?{?????0%?{?????????background-image:?linear-gradient(90deg,?red?0,?orange?15%,?yellow?30%,?green?45%,?teal?60%,?blue?75%,?purple?90%?,purple?100%);?????}?????50%?{?????????background-image:?linear-gradient(90deg,?deeppink?0,?yellowgreen?15%,?fuchsia?30%,?lime?45%,?olive?60%,?aqua?75%,?coral?90%?,brown?100%);?????}?????100%?{?????????background-image:?linear-gradient(-90deg,?red?0,?orange?15%,?yellow?30%,?green?45%,?teal?60%,?blue?75%,?purple?90%?,purple?100%);?????}?}?



CodePen Demo -- 背景渐变动画 && 文字裁剪[7]

给文字增加高光动画

利用 background-clip, 我们还可以轻松的给文字增加高光动画。

譬如这样:



其本质也是利用了 background-clip,伪代码如下:

?Lorem?ipsum?dolor?

?
p?{?????position:?relative;?????color:?transparent;?????background-color:?#E8A95B;?????background-clip:?text;?}?p::after?{?????content:?attr(data-text);?????position:?absolute;?????left:?0;?????top:?0;?????width:?100%;?????height:?100%;?????background-image:?linear-gradient(120deg,?transparent?0%,?transparent?6rem,?white?11rem,?transparent?11.15rem,?transparent?15rem,?rgba(255,?255,?255,?0.3)?20rem,?transparent?25rem,?transparent?27rem,?rgba(255,?255,?255,?0.6)?32rem,?white?33rem,?rgba(255,?255,?255,?0.3)?33.15rem,?transparent?38rem,?transparent?40rem,?rgba(255,?255,?255,?0.3)?45rem,?transparent?50rem,?transparent?100%);?????background-clip:?text;?????background-size:?150%?100%;?????background-repeat:?no-repeat;?????animation:?shine?5s?infinite?linear;?}?@keyframes?shine?{??0%?{???background-position:?50%?0;??}??100%?{???background-position:?-190%?0;??}?}?

去掉伪元素的 background-clip: text,就能看懂原理:



CodePen Demo -- shine Text && background-clip[8]

按钮填充效果

运用这个属性,我们可以给按钮实现这样一种遮罩填充动画(主要是用于防止文字闪烁):

Btn
?
.btn?{?????position:?relative;?????color:?deeppink;?????background-color:?transparent;?????border:?3px?solid?deeppink;??????????&::after?{?????????content:?'';?????????position:?absolute;?????????z-index:?-1;?????????top:?0;?????????left:?50%;?????????height:?100%;?????????width:?0;?????????background-color:?deeppink;?????????transition:?width?.5s,?left?.5s;?????}?????&:hover?{?????????color:?white;?????}?????&:hover::after?{?????????top:?0;?????????left:?0;?????????width:?100%;?????????transition:?width?.5s,?left?.5s;?????}?}??.btn?{?????background-color:?deeppink;?????background-image:?linear-gradient(white,?white);?????background-repeat:?no-repeat;?????background-size:?0%?100%;?????background-position:?center;?????-webkit-background-clip:?text;?????-webkit-text-fill-color:?transparent;?????transition:?background-size?.5s;??????&:hover?{?????????background-size:?100%?100%;?????}?}?

效果如下:



CodePen Demo -- background-clip:text && 按钮填充效果[9]

图片窥探效果

再演示其中一个用法,利用两个 div 层一起使用,设置相同的背景图片,父 div 层设置图片模糊,其中子 div 设置
-webkit-background-clip:text,然后利用 animation 移动子 div ,去窥探图片。简单的效果示意图:

CodePen Demo -- background-clip: text 遮罩图片[10]

总结一下

其实还有很多有趣的用法,只有敢想并动手实践。当然很多人会吐槽这个属性的兼容性,到如今(2021-07-12),兼容性已经非常好了,主要是在使用的时候记得加上 -webkit- 前缀:



更多精彩 CSS 技术文章汇总在我的 Github -- iCSS[11] ,持续更新,欢迎点个 star 订阅收藏。

如果还有什么疑问或者建议,可以多多交流,原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

参考资料

[1]从条纹边框的实现谈盒子模型:

http://www.cnblogs.com/coco1s/p/5895764.html

[2]CodePen Demo - Clip:

https://codepen.io/Chokcoco/pen/WjOBzB

[3]CodePen Demo - clip:

https://codepen.io/Chokcoco/pen/eWRaVJ

[4]CodePen Demo - clip:

https://codepen.io/Chokcoco/pen/oWwRmE

[5]CodePen Demo -- background-clip: text 文字渐变色:

https://codepen.io/Chokcoco/pen/PmjMwz

[6]巧妙地制作背景色渐变动画!:

http://www.cnblogs.com/coco1s/p/6603403.html

[7]CodePen Demo -- 背景渐变动画 && 文字裁剪:

https://codepen.io/Chokcoco/pen/xdroGp

[8]CodePen Demo -- shine Text && background-clip:

https://codepen.io/Chokcoco/pen/OJbEOmb

[9]CodePen Demo -- background-clip:text && 按钮填充效果:

https://codepen.io/Chokcoco/pen/MmoNoq

[10]CodePen Demo -- background-clip: text 遮罩图片:

https://codepen.io/Chokcoco/pen/LyNmQv

[11]Github -- iCSS:

https://github.com/chokcoco/iCSS


相关推荐

陈冠希飞机争执事件:维权还是失态?

陈冠希最近又上热搜了!这次不是因为潮牌,而是在飞机上和机组人员“杠”上了。事情是这样的:他在东京飞纽约的航班上,发现机组人员让一名日籍VIP乘客优先下机,当场就炸了,直接质问:“我跟他哪里不一样?钻石...

风向变了,小S被吴宗宪猛爆黑料,至亲好友背刺,s家乱成一锅粥

前言当吴宗宪5月26日直播中甩出"黄子佼犯罪小S知情"的录音时,谁还记得这对师徒曾在《我猜》里默契十足的黄金年代?昔日提携晚辈的综艺天王,如今用三小时连爆12条黑料,把综艺女王钉在道德...

吴宗宪开撕小S,离婚内幕疑曝光,S家起内讧,汪小菲果然没说错

文|东方不败难怪葛思琪说小S大概率是不能复出了。原来一切都是有迹可循的!被吴宗宪猛曝黑料、被至亲好友背刺。失去大S的s家彻底乱成一锅粥。小S还能如以往那般幸运地“化险为夷”吗?01不得不说,作为台湾主...

美国俄亥俄大学性侵案细节曝光,新纪录片揭开体育界被忽视的丑闻

美国俄亥俄州立大学一直是美国校际体育运动的标杆,以至于很少有人将该大学与美国历史上最令人震惊的性虐待丑闻联系起来。近日,由澳大利亚纪录片导演伊娃·奥纳(EvaOrner)执导的《俄亥俄州立大学的幸存...

陈冠希飞机上怒怼空姐,称要让其丢掉工作?原因曝光后大家纷纷支持

【点新闻报道】44岁的陈冠希(Edison)被爆料在一架由东京羽田飞往纽约的航班上,疑不满头等舱的下机安排,与空姐发生口角,甚至放话:“把客诉信拿来,我会让你丢工作!”,引发网上热议。有内地网民在小红...

陈冠希机上风波再起!一场由“优先权”引发的对峙

一句“我会让你丢工作”的激烈争执录音,将陈冠希再次推向风口浪尖。飞机引擎的轰鸣尚未完全停歇,纽约机场的廊桥尚未对接,头等舱内的空气却已骤然凝固。44岁的陈冠希,这位早已褪去偶像光环却始终身处舆论漩涡...

传祺M8 vs 别克GL8,谁才是MPV终极选择?

广汽传祺M8与别克GL8一直都是很多人在选择MPV时纠结的对象,尤其是对于选择“困难症”的朋友来说,更是如此。今天我们将广汽传祺M8大师超混版和别克GL8ES陆尊进行对比,看看究竟怎么选!不是合资买...

开源鸿蒙OpenHarmony 6.0 Beta1发布

IT之家6月19日消息,开源鸿蒙OpenHarmony6.0Beta1(APILevel20)现已发布并上线Gitee。据介绍,OpenHarmony6.0Beta1版本进一...

巴雷特(Barrett)食管(巴雷特食管?)

近年来随着HP根除的增加等因素存在,食管胃结合部腺癌发病率逐年增加,食管胃结合部腺癌主要包括Barrett腺癌、胃贲门腺癌,而Barrett食管(Barrett’sesophagus,BE)为Bar...

儿子对象三天不出门 吵架动手后关系僵持

这几天家里事儿多。儿子交的女朋友搬来同住三天,人跟消失似的。每天中午才起床吃我家做的饭,吃完就喊着出去,问晚上回不回来,答不回来。昨天中午我找她谈儿子动手的事,她也不说话,现在微信电话全拉黑,连饭都不...

偷鸡不成蚀把米!命理师称小S将有大劫,老公许雅钧被爆换继承人

近期有命理师称小S将有大劫,其老公许雅钧也被爆换继承人,具体情况如下:命理师称小S有大劫有台湾省命理师称小S面相不好,将会有一场“大劫”,会影响到她生活的重大事件。还有细心网友翻出2022年某命理师在...

如何设计Agent的记忆系统(agent记忆方法)

最近看了一张画Agent记忆分类的图我觉得分类分的还可以,但是太浅了,于是就着它的逻辑,仔细得写了一下在不同的记忆层,该如何设计和选型先从流程,作用,实力和持续时间的这4个维度来解释一下这几种记忆:1...

深入理解跨域及常见误区揭秘(深入理解跨域及常见误区揭秘论文)

跨域问题是前端与后端协作中不可避免的话题,处理不当将直接影响系统可用性与安全性。本文将系统梳理跨域的概念、原理、常见解决方案,并结合实际开发中易错点进行总结,帮助你全面掌握跨域知识。一、什么是跨域?*...

aardio + Java + JavaScript 混合开发快速入门

aardio最近在AI功能上做了很多细节的改进,建议大家更新。aardio的AI接口里的Gemini2.5pro更新到了刚发布的最新版本(Gemini2.5pro0605),...

一种改进的锂离子电池剩余寿命预测算法

摘要:锂离子电池故障往往会使系统性能下降甚至瘫痪,故障部件剩余寿命的精确估计对整个系统的寿命预测和健康管理至关重要。粒子滤波是一种有效的序列信号处理方法,然而应用于锂离子电池剩余寿命预测准确性并不高...