← 返回题目列表

CSS 伪类和伪元素有什么区别?常见使用场景有哪些?

高频 简单 第 5 / 28 题 更新于 2026/07/28
CSS伪类伪元素选择器交互状态

简化版

伪类描述元素的状态或结构关系,例如 :hover:focus:nth-child();伪元素描述元素的一部分或生成的虚拟内容,例如 ::before::after::first-line。前者选状态,后者造部件。

详细版

  • 伪类通常以单冒号书写,表示元素处于某种状态、位置或条件。
  • 伪元素通常以双冒号书写,表示选择元素的某个部分或创建虚拟盒子。
  • ::before::after 必须配合 content 才能生成内容。
  • 伪类适合 hover、focus、checked、disabled、nth-child 等交互和结构样式。
  • 伪元素适合装饰线、角标、首字母、占位符样式等不需要额外 DOM 的场景。

完整版教学

记忆钩子:伪类问“这个元素现在是什么状态”,伪元素问“这个元素里面哪一部分”。

一、这题真正考什么

记忆钩子:伪类问“这个元素现在是什么状态”,伪元素问“这个元素里面哪一部分”。

面试官不是只想听定义,而是想看你能不能把 CSS 规则、浏览器渲染、工程维护和用户体验连起来。回答这类题时,先讲机制,再讲例子,最后讲排查方法和边界。

二、底层机制怎么理解

CSS 选择器不仅能选真实 DOM 节点,还能根据状态、结构和虚拟片段匹配样式。伪类不会创建新的盒子,它只是限定匹配条件;伪元素则可能参与渲染树,尤其是 ::before::after 会生成可布局的匿名内容。

CSS 面试题的关键通常在“规则为什么这样生效”。只要能讲清浏览器按什么顺序匹配、计算、布局和绘制,就不会停留在背属性名的层面。

三、带数字的小推演

一个按钮 hover 时变色应使用 button:hover;按钮左侧加一个装饰圆点可以用 button::before。如果列表第 3 项高亮,用 li:nth-child(3);如果段落首行加粗,用 p::first-line

下面把判断过程压成几条可复用规则,面试时可以直接照这个顺序推:

:hover = 状态匹配,不新增 DOM 或盒子
::before + content = 在元素内容前生成伪元素盒子
选择器思路:真实元素 + 条件/虚拟部分 => 最终样式目标

四、浏览器处理流程

可以把它放进浏览器处理链路里看:

浏览器解析 DOM
   |
选择器匹配真实元素
   |
伪类根据状态或结构过滤
   |
伪元素生成或匹配虚拟片段
   |
进入样式计算和布局绘制

流程图能帮你避免两个常见问题:一是把 CSS 属性当成孤立开关,二是忽略父级、上下文和渲染阶段的影响。真正排查线上样式问题时,沿流程定位通常比随机改 CSS 更快。

五、对比表格

类型例子用途
伪类:hover鼠标悬停状态
伪类:nth-child(2n)结构位置匹配
伪类:focus-visible键盘焦点样式
伪元素::before生成装饰内容
伪元素::placeholder输入占位符样式

对比题不要只背结论,要主动补一句“适合什么场景”。CSS 的很多选择没有绝对优劣,只有是否符合布局、可维护性、性能和可访问性目标。

六、工程实践和排查思路

  • 不要用伪元素承载关键业务文本,屏幕阅读器和复制行为可能不符合预期。
  • nth-child 按兄弟节点位置匹配,不是按类名过滤后的第几个匹配。
  • 使用 DevTools 时要同时看 matched rules、computed style、layout、accessibility 和 event listeners,避免只盯着源码。
  • 组件库项目要把这类规则沉淀成 token、基础样式或 lint 约束,否则同类问题会反复出现。

七、常见误区与追问

  • 误区:伪类和伪元素只是写法单冒号和双冒号的区别。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 误区:::before 不写 content 也会显示。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 误区:伪元素可以完全替代真实 DOM。 需要补上浏览器机制、适用条件和反例,避免把经验口诀当成规则本身。
  • 追问::nth-child 和 :nth-of-type 有什么区别? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。
  • 追问::focus 和 :focus-visible 怎么选? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。
  • 追问:为什么装饰内容适合用伪元素? 先给判断标准,再结合代码、浏览器行为和工程约束说明取舍。

八、加强记忆

“类是状态,元素是部件”。面试时先给定义,再举 hover、nth-child、before、placeholder 四个例子,基本就能覆盖主干。

复习 HTML/CSS 高频题时,可以固定按“定义、触发条件、浏览器流程、代码例子、工程风险、排查工具”六步组织答案。这样不会只停留在背概念,也更像真实前端开发者。