📚前端面试题速记
Q1

CSS 伪类与伪元素的区别?

速记答案(30 秒)

伪类(:hover / :nth-child 等)选中元素的某种状态,本质还是选中已有元素;伪元素(::before / ::after)选中元素中的虚拟子元素(不在 DOM 中)。推荐双冒号 :: 表示伪元素,单冒号 : 表示伪类。

📖 详细讲解

标准面试回答(推荐记住)

伪类用单冒号,比如 :hover、:nth-child,它们选中的是元素的某种状态或位置关系,本质上还是选中已有的 DOM 元素。伪元素用双冒号,比如 ::before、::after、::first-line,它们选中的是元素中的虚拟子元素,这些元素不在 DOM 树中。写法上推荐用双冒号表示伪元素以区分,但为了兼容老浏览器,单冒号也能用。

伪类 vs 伪元素

特性 伪类 伪元素
符号 单冒号 :hover 双冒号 ::before
作用 选中元素的状态 创建虚拟子元素
DOM 选中已有元素 不在 DOM 中

常见伪类

/* 状态伪类 */
a:hover { color: red; }
input:focus { border-color: blue; }
input:disabled { opacity: 0.5; }

/* 结构伪类 */
li:first-child { font-weight: bold; }
li:nth-child(2n) { background: #f5f5f5; }
p:not(.special) { color: gray; }

常见伪元素

/* 前后插入内容 */
.quote::before { content: '"'; }
.quote::after { content: '"'; }

/* 首行首字母 */
p::first-line { font-weight: bold; }
p::first-letter { font-size: 2em; }

/* 选中文本 */
::selection { background: yellow; }

面试要点

  • 伪类选状态,伪元素创建虚拟元素
  • 推荐用双冒号 :: 表示伪元素
  • 伪元素必须有 content 属性(即使为空)

💻 代码示例

伪元素实现装饰效果
🎨 效果预览