伪元素不显示的首要原因是未设置content属性;必须显式声明content(如""、"•"、attr()或url()),否则浏览器跳过渲染,其他样式无效。
content 属性有没有设伪元素(::before 和 ::after)默认不会渲染,必须显式设置 content 属性——哪怕只是

content,其他样式(比如 color、background)再全也没用,浏览器直接跳过渲染。
常见错误场景:
content: ""
width/height/background,忘了 content
content 值被 JS 覆盖或计算为空,但没 fallbackcontent 的值写法有讲究不是所有值都合法,也不是所有写法都等效。浏览器对 content 的解析很严格:
content: "" —— 最常用,生成空内容,适合纯视觉装饰content: "•" 或 content: "→" —— 显示字符,注意编码和字体支持content: attr(data-label) —— 读取元素的 HTML 属性,确保属性存在且非空content: url(./icon.svg) —— 插入图片,路径要可访问,且注意同源限制和 CORScontent: none —— 合法值,但效果是“不生成内容”,伪元素仍存在,但不可见(也无盒模型)⚠️ 错误写法:content: null、content: undefined、content: auto —— 这些都不是标准值,会被忽略,等价于没设。
即使 content 正确设置了,也可能因以下原因“看不见”:
overflow: hidden,而伪元素溢出边界被裁剪display: none 或 visibility: hidden
color: white 在白色背景上)width/height 为 0)且没内容/背景,盒子塌陷建议用浏览器开发者工具:选中元素 → 查看 “Computed” 面板,确认 content 是否解析成功,以及伪元素是否出现在 DOM 树的“::before/::after”节点下。
::before 和 ::after 在绝大多数现代浏览器中稳定支持,但仍有细节差异:
:before / :after),双冒号会失效content 中使用 attr() 读取自定义属性(如 data-* )时,Firefox 早期版本对空格/特殊字符处理较严格getComputedStyle(el, '::before') 可读样式,但无法调用 .addEventListener)content 支持有限,需避免运行时插值出非法值/* 示例:正确创建一个带边框的装饰点 */
.icon::after {
content: "";
display: inline-block;
width: 6px;
height: 6px;
background: #333;
border-radius: 50%;
margin-left: 4px;
}最常被忽略的一点:伪元素不是“自动有尺寸”的——它默认是 display: inline,且仅包裹 content 内容。如果 content 是空字符串,又没设 width/height/background 等触发盒模型的属性,那它就真的一丁点都不占空间,也看不到。