3

我有这个:

<ol>
<li class="letter">
<li class="letter">
<li>
<li>
<li>
<li>
<li>
<li>
<li>
<li>
<li>
<li>
<li>
<li>
</ol>

我希望不属于“字母”类的前 9 个 li 元素以某种方式设置样式。所以,我的想法是,我选择那些不是“字母”类的,然后选择使用nth-of-type

li:not(.letter):nth-of-type(-n+9):before { ... }

但是,这会选择前 9 个而不考虑类,我使用的结果相同:

li:nth-child(-n+9):before { ... }

我看到了基于E:nth-of-type和进行选择的示例.c:nth-of-type。怎么就停在那里了?nth-of-type为什么我不能像关闭元素或类一样使用关闭伪类来构建选择?(或者我能以某种方式吗?)

4

1 回答 1

4

因为这里的“类型”一词:nth-of-type()特指“元素类型”,仅此而已。

即使是你看到的符合:nth-of-type()类选择器的例子也做错了。它们实际上是通过其元素类型的第 n 个兄弟而不是其类来匹配的。类选择器的意思是“只有当它有这个类时才匹配这个元素”,并且在计算兄弟姐妹时实际上并没有考虑。这就是为什么您在示例中使用两个选择器获得相同结果的原因。

使用当前的选择器规范,您无法选择与选择器的复杂组合匹配的第 n 个同级,因此在不了解或控制 HTML 结构的情况下,使用 CSS 目前无法实现您想要实现的目标。当然,如果您知道只有前两个li元素将拥有该类,那么您可以这样做

li:nth-child(n+2):nth-child(-n+9)::before { ... }

但是,如果您的 HTML 结构会有所不同,那么这并不是很有用。

:nth-match()在 Selectors 4 中针对此特定目的提出了建议,但还没有关于实现的消息。所以现在,当谈到纯 CSS 时,你不走运。

于 2013-01-08T15:25:32.480 回答