CSS 中 content 属性的妙用
前言
本文讲解 CSS 中使用频率并不高的 content 属性,通过多个实用的案例,带你由浅入深的掌握 content 的用法,让代码变得更加简洁、高效。
定义
W3school 中这样定义:
content 属性与 :before 及 :after 伪元素配合使用,来插入生成内容。
该属性用于定义元素之前或之后放置的生成内容。默认地,这往往是行内内容,不过该内容创建的框类型可以用属性 display 控制。
在前端日常开发中,content 属性使用频率并不高,所以开发者一般对它的理解并不深入,通常会在清除浮动、字体图标时偶尔使用。下面通过各种案例,来一起看看 content 的妙用。
案例
1. 清除浮动
父元素.container
中两个子元素.left
和.right
浮动后会脱离文档流,无法撑起容器,造成.container
高度为0
。使用伪元素:after
清除浮动,三个属性缺一不可:
content: '';
通过:after
添加一个内容为空的伪元素。clear: both;
伪元素:after
两侧浮动清除。dispaly: block;
设置块元素,因为clear
只对块元素有效。
说到clear
属性,使用最多的就是clear: both
,left/right
用的却很少,因为both
已经包含left/right
特性,简单直接还有效。想更加深入了解clear
属性,可以看看张鑫旭大神的准确理解CSS clear:left/right的含义及实际用途。
2. 小三角的气泡窗口
效果:
配合伪元素:after
,实现了一个右下角带倒三角指向性的气泡窗口。通过调整border
各边的颜色和绝对定位位置,可以绘制出指向不同的气泡窗口,只用一个div
标签实现,是不是既简洁又美观。可能你会想到这是伪元素:after
的效果,和content
属性无关,实际上去掉content
后:after
是不生效的。
3. 字体图标
第一种是浏览器自带的特殊字符:
效果:
浏览器支持很多字体图标,如:天气☀、雪花❄、三叶草☘、太极☯等等有趣的字符。参考网页HTML特殊字符编码对照表。
第二种是外部引入字体图标,如 Bootstrap 中的 Glyphicon 字体图标:
效果:
这里为什么没有写 CSS 样式呢,因为 bootstrap.min.css 中已经定义好了 glyphicon-heart 的样式,直接在官网上查看:
需要说明的是,本地引入 bootstrap.min.css 后,还需要引入字体图标库 glyphicons-halflings-regular.woff2,字体图标才能生效。
按照上述 url 路径,将 glyphicons-halflings-regular.woff2 放到如下目录结构中即可。
4. 无内容提示
效果:
当元素内容为空时,通过content
内容“暂无数据”进行展示。可使用场景:后台接口返回数据后,插入到页面 DOM 中,当后台返回数据为空时,通过 CSS 直接提示暂无数据,不需要使用 JavaScript 处理。
一个有趣的现象,content
内容“暂无数据”无法被选中,这是因为伪元素用于创建一些不在文档树中的元素,虽然用户可以看到这些文本,但是这些文本实际上不在文档树中。
5. 面包屑菜单
效果:
又是一个content
值为特殊字符的例子,配合伪类和伪元素完成面包屑菜单。
6. 加载中...动画
效果:
animation
动画值含义:
loading:animation-name,规定需要绑定到选择器的 keyframe 名称为 loading。
2s:animation-duration,规定完成动画所花费的时间 2 秒。
ease:animation-timing-function,规定动画的速度曲线,先慢中快后慢。
infinite:animation-iteration,规定动画应该播放的次数为无限次。
通过animation
动画完成 33%、66%时与content
内容配合,实现动态“加载中...”的效果。
7. 插入图片
效果:
除了插入字体图标,content
还可以使用url()
方法插入图片,和background
属性类似可以使用url
指定一个图片路径,不同的是content
属性无法控制图片大小,使用条件有限。
8. attr 属性内容生成
效果:
content
值也可以是attr()
方法,用来获取指定属性的值,可插入到指定的位置。
9. 半边特效
效果:
半边特效是通过attr()
方法获取text
属性值,属性值与其内容相同,巧妙的设置绝对定位,只显示一半并覆盖了原文本内容,实现文字半边特效,是不是还挺炫酷的。需要注意的是有些font-family
字体会有文字无法重合的问题。
10. 文字引号
效果:
利用元素的quotes
属性指定双引号,使用content
的open-quote
属性值设置开口引号,close-quote
属性值设置闭合引号,当然quotes
也可以指定其他符号。
11. 添加章节数
效果:
这里用到了counter
计数器方法,涉及到counter-reset
、counter-increment
、counter()
和counters()
几个属性。
counter-reset
用来指定计数器名称,例子中命名为section
,同时可以指定计数器开始计数的数值,如指定开始计数数值为 1:counter-reset: section 1;
,不指定默认为0
。counter-increment
用来指定计数器每次递增的值,如指定计数器递增值为 2:counter-increment: section 2;
,默认值为 1,counter-increment
只要指定了counter-reset
,对应的计数器的值就会变化。counter(name, style)
用来输出计数器的值。其中name
为计数器名称,style
可选参数,默认为阿拉伯数字,也可指定list-style-type
支持的值,如罗马数字lower-roman
。counters(name, strings, style)
用来处理嵌套计数器,同样是输出计数器的值,和counter()
不同的是多了一个strings
参数,表示子序号的连接字符串。例如1.1
的string
就是'.'
,1-1
就是'-'
。
关于计数器的详细的教程,同样可以参考 CSS 大神张鑫旭的CSS counter计数器(content目录序号自动递增)详解。
12. 计算 checkbox 选中数
效果:
巧妙运用计数器配合:checked
伪类,选中计数器增加 1,取消选中减 1,用 CSS 实现动态计数功能。
总结
总结 content 属性值可以为以下几种:
string 字符串,最常见的,对应案例:清除浮动、小三角的气泡窗口、字体图标、无内容提示、面包屑菜单、加载中...动画。
url()方法,对应案例:插入图片。
attr()方法,对应案例:attr 属性内容生成、半边特效。
quotes 引号,对应案例:文字引号。
counter()方法,计数器功能,对应案例:添加章节数,计算 checkbox 选中数。
尽管使用 javaScript 同样可以实现上述的大部分功能,灵活性也更高,但使用 CSS 的好处就是可以极大地简化开发,不占用 JS 主线程,提升 web 的性能。
其实 content 的案例远不止于此,在查阅相关资料的同时,我还见识到了另外一些神奇的用法,当然原理大致相同,本文的案例只是尽可能的带你了解 content 不为人知的一面,打开一个全新的世界,让你举一反三。如果能在实际开发中运用上,那就更 Nice 了,希望能对大家有所帮助。
你学“废”了么?
文章首发于我的博客 https://echeverra.cn/css-content,原创文章,转载请注明出处。
欢迎关注我的微信公众号 echeverra,一起学习进步!不定时会有资源和福利相送哦!
版权声明: 本文为 InfoQ 作者【echeverra】的原创文章。
原文链接:【http://xie.infoq.cn/article/e2a3973c420e9965b651fe58e】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论