CSS 奇思妙想 background-clip
zhezhongyun 2025-05-24 18:20 4 浏览
作者: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 :
<div>Clip</div> <style> div { font-size: 180px; font-weight: bold; color: deeppink; background: url($img) no-repeat center center; background-size: cover; } </style>
效果如下:
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 的作用。
嗨起来
了解了最基本的用法,接下来可以想想如何去运用这个元素制作一些效果。
大大增强了文字的颜色填充选择
文字颜色的动画效果
配合其他元素,实现一些其他巧妙的用法
实现文字渐变效果
利用这个属性,我们可以十分便捷的实现文字的渐变色效果。
<div> background-clip: text</div>
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,实现了一种,嗯,很红灯区的感觉:
<div class="text">保健沐足按摩</div>
.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,伪代码如下:
<p data-text="Lorem ipsum dolor"> Lorem ipsum dolor </p>
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]
按钮填充效果
运用这个属性,我们可以给按钮实现这样一种遮罩填充动画(主要是用于防止文字闪烁):
<div class="btn">Btn</div>
.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
- 上一篇:CSS简单圆角框实现方法
- 下一篇:让CSS flex布局最后一行左对齐的N种方法
相关推荐
- 历时10个多月,学习了这132 个CSS 特效,还不来学习
-
这132个特效,是我历时10个多月在油管一个一个跟着敲出来的,为了加强记忆,每个练习,我都录制了视频,在这里分享出来给大家。大家可能又会调侃了,你是工作不饱和吧,有时间做这些。其实,我目前工作还是挺饱...
- 让CSS flex布局最后一行左对齐的N种方法
-
作者:张鑫旭https://www.zhangxinxu.com/wordpress/2019/08/css-flex-last-align/前言小伙伴们是否还记得,之前小编也发布了几篇关于CSS相关...
- CSS 奇思妙想 background-clip
-
作者:SbCoco来源:iCSS前端趣闻说起background-clip,可能很多人都很陌生。Clip的意思为修剪,那么从字面意思上理解,background-clip的意思即是背景裁剪。我...
- CSS简单圆角框实现方法
-
先看下效果图对基于CSS的设计最初的批评意见之一是CSS太死板了,只能建立方框,因此本次我们需要用图形软件创建下面两个图形,一个用于顶部,一个用于底部。接下来我们详细介绍它的实现方法:1.创建一个简单...
- 文档声明:HTML文档的基石
-
在前端开发的世界里,文档声明虽是一个看似不起眼的细节,却在网页的解析和渲染过程中扮演着至关重要的角色。今天,就让我们深入探讨文档声明的奥秘,揭开它背后的原理和重要性。一、文档声明的定义与作用文档声明,...
- CSS 单位指南
-
在前端开发中,CSS单位的选择直接影响着页面的布局效果和响应式表现。本文将系统介绍CSS中各种单位的特性、使用场景和最佳实践,帮助你做出更明智的选择。一、CSS单位分类全景图CSS单位可分为...
- CSS3 遮罩
-
在网页设计中,我们经常需要实现一些特殊的视觉效果来增强用户体验。CSS3遮罩(mask)允许我们通过控制元素的可见区域来创建各种精美的视觉效果。本文将带你全面了解CSS3遮罩的功能和应用。什么是...
- 用css如何实现三角形
-
在实际编程中我们经常会遇到下拉菜单的下三角和一些特殊的图形,那么这些如何用css来实现呢?例1例2例3原理:仔细想想,原理非常简单,利用CSS的border以及它的属性值transparent来实现三...
- css 实现各种多边形图案
-
使用css的border边框属性和宽度高度可以实现各种形状的图形,如下:梯形html:<divclass="trapezoid"></div>css:/*梯形...
- 用css制作头像渐变边框
-
之前有一个头像渐变边框的需求,当时是全部用的切图,但是不同的地方可能头像大小不一样,切图适配性太差,正好这几日学了下css渐变的各种妙用,想到之前的头像边框其实可以用渐变来实现。当时用到的头像切图:目...
- 如何帮图片加边框?方法有三种
-
如何帮图片加边框?随着社会经济的发展,更多人开始注意外在物品的美观度,例如图片有无边框等装饰。而在设计和排版中,给图片加边框是一种常见的技巧,可以使图片更突出、更有吸引力。有许多方法可以完成这个任务,...
- 边框图片怎么做?提供三种方法
-
边框图片怎么做?边框图片可以为图片增加一定的装饰和美感,使其更加突出和引人注目。同时,边框图片也可以用于设计海报、宣传品等,让设计更加精美和专业。边框图片是一种常见的设计元素,可以为图片增加一定的装饰...
- css设置div只显示某一边的边框
-
在网页设计中经常用到css来设计各种边框样式以及颜色等,有时候需要一个div只显示一个边框,那么你可能会用到下面的一些方法。一、CSSborder-width属性border-width是实现显示...
- 适合在任何地方使用的 Linux:15 个小型 Linux 发行版
-
如果你有一台老旧的PC或超小型设备,这些Linux发行版中的一个应该适合你。来源:https://linux.cn/article-12281-1.html作者:DavidGewirtz译者...
- css box-shadow的巧妙应用
-
还有人不会写阴影吗下面就带大家来分享一些实实在在的干货。box-shadow的作用box-shadow的作用是给元素添加阴影,说简单点就是要给元素阴影特效就用box-shadow就行。box-shad...
- 一周热门
- 最近发表
- 标签列表
-
- HTML 教程 (33)
- HTML 简介 (35)
- HTML 实例/测验 (32)
- HTML 测验 (32)
- HTML 参考手册 (28)
- JavaScript 和 HTML DOM 参考手册 (32)
- HTML 拓展阅读 (30)
- HTML常用标签 (29)
- HTML文本框样式 (31)
- HTML滚动条样式 (34)
- HTML5 浏览器支持 (33)
- HTML5 新元素 (33)
- HTML5 WebSocket (30)
- HTML5 代码规范 (32)
- HTML5 标签 (717)
- HTML5 标签 (已废弃) (75)
- HTML5电子书 (32)
- HTML5开发工具 (34)
- HTML5小游戏源码 (34)
- HTML5模板下载 (30)
- HTTP 状态消息 (33)
- HTTP 方法:GET 对比 POST (33)
- 键盘快捷键 (35)
- 标签 (226)
- HTML button formtarget 属性 (30)