CSS 3 selector recommendation 对两者都很清楚,但无论如何我都会尝试展示它们的区别。
伪类
官方说明
引入伪类概念是为了允许基于位于文档树之外或无法使用其他简单选择器表达的信息进行选择。
伪类总是由一个“冒号”(:) 组成,后跟伪类的名称,还可以选择括号之间的值。
在选择器中包含的所有简单选择器序列中都允许使用伪类。在简单选择器序列中的任何位置都允许使用伪类,位于前导类型选择器或通用选择器(可能省略)之后。伪类名不区分大小写。一些伪类是互斥的,而另一些可以同时应用于同一个元素。伪类可能是动态的,从某种意义上说,当用户与文档交互时,元素可能会获取或丢失伪类。
Source
这是什么意思?
伪类的重要性质在第一句话中说明:“伪类概念[...] 允许选择”。它使样式表的作者能够根据“位于文档树之外” 的信息在元素之间进行区分,例如链接的当前状态 (:active,:visited)。这些不会保存在 DOM 中的任何位置,并且不存在访问这些选项的 DOM 接口。
另一方面,:target 可以通过 DOM 操作访问(您可以使用 window.location.hash 以便通过 JavaScript 查找对象),但是这个 “不能使用其他简单的选择器来表达”。
所以基本上一个伪类会像sequence of simple selectors 中的任何其他simple selector 一样精炼选定元素的集合。请注意,一系列简单选择器中的所有简单选择器将同时被评估。有关伪类的完整列表,请查看 CSS3 选择器推荐。
示例
以下示例将所有偶数行着色为灰色 (#ccc),将所有不能被 5 整除的不均匀行着色为白色,每隔一行着色为洋红色。
table tr:nth-child(2n) td{
background-color: #ccc;
}
table tr:nth-child(2n+1) td{
background-color: #fff;
}
table tr:nth-child(2n+1):nth-child(5n) td{
background-color: #f0f;
}
伪元素
官方说明
伪元素创建关于文档树的抽象,超出了文档语言指定的那些。例如,文档语言不提供访问元素内容的第一个字母或第一行的机制。伪元素允许作者引用这些否则无法访问的信息。伪元素还可以为作者提供一种方法来引用源文档中不存在的内容(例如,::before 和 ::after 伪元素可以访问生成的内容)。
伪元素由两个冒号 (::) 后跟伪元素的名称组成。
此:: 表示法由当前文档引入,以建立伪类和伪元素之间的区分。为了与现有样式表兼容,用户代理还必须接受之前在 CSS 级别 1 和 2 中引入的伪元素的单冒号表示法(即 :first-line、:first-letter、:before 和 :after)。本规范中引入的新伪元素不允许这种兼容性。
每个选择器只能出现一个伪元素,如果出现,它必须出现在代表选择器主题的简单选择器序列之后。
注意:本规范的未来版本可能允许每个选择器有多个伪元素。
Source
这是什么意思?
这里最重要的部分是 “伪元素允许作者引用 [..] 否则无法访问的信息”,并且它们“也可以为作者提供一种方法来引用源文档中不存在的内容(例如,::before 和 ::after 伪元素可以访问生成的内容)。”。最大的区别在于它们实际上创建了一个新的虚拟元素,可以在其上应用规则甚至伪类选择器。它们不过滤元素,它们基本上过滤内容(::first-line,::first-letter)并将其包装在一个虚拟容器中,作者可以随意设置样式(嗯,几乎)。
例如,::first-line 伪元素无法用 JavaScript 重构,因为它在很大程度上取决于当前使用的字体、字体大小、元素宽度、浮动元素(可能还有一天中的时间)。好吧,这并不完全正确:仍然可以计算所有这些值并提取第一行,但是这样做是一项非常繁琐的活动。
我猜最大的不同是“每个选择器只能出现一个伪元素”。该说明说这可能会发生变化,但截至 2012 年,我认为我们在未来不会看到任何不同的行为 (it's still in CSS4)。
示例
以下示例将使用伪类:lang 和伪元素::after 为给定页面上的每个引用添加一个语言标签:
q:lang(de)::after{
content: " (German) ";
}
q:lang(en)::after{
content: " (English) ";
}
q:lang(fr)::after{
content: " (French) ";
}
q:not(:lang(fr)):not(:lang(de)):not(:lang(en))::after{
content: " (Unrecognized language) ";
}
TL;DR
伪类充当一系列选择器中的简单选择器,从而根据非呈现特征对元素进行分类,伪元素创建新的虚拟元素。
参考文献
W3C