前端必须掌握的 before/after 伪元素小技巧

CSS 有一系列的伪元素,如 :before,:after,:first-line,:first-letter 等。

我们平常使用最多的是 :before,:after,这也是所有前端开发都要掌握并且熟练应用的技巧。

before/after 伪元素介绍

:before,:after 代表元素自身内容 之前 和 之后 的内容。

先举个简单的例子,一看就懂了:

p 元素原本的内容只有"之道前端",但是利用 :before,:after 可以给原来 p 元素自身内容的前面和后面添加内容。

最终的结果,就像 p 元素原本就拥有这些内容一样。

:before,:after 之所以称为伪元素,是因为它们是元素,虽然是假的(伪),但本质还是元素,因此,其他的 CSS 规则可以操作在它们身上。比如:

正因为这个特性,等于每个 HTML 元素都包含 2 个子元素,不需要写 HTML 标签,但是可以赋予 CSS 规则,这给了我们非常多的想象空间和便利。

这里比较关键的是 content 属性,这个属性表示伪元素的内容是什么,因为伪元素是没有 HTML 标签的,所以只能在 CSS 中定义这些元素的内容。content 属性的值常用的主要有以下 3 类:

  • 字符串:赋予常量文字内容
  • attr(attr_name) :使用父元素 attr_name 属性的值作为伪元素的内容,可以看下面的例子
  • url:引用外部资源,常用的是图片,这里就不举例了

如果不想要内容的话,就赋予空字符串就好了,这也是我们最常用的方式,因为基于结构和样式分离的原则,我们不建议在 CSS 中编写页面内容,这样不利于调试和维护。

同时,因为伪元素不能被 JS 操作,所以 :before,:after 一般都用来实现样式效果。

好了,:before,:after 伪元素的基础知识就学习这么多就够了,其他的你可以扩展去学习。

before/after 伪元素的作用

网上有很多 :before,:after 的应用场景举例,比如清除浮动之类的,我就不重复了,你可以自己去查。

我这里想着重介绍擅于应用 :before,:after 的作用,让你想清楚方向,正确练习它们。做到:在有需要的时候,想到要使用它们。同时只在需要的时候使用,而不是滥用。

有助于结构&样式分离,提升 HTML 代码质量

一份高质量的 HTML&CSS 代码,一定是结构&样式分离的。而 :before,:after 对于结构&样式分离非常有帮助。

正如前文的介绍,:before,:after 可以在不写 HTML 标签的前提下,给每个元素增加两个子元素,而且大部分 CSS 都可以作用到它们身上,利用这个特性,我们可以实现很多细节的样式,而不需要为了实现某些效果,写一些空的 div/span 标签。

这不仅可以节省 HTML 标签和代码,更重要的是,它们有助于结构&样式分离,让我们的 HTML 代码更加纯净。

如果你拥有结构&样式分离的思想,为了实现某个 CSS 效果必须要添加一些空标签,为此感到很难受的时候 ,:before,:after 大概率能帮到你。

举个小栗子:

这是一个常见的效果,就是一些居中子标题,两边再补一点样式,这样好看一点。

可以看到上面两种实现方案的效果和 CSS 代码几乎一样,但是 HTML 的差别很明显,上面的 HTML 代码多了两个 span 元素,让我们的 HTML 代码看起来很奇怪。

再举一个例子,在我们的 P2 原创项目 (戳此查看)中,实现天猫首页的顶部栏中有这样一个效果:

这是很常见的效果,在一些按钮的后面,有个小箭头,或者在前面有个小图标。

这时,我们也可以使用 :before,:after 来实现这些效果。

以上代码节选自我们的 P2 原创项目的官方参考答案,感兴趣可以点击这里查看。

再来看另外一个例子,也是在我们的 P2 原创项目 (戳此查看)中,实现这样一个效果:

这个小小的 tips 文案,虽然内容不多,但是却混杂着两种布局,"进口精选" 和 "大牌好货" 字号一样,横向布局;但是"轻松购入"字号和"大牌好货"不一样,纵向布局。

如果不注意的同学,很可能就会写出很复杂的嵌套标签,实现横向 + 纵向的布局,但是这里使用 after 伪元素之后,可以很好地精简我们的 HTML 代码,让纵向布局在一个元素中解决。同时,使用 contet: attr() 让文案保留在 HTML 代码中,方便 HTML 代码的维护。

以上代码节选自我们的 P2 原创项目的官方参考答案,感兴趣可以点击这里查看。

扩展"自己"

谨记::before,:after 让每个 HTML 元素都默认新增 2 个子元素。

因此,当我们因为要实现某个复杂样式,需要多个元素配合时,就可以利用 :before,:after,这样我们只需要 1 个元素即可。

例如下面的小图标:

:before,:after 伪元素是属于父元素的,因此当我们点击这些伪元素的时候,实际上是点击父元素。

利用这个特性,我们可以实现类似 input + label 的点击联动效果。

除了这个之外,我们最常用这个点击关联特性来实现扩展元素的可点击区域。比如:

今天的分享到这里就差不多了,最后小结一下。

要想提升我们的 HTML&CSS 能力,一定要注意结构&样式分离,

而 :before,:after 这对伪元素是我们达成这个目标的有力助手,是所有前端都必须熟练掌握的技能。

----------------【END】----------------

如果你是真心喜欢前端,并相信成长,想要提升自己的话,欢迎加入之道前端学习圈子。

戳这里 免费获取 之道前端的学习资料和专属服务。

相关推荐
深蓝AI1 小时前
45 万星的开源逆向 MCP:REA 让 Agent 无源码读懂任意应用,把证据和边界写进设计
人工智能·程序员
卸任11 小时前
Vibe coding工具使用心得
前端·ai编程
brien912 小时前
为什么模型标称 1M,Google Antigravity 聊到 256K 却突然失忆?我们给它做了个原生行内监控圆环
前端
修炼的dance12 小时前
录屏关键帧间隔多少合适?六档实测,2秒到10秒小了75.6%
前端
Lank_M12 小时前
关键帧从1秒拉到10秒,录屏小87.3%,摄像头小10.8%
前端
补码缩写12 小时前
用 ffprobe 拆录屏,八成字节在 29 个关键帧上
前端
百思不得小李12 小时前
一个复杂的动态表单是如何实现的
前端·设计模式
陈随易13 小时前
Cmder 停更 17 个月,2.0 支持 Windows Terminal
前端·后端·程序员
风骏时光牛马13 小时前
前沿视界
前端
kyriewen13 小时前
我扫了 814 个依赖,97 个还敢要 Node 10
前端·javascript·程序员