带有 :first-child 和 :first-letter 的令人困惑的伪元素语法

问题描述 投票:0回答:2

当我遇到一个奇怪的情况时,我正在摆弄 CSS 选择器。

如果我使用 :first-child 伪元素,我需要在它前面添加一个空格才能使其工作,如果我不这样做,它将不起作用。然而,对于 :first-letter 伪元素,情况正好相反,只有在前面没有空格的情况下它才会起作用。

我发现它非常不一致,因为它们都是伪元素。起初我以为这可能只是IE10的问题,但我检查了Chrome和Firefox,结果相同。我有什么遗漏的吗?这种行为有原因吗?

这里是重现问题的紧凑示例:

<!DOCTYPE html>
<html>
<head>
<style>
    * { color: red; }
    #article1 :first-child { color: deepskyblue; }
    article :last-child { color: darkmagenta; }
    #firstLetter:first-letter { color: darkslateblue; }
    #firstLine:first-line { color: darkslateblue; }
</style>
</head>
<body>
    <article id="article1">
        <div>E :first-child </div>
        <div>E :last-child </div>
    </article>                        
    <div id="firstLetter">:first-letter</div>
    <div id="firstLine">:first-line</div>
</body>
</html>
html css css-selectors pseudo-element
2个回答
6
投票

您的困惑来自于以下事实:

:first-child
:last-child
伪类,而不是伪元素。它们分别表示其父级的第一个和最后一个子级,但将它们附加到的元素代表 child,而不是 parent。如果愿意的话,伪类是某个元素的“描述”,就像 ID 选择器描述具有该 ID 的元素或属性选择器描述具有该属性的元素一样。因此,选择器 E:first-child 意味着
E
是其父级的第一个子级(无论该父级可能是什么),但不是
of
E 的第一个子级。

选择器

#article1:first-child

应匹配

#article1
,因为它是
body
的第一个子级,但它不会匹配作为
 
div
 的第一个子级 
#article1#article1 :first-child
div
 匹配,因为它是第一个其父级恰好是 
#article1
 的子级。
另一方面, 
:first-letter

:first-line

 可以工作,因为它们分别匹配每个元素的第一个字母和第一行 
。这就是
伪元素
的含义;一个虚拟元素(未在 DOM 中表示),作为其他元素的成员生成。 请注意,这并不意味着您可以或不能与其中之一一起使用该空间。您可以将任何组合器与任何伪类或伪元素选择器一起使用,或将其附加到另一个简单选择器链。它们只是在使用或不使用组合器时含义不同,这就是为什么您会看到不同的结果。 可以在here找到伪类与伪元素的另一种解释。

如果不需要支持 IE8 及更早版本,则应使用双冒号表示伪元素,以帮助您将它们与伪类区分开,因此使用

::first-letter

::first-line 而不是

:first-letter

:first-line
。此符号在新的
Selectors 模块
中引入。
    
:initial-letter

已在 Chrome/Edge/Safari 上可用,但尚未在 Firefox 上可用。


0
投票
https://caniuse.com/css-initial-letter

    

© www.soinside.com 2019 - 2024. All rights reserved.