【CSS篇】伪类与伪元素的区别与作用详解

在 CSS 的世界中,伪类(pseudo-classes) 和 伪元素(pseudo-elements) 是两个非常常用但又容易混淆的概念。它们都用于为 HTML 元素添加特殊样式效果,但其背后的工作机制和使用方式却有显著差异。

本文将带你系统梳理 伪类与伪元素的区别、作用以及实际应用场景,帮助你写出更清晰、高效的 CSS 样式代码。


📌 一、基本概念对比表

对比维度 伪类(Pseudo-class) 伪元素(Pseudo-element)
是否创建新元素 ❌ 不创建新元素 ✅ 创建虚拟元素
是否影响文档结构 ❌ 不改变 DOM 结构 ❌ 不改变 DOM 结构
表示符号 单冒号 : 双冒号 ::
主要用途 描述元素的某种状态或位置 操作元素的某些特定部分
示例 a:hover, p:first-child p::before, p::first-line

🧩 二、逐项解析

1. 伪类(Pseudo-class)

✅ 定义:

伪类用于向某些选择器添加特殊的状态样式,表示某个元素处于某种状态。

🎯 特点:

  • 不会创建新的元素;
  • 描述的是已有元素的"状态"或"位置";
  • 常用于交互效果、结构匹配等;

📌 常见伪类示例:

css 复制代码
/* 鼠标悬停时的颜色变化 */
a:hover {
  color: #FF00FF;
}

/* 第一个子元素 */
p:first-child {
  color: red;
}

/* 超链接的已访问状态 */
a:visited {
  color: purple;
}

/* 表单输入获得焦点 */
input:focus {
  border-color: blue;
}

⚙️ 常用伪类列表:

伪类名 说明
:hover 鼠标悬停时的样式
:active 元素被激活(如点击)时的样式
:focus 表单控件获得焦点时的样式
:visited 已访问过的超链接样式
:nth-child() 匹配指定位置的子元素
:first-child 匹配第一个子元素
:last-child 匹配最后一个子元素
:not() 排除符合选择器的元素

2. 伪元素(Pseudo-element)

✅ 定义:

伪元素是通过 CSS 在现有元素的某些特定部分插入虚拟的内容或样式,虽然它们看起来像新元素,但实际上并不存在于 DOM 中。

🎯 特点:

  • 创建的是虚拟的"元素";
  • 通常用于操作元素的某一部分内容;
  • 使用双冒号 :: 表示(为了与伪类区分);

📌 常见伪元素示例:

css 复制代码
/* 在每个段落前插入内容 */
p::before {
  content: "第一章:";
}

/* 在每个段落后插入内容 */
p::after {
  content: " 🔥 Hot!";
}

/* 设置段落首行样式 */
p::first-line {
  background: red;
}

/* 设置段落首字母样式 */
p::first-letter {
  font-size: 30px;
}

⚙️ 常用伪元素列表:

伪元素名 说明
::before 在元素内容前插入虚拟内容
::after 在元素内容后插入虚拟内容
::first-line 选中元素的第一行文本
::first-letter 选中元素的第一个字符
::selection 用户选中文本时的样式
::placeholder 输入框 placeholder 文字样式
::marker 修改列表项标记(如 <li> 前的圆点)
::backdrop 全屏模式下的背景层(如 <dialog> 元素)

💡 三、关键区别总结

区别维度 伪类 伪元素
是否创建新元素 ❌ 否 ✅ 是(虚拟元素)
是否改变 DOM ❌ 否 ❌ 否
是否支持动态交互 ✅ 支持用户行为触发(如 hover) ❌ 多为静态样式控制
表示方式 单冒号 : 双冒号 ::
应用场景 状态匹配、结构定位 内容修饰、视觉增强

🧠 四、如何选择?什么时候用伪类?什么时候用伪元素?

场景描述 推荐使用
需要根据用户行为设置不同样式(如 hover) ✅ 伪类
需要为元素的特定部分添加样式(如首行) ✅ 伪元素
需要在元素前后插入内容(如图标、标签) ✅ 伪元素
需要匹配子元素的位置关系(如第几个) ✅ 伪类
实现按钮悬停动效 ✅ 伪类 + transition
自定义输入框 placeholder 样式 ✅ 伪元素

📌 五、实战技巧分享

✅ 技巧一:利用 ::before 和 ::after 实现装饰性图标

css 复制代码
.btn::after {
  content: " ➤";
  margin-left: 5px;
}

这样可以在按钮文字后自动加上箭头符号,无需额外 HTML。

✅ 技巧二:结合伪类和伪元素实现复杂样式

css 复制代码
a:hover::after {
  content: " (当前页面)";
  color: gray;
}

当鼠标悬停在链接上时,自动显示提示信息。

✅ 技巧三:使用 ::selection 自定义文本选中颜色

css 复制代码
::selection {
  background: yellow;
  color: black;
}

提升用户体验,让网站风格更统一。


📈 六、兼容性说明

  • 伪类:大多数现代浏览器都支持常见的伪类;
  • 伪元素 :建议使用双冒号 :: 以确保未来兼容性;
  • 旧版浏览器(如 IE8 及以下)不支持伪类和伪元素;
  • 移动端浏览器普遍支持,但仍需注意使用方式;
相关推荐
子兮曰5 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰5 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万5 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝5 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋5 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁5 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95275 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大5 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师5 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学5 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端