【问题标题】:Excluding an element from nth-child pattern从第 n 个子模式中排除元素
【发布时间】:2014-03-31 19:35:12
【问题描述】:

假设我有这些元素:

<li class="class1">content</li>
<li class="class1">content</li>
<li class="class1 class2">content</li>
<li class="class1">content</li>
<li class="class1">content</li> <!-- I want nth-child(4n) to select this-->
<li class="class1">content</li>
<li class="class1">content</li>
<li class="class1">content</li>

我想使用.class1:nth-child(4n) 来选择每 4 个元素,但如果一个元素同时具有 class1class2 我不希望它包含在“每 4 个”计数中——我只是希望它被忽略。

我试过.class1:not(.class2):nth-child(4n),但它似乎不起作用。有什么想法吗?

这是一个用于实验的 JSFiddle:http://jsfiddle.net/jWxb6/2/

【问题讨论】:

  • 您是否尝试过反转? .class1:nth-child(4n):not(.class2)
  • 是的……不走运。添加了一个 JSFiddle 用于实验。
  • 您要选择的是第 5 个而不是第 4 个,因此使用 4n 将永远无法工作。
  • 由于n-th child选择了parent下的所有children,即使.class3:nth-child(4n)单独也会选择第4个列表项
  • 啊,是的,我一开始没有意识到,现在我觉得很傻。他们真的应该添加一个 :nth-of-class() 选择器。

标签: css css-selectors


【解决方案1】:

nth-child 选择器只计算任何子节点,因此.class1:nth-child(4) 表示“容器的第 4 个子元素并且 具有 class1 类”,而不是“具有该元素的第 4 个元素容器中的类'。 nth-of-type 选择器只能选择特定类型(标签名称)的元素,因此您可以例如在 dl 列表中将 dt 元素与 dd 元素分开计数。 CSS Selectors 4 草稿中有 nth-child(4 of .class1) 语法,但目前在最新版本的 Safari 中支持 only

使用大多数浏览器支持的 CSS,您可以在要从计数中排除的元素之后“重置计数器”并为列表的其余部分“启动新计数器”:

.class1:nth-child(4n) {
    list-style-type: circle;
}

.class1.class2, .class2 ~ .class1:nth-child(4n) {
    list-style-type: disc;
}
.class2 ~ .class1:nth-child(4n + 1) {
    list-style-type: circle;
}

等等(见updated fiddle)。

或者,您可以更改标记并使用不同的标签而不是类和nth-of-type

【讨论】:

  • nth-match 已被删除;它已被滚动到第 4 级选择器的第 n 个子项中。
【解决方案2】:

据我所知,纯 css 无法实现您想要完成的任务。 (如果我被证明是错误的,我会很高兴。)。但是,您可以简单地使用 jQuery 完成您想要的。这是一个工作示例:

http://jsbin.com/fumeq/2/

【讨论】:

  • ... 或 javascript。加载 jQuery 的副本(如果尚未加载)来解决此问题就像使用破坏球作为镇纸一样。
  • 当然。这里要指出的是,纯css是做不到的。否则,正如您所说,完全没有必要为这种情况加载 jQuery,而且一点也不好。
【解决方案3】:

另一种方法是 - 将元素添加为您还需要的隐藏元素。参考您的 jsfiddle,这意味着您可以像这样解决问题:

.hide{
  display:none;
}

.class2 {
    background-color: blue;
    color: white;
}

.class1:nth-child(4n):not(.class2) {
border: 1px solid red;
}

<ul>
    <li class="class1">content</li>
    <li class="class1">content</li>
      <li class="hide">helper</li>
      <li class="hide">helper</li>
      <li class="hide">helper</li>
    <li class="class1 class2">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
    <li class="class1">content</li>
</ul>

【讨论】:

    【解决方案4】:

    不是一个直接的答案,但如果你只是覆盖以前的 CSS 样式,它会起作用吗?

    .class1:nth-child(4n) { color: red; }
    .class2 { color: inherit !important; }
    

    【讨论】:

    • 这仍然选择第 4 个而不是第 5 个作为 OP 想要的
    • 我没有看到任何提到 5th 的内容?
    • 第一块代码,在 cmets I want nth-child(4n) to select this 中指向的是第五块而不是第四块
    • @Huangism 如果您阅读代码块下方的文本,您将不会看到 OP 明确指出他/她希望选择第 5 个元素而不是第 4 个元素。 OP 明确指出“如果一个元素同时具有 class1 和 class2,我不希望它包含在“每 4 个”计数中——我只是希望它被忽略。”。没有地方提到“需要选择”的第五个元素。这似乎是你所推断的,而不是 OP 所要求的。
    • @SatwikNadkarny 没有提到第五个元素,但它是需要的。当他进行 4n 时,他不会到达第五个。 4n 将始终选择第 4 个,在这种情况下,类甚至无关紧要
    【解决方案5】:

    根据我的理解,您希望选择(并设置样式)此清单中的每四个元素。但是,如果这些选定元素中的任何一个附加了一个附加类(名为“class2”或就此而言,任何类名),那么您不想对其应用任何样式。

    您可以使用纯 CSS 来做到这一点。而不是使用以下 CSS 选择器:

    .class1:not(.class2):nth-child(4n) {
        color: Blue;
    }
    

    你可以使用:

    li[class="class1"]:nth-child(4n) {
        color:Orange;
    }
    

    看到这个小提琴:http://jsfiddle.net/kLpb5/

    我希望这能解决你的问题。

    【讨论】:

    • 感谢您的回答 Satwik。实际上,我想要的是根本不计算具有 class2 的元素。例如,它们不被视为每第四条规则计算的元素之一。
    • @Huangism 我没有。我使用了我在答案中提供的链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-12
    • 2011-07-14
    • 1970-01-01
    • 2019-09-16
    相关资源
    最近更新 更多