【发布时间】:2019-03-01 00:29:18
【问题描述】:
来自 W3C 标准对伪元素的定义https://www.w3.org/TR/selectors-3/#pseudo-elements:
伪元素创建关于文档树的抽象,超出了文档语言指定的那些。例如,文档语言不提供访问第一个字母或元素内容的第一行的机制。伪元素允许作者引用这些否则无法访问的信息。
(我的重点。)
为什么文档语言允许检测第一个子元素(所以:first-child 是一个css 伪类)但不是的第一个字母(所以::first-letter 是一个css 伪元素)?这个“文档语言”应该怎么理解?
本质上,问题是:为什么选择第一个元素与第一个字母有区别?为什么文档语言可以检索其中一个而不能检索另一个?
我不是在询问伪类和伪元素之间的一般区别,而是我具体询问为什么第一个字母在概念上与第一个子元素不同。其他伪元素不那么令人困惑:例如 ::after 和 ::before 是伪元素是相当明显的,因为它们与 html 结构中未定义的“空间”相关。但是第一个字母是,所以为什么这样的第一个字母仍然被区别对待的问题。
【问题讨论】:
-
如果您认为标记的欺骗的最佳答案(或任何进一步的答案)没有回答您的问题,或者如果它提出了进一步的问题,请在您的答案的编辑中详细说明,我'很乐意相应地重新提出问题。
-
@TylerH 我真的不认为这是重复的。我知道伪类和伪元素之间的区别,但我特别询问为什么第一个字母在概念上与第一个子元素不同。为什么
::after和::before例如是伪元素是相当明显的,因为它们与 html 结构中未定义的“空间”相关。但是第一个字母是,因此我的问题。 -
不,
::first-letter未在结构中定义。换句话说,你没有标签环绕第一个字母(除非你这样做,那么你不需要::first-letter)。这就是伪类和伪元素之间的区别。如果您可以使用简单的选择器(如类或元素选择器)来定位它,那么它就不是伪元素。你不能用一个简单的选择器来定位第一个字母,因为它就像试图定位一个部分内部文本片段...... CSS 不能做到这一点。这个问题被称为“裸文本”(谷歌搜索时要小心......)
标签: css css-selectors standards w3c