前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库CSS ::before ::after content property
CSS层叠与选择器

before 和 after 伪元素的 content 属性能设置哪些值?

::before 和 ::after 在元素内容的前面和后面插入生成的内容。必须写 content 属性才会渲染,哪怕是空字符串 content: "" 也行。content 的值可以是字符串、attr() 函数、url() 图片、CSS 计数器等。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#层叠与选择器
先看核心答案读代码示例
理解线索

伪元素生成内容的三个要素

  1. content 属性必须存在,决定插入什么内容
  2. 插入位置::before 在子节点最前面,::after 在最后面
  3. 默认显示方式生成的内容默认是行内元素,可以改成块级

::before 和 ::after 生成的内容不在 DOM 里,querySelector 选不到,屏幕阅读器对它们的读取也不一致。不要用它们放重要的文字信息。

核心回答

先记住这个答案

::before 和 ::after 是伪元素,分别在元素内容的最前面和最后面插入一个虚拟的子节点。这个子节点的内容由 content 属性决定。如果不写 content,伪元素根本不会渲染——这是最常犯的错误。content 可以是字符串、attr() 读取属性值、url() 插入图片、CSS 计数器,甚至可以组合多个值。

  • 没有 content 属性就不渲染
  • content: "" 常用于装饰性用途
  • <img> 和 <input> 上无效
  • 生成内容会影响元素尺寸

content 的各种值

content 最简单的用法是写一个字符串,比如在必填项标签后面加红色星号。但它还有很多其他能力。

字符串和 attr()CSS
/* 必填项标签后面加星号 */
.required::after {
  content: " *";
  color: red;
}

/* 读取 data 属性作为内容 */
a[href]::after {
  content: " (" attr(href) ")";
  font-size: 0.8em;
  color: gray;
}

/* 空字符串,用于纯装饰 */
.icon::before {
  content: "";
  display: inline-block;
  width: 16px;
  height: 16px;
  background: url(icon.svg);
}

content: "" 看起来什么都没插入,但伪元素确实渲染了。这时可以给它设置宽高和背景图,当作一个装饰性的图标用。这是用 ::before 做图标最常见的写法。 attr() 函数读取元素上的 HTML 属性。打印页面时经常用 a::after { content: " (" attr(href) ")"; } 把链接地址显示出来,因为纸上看不到超链接。

对元素尺寸的影响

::before 和 ::after 生成的内容是元素的子节点,会参与布局计算。如果 content 是一段文字,它会撑大容器;如果设置了固定宽高,它会占据空间。

比如经典的 clearfix 写法就是利用 ::after 插入一个空的块级元素来清除浮动。

clearfix 原理CSS
/* 清除浮动 */
.clearfix::after {
  content: "";
  display: block;
  clear: both;
}

这里 content: "" 生成了一个空的内容节点,display: block 让它独占一行,clear: both 让它排在所有浮动元素下面。父容器的高度就被这个伪元素撑开了。 现在用 Flexbox 和 Grid 布局已经不太需要 clearfix 了,但面试经常考到它的原理。

用不了伪元素的情况

::before 和 ::after 不是对所有元素都有效。置换元素(replaced elements)不支持,因为它们的内容由外部资源决定,不是 CSS 能控制的。

<img>、<input>、<textarea>、<select>、<br>、<hr> 这些元素上写 ::before 或 ::after 不会有任何效果。想在输入框前面加图标,应该加在它的父容器上,而不是 <input> 本身。

另一个限制是生成的内容不在 DOM 里。document.querySelector('::before') 不会返回任何东西,用 JavaScript 也不能给伪元素添加事件监听。不过可以通过 getComputedStyle(element, '::before') 读取伪元素的样式。

回答前,多想一步

容易答错的地方

忘记写 content 属性
写了 ::before { color: red; } 但没写 content,伪元素不会渲染。即使只是想做装饰,也必须写 content: ""。这是因为 content 的默认值是 normal,对 ::before 和 ::after 来说等于 none。
用伪元素放重要的文字信息
::before 和 ::after 的内容不在 DOM 里,屏幕阅读器对它们的处理不一致,有些会读有些不读。复制文字时伪元素内容通常也不会被复制。所以重要的信息应该放在 HTML 里,伪元素只用于装饰性内容。
试着用自己的话回答

面试官还会怎么问?

content 能不能用 url() 插入图片?

可以。content: url(icon.png) 会把图片作为置换内容插入。但这样插入的图片不能用 width 和 height 控制大小,它会按原始尺寸显示。想控制大小,更好的做法是用 content: "" 加 background-image,这样可以自由设置宽高。

CSS 计数器在 content 里怎么用?

content: counter(section) ". " 可以在内容前面插入自动编号。配合 counter-reset 和 counter-increment 使用,就能实现自动编号的列表或章节标题,不需要在 HTML 里手动写数字。

before 和 after 能不能同时有多个?

不能。每个元素只能有一个 ::before 和一个 ::after。但 content 属性可以拼接多个值,比如 content: "(" counter(n) ") " attr(title),一次性输出多段内容。

从一道题,走向一组知识

把知识连起来

层叠与选择器

selection 伪元素能自定义哪些样式?有哪些限制?

::selection 改选中文本样式,::before 与 ::after 则通过 content 生成内容。

层叠与选择器

in-range 和 out-of-range 伪类适用于哪些控件?

范围校验应由 :in-range 等伪类反映状态,不能靠伪元素文字代替真实约束。

参考资料

  • CSS:层叠与选择器参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. content 的各种值
  3. 对元素尺寸的影响
  4. 用不了伪元素的情况
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑