为啥第 n 个子选择器会选择这些元素?

Posted

技术标签:

【中文标题】为啥第 n 个子选择器会选择这些元素?【英文标题】:Why does the nth-child selector select these elements?为什么第 n 个子选择器会选择这些元素? 【发布时间】:2013-07-29 04:31:45 【问题描述】:

我有这个代码:

<html> 
    <head>
        <style type="text/css"> 
            * > ul li:nth-child(4n+3)  color: red; 
        </style> 
    </head>
    <body> 
        <ul>
            <li id="A" class="u">1</li> 
            <li>
                <ol> 
                    <li id="B" class="u">2.1</li>
                    <li id="C" class="g">2.2</li> 
                    <li id="D" class="u">2.3</li>
                    <li id="E" class="g">2.4</li> 
                </ol>
            </li> 
            <li id="F" class="u">3</li>
        </ul> 
    </body>
</html>

在此它选择2.33,但我不明白这是怎么发生的。

我的想法是:它同时选择相对于父元素位置奇数的两个元素。但是2.3 真的是第 3 位还是第 7 位?我真的卡住了,请帮忙。

JSFiddle Sample

【问题讨论】:

忽略多余的* &gt;,您的选择器意味着:“选择每个li,它是其父元素的4n+3th 子元素,并且是ul 元素的后代”。没有带有第 n 个子选择器的“the”父元素这样的东西。检查页面上的每个元素以查看它是否是相对于 its 父元素的第 n 个子元素。 【参考方案1】:

项目 2.3 是最里面的ol 列表中的位置 3 (n=0, 4n+3 = 3)。之所以选择它,是因为 ul li 部分选择器表示“任何ul 元素内的所有 li 元素,无论嵌套级别如何”。而nth-child 部分又添加了一个条件:“他们中的那些是他们的直系父母的第 3、第 7、第 11 等等孩子”。

【讨论】:

【参考方案2】:
* > ul li:nth-child(4n+3)

首先,这个选择器开头的* &gt; 是完全多余的(它告诉浏览器寻找一个ul,它是其他东西的孩子;其他任何东西。当然所有ul 元素都是; 如果不出意外,它们将在body 标签内)。

所以你可以删除它。它会让工作更简单,也更容易解释。

现在我们只剩下这个了:

ul li:nth-child(4n+3)

之所以选择2.33 是因为您的li 元素集都是从单个父元素ul 继承而来的。在选择器之间使用空格告诉浏览器寻找匹配的任何后代;它不关心在树下多远寻找匹配的li 元素,因此它会找到两个集合。

要回答您关于为什么2.3 不被视为集合中的第七个元素的问题,答案是CSS 将每组li 元素视为一个完全独立的组;即使选择器碰巧像您的原始选择器那样匹配了两组或更多组元素,它仍然会为每组运行一个单独的计数器,因此2.33 都被视为各自组中的第三个元素。

如果您只想选择属于ul 元素(即在层次结构中立即 在其下方),则需要使用子选择器( &gt;) 而不仅仅是一个空格。

ul > li:nth-child(4n+3)

现在这将只选择外部的 li 元素集,因此只会选择您的 3 元素。

希望这有助于解释事情。

顺便说一句,您可能会发现这很有用:CSS '>' selector; what is it?

【讨论】:

【参考方案3】:

这是相对于父级完成的:

#B = 索引 0

#C = 索引 1

#D = 索引 2

#E = 索引 3

-

4n 表示 4 乘以项目的索引

+ 3当然是加3——意思是:

-

#B = 索引 0 = 4x0 = 0 + 3 = 3(第三个元素 - 索引 2)

#C = 索引 1 = 4x1 = 4 + 3 = 7(第 7 个元素 - 索引 6)

#D = 索引 2 = 4x2 = 8 + 3 = 11(第 11 个元素 - 索引 10)

#E = 索引 3 = 4x3 = 12 + 3 = 15(第 15 个元素 - 索引 14)

【讨论】:

"4n 表示 4 乘以项目的索引" 不确定这部分。这意味着每 4 个元素。 @Anar 同样的事情,但我的解释更容易可视化和计算(个人) 其实是这样,从来没想过。感谢您提供不同的观点。

以上是关于为啥第 n 个子选择器会选择这些元素?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 jQuery UI 的日期选择器会与动态 DOM 发生冲突?

css3有没有除第一个子元素以外的元素的选择器

css3有没有除第一个子元素以外的元素的选择器

为啥useSelector里面的选择器会运行两次?

css选择器nth-child(1),first-child在加入别的标签,为啥会失效?这两段代

CSS结构伪类选择器