伪类用于条件筛选已有元素,伪元素用于创建虚拟内容节点。伪类如:hover不添加dom节点,伪元素如::before需content属性且为浏览器渲染插入的抽象节点。

伪类选状态,伪元素造内容——不是写法差异,而是根本目的不同。
伪类是“条件筛选器”,不是新元素
伪类(如 :hover、:focus、:nth-child(2))只对已有 DOM 元素生效,它不添加任何节点,只是在特定条件下“临时启用”样式规则。比如 a:hover 不会生成新标签,只是当鼠标悬停时,让那个已存在的 <a></a> 变色。
- 一个元素可叠加多个伪类,例如
button:hover:active:focus是合法的 - 伪类顺序有影响:链接类必须按
:link→:visited→:hover→:active书写,否则:hover可能被:visited覆盖 - 结构伪类(如
:first-child)依赖真实 DOM 层级,如果父元素里第一个子节点不是目标类型(比如是注释或文本节点),就匹配失败 - 动态性高:用户交互或 JS 修改状态(如
input的checked)会实时触发/退出伪类样式
伪元素是“虚拟 DOM 节点”,必须用双冒号
伪元素(如 ::before、::first-letter)本质是浏览器渲染时插入的抽象节点,它不在 HTML 源码中,也不出现在 DevTools 的 Elements 面板里(但能在 Styles 面板看到生效)。它的作用对象是元素的“一部分”或“附加内容”,而非整个元素本身。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- CSS3 规范明确要求使用双冒号
::,单冒号:仅作为向后兼容保留(如:before虽仍可用,但::selection等新伪元素只支持双冒号) - 每个选择器最多声明一个伪元素;
::before和::after算两个独立伪元素,但不能写成p::before::after—— 语法错误 -
content是::before/::after的必需属性,值为none或字符串/计数器/图片等,缺省则不渲染 -
::first-letter和::first-line只对块级元素(如p、div)有效,对span这类内联元素无效
容易混淆的几个关键点
很多人把 :not() 当成伪元素,其实它是伪类;也有人以为 ::placeholder 是伪类,但它属于伪元素——判断依据不是冒号数量,而是它是否“创建内容”。
-
:empty是伪类:它检查元素是否无子节点(不含文本、注释、元素),不生成新内容 -
::placeholder是伪元素:它代表输入框里那行灰色提示文字,是浏览器渲染时插入的虚拟文本节点 -
:lang(en)是伪类:它基于属性值做条件匹配,不改变 DOM 结构 -
::backdrop是伪元素:用于全屏/模态框背后那层遮罩,是浏览器动态生成的覆盖层
真正要警惕的是:当你想“加图标”“改首字”“设选中色”,该用伪元素;当你想“悬停变色”“聚焦高亮”“隔行着色”,该用伪类。混用不仅语义错乱,还可能因浏览器解析逻辑不同导致样式失效。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










