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

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

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

作者: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


相关推荐

如何设计一个优秀的电子商务产品详情页

加入人人都是产品经理【起点学院】产品经理实战训练营,BAT产品总监手把手带你学产品电子商务网站的产品详情页面无疑是设计师和开发人员关注的最重要的网页之一。产品详情页面是客户作出“加入购物车”决定的页面...

怎么在JS中使用Ajax进行异步请求?

大家好,今天我来分享一项JavaScript的实战技巧,即如何在JS中使用Ajax进行异步请求,让你的网页速度瞬间提升。Ajax是一种在不刷新整个网页的情况下与服务器进行数据交互的技术,可以实现异步加...

中小企业如何组建,管理团队_中小企业应当如何开展组织结构设计变革

前言写了太多关于产品的东西觉得应该换换口味.从码农到架构师,从前端到平面再到UI、UE,最后走向了产品这条不归路,其实以前一直再给你们讲.产品经理跟项目经理区别没有特别大,两个岗位之间有很...

前端监控 SDK 开发分享_前端监控系统 开源

一、前言随着前端的发展和被重视,慢慢的行业内对于前端监控系统的重视程度也在增加。这里不对为什么需要监控再做解释。那我们先直接说说需求。对于中小型公司来说,可以直接使用三方的监控,比如自己搭建一套免费的...

Ajax 会被 fetch 取代吗?Axios 怎么办?

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!今天给大家带来的主题是ajax、fetch...

前端面试题《AJAX》_前端面试ajax考点汇总

1.什么是ajax?ajax作用是什么?AJAX=异步JavaScript和XML。AJAX是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,AJAX可以使网页实...

Ajax 详细介绍_ajax

1、ajax是什么?asynchronousjavascriptandxml:异步的javascript和xml。ajax是用来改善用户体验的一种技术,其本质是利用浏览器内置的一个特殊的...

6款可替代dreamweaver的工具_替代powerdesigner的工具

dreamweaver对一个web前端工作者来说,再熟悉不过了,像我07年接触web前端开发就是用的dreamweaver,一直用到现在,身边的朋友有跟我推荐过各种更好用的可替代dreamweaver...

我敢保证,全网没有再比这更详细的Java知识点总结了,送你啊

接下来你看到的将是全网最详细的Java知识点总结,全文分为三大部分:Java基础、Java框架、Java+云数据小编将为大家仔细讲解每大部分里面的详细知识点,别眨眼,从小白到大佬、零基础到精通,你绝...

福斯《死侍》发布新剧照 "小贱贱"韦德被改造前造型曝光

时光网讯福斯出品的科幻片《死侍》今天发布新剧照,其中一张是较为罕见的死侍在被改造之前的剧照,其余两张剧照都是死侍在执行任务中的状态。据外媒推测,片方此时发布剧照,预计是为了给不久之后影片发布首款正式预...

2021年超详细的java学习路线总结—纯干货分享

本文整理了java开发的学习路线和相关的学习资源,非常适合零基础入门java的同学,希望大家在学习的时候,能够节省时间。纯干货,良心推荐!第一阶段:Java基础重点知识点:数据类型、核心语法、面向对象...

不用海淘,真黑五来到你身边:亚马逊15件热卖爆款推荐!

Fujifilm富士instaxMini8小黄人拍立得相机(黄色/蓝色)扫二维码进入购物页面黑五是入手一个轻巧可爱的拍立得相机的好时机,此款是mini8的小黄人特别版,除了颜色涂装成小黄人...

2025 年 Python 爬虫四大前沿技术:从异步到 AI

作为互联网大厂的后端Python爬虫开发,你是否也曾遇到过这些痛点:面对海量目标URL,单线程爬虫爬取一周还没完成任务;动态渲染的SPA页面,requests库返回的全是空白代码;好不容易...

最贱超级英雄《死侍》来了!_死侍超燃

死侍Deadpool(2016)导演:蒂姆·米勒编剧:略特·里斯/保罗·沃尼克主演:瑞恩·雷诺兹/莫蕾娜·巴卡林/吉娜·卡拉诺/艾德·斯克林/T·J·米勒类型:动作/...

停止javascript的ajax请求,取消axios请求,取消reactfetch请求

一、Ajax原生里可以通过XMLHttpRequest对象上的abort方法来中断ajax。注意abort方法不能阻止向服务器发送请求,只能停止当前ajax请求。停止javascript的ajax请求...