【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 及以下)不支持伪类和伪元素;
  • 移动端浏览器普遍支持,但仍需注意使用方式;
相关推荐
屋外雨大,惊蛰出没7 分钟前
Vue+spring boot前后端分离项目搭建---小白入门
前端·vue.js·spring boot
梦语花11 分钟前
如何在前端项目中优雅地实现异步请求重试机制
前端
彬师傅13 分钟前
JSAPITHREE-自定义瓦片服务加载
前端·javascript
番茄比较犟16 分钟前
UI更新中Widget比较过程
前端
独立开发者Pony18 分钟前
关于我用 Ai 完成了一套系统 99% 代码这件事
前端·javascript·github
番茄比较犟19 分钟前
Widget位置移动详细
前端
宇宙中最后一个太阳19 分钟前
10 分钟构建 Vue 3 端到端类型安全的表单
前端·vue.js
温宇飞21 分钟前
CSS Display 双值语法
css
iaku21 分钟前
组件通信艺术:Vue3中的8种组件通信方式
前端
默默地离开24 分钟前
JS手搓代码----(new)
前端·javascript