如何选择具有给定类名称的第一个,第二个或第三个元素?


76

如何在元素列表中选择某个元素?我有以下内容:

<div class="myclass">my text1</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<div>
    <p>more stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<div class="myclass">my text2</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<p>
    <span>Hello World</span>
</p>
<input type=""/>
<div class="myclass">my text3</div>
<!-- some other code follows -->
<div>
    <p>stuff</p>
</div>
<footer>The end</footer>

div.myclass {doing things}很明显,我有适用于所有类的CSS类,但是我也希望能够选择.myclass此类的第一,第二或第三div ,而不管它们在标记中的位置

div.myclass:first {color:#000;} 
div.myclass:second {color:#FFF;} 
div.myclass:third {color:#006;}

几乎类似于jQuery索引选择.eq( index ),这是我当前正在使用的选择,但是我需要一个无脚本的替代方法。

具体来说,我在寻找伪选择器,而不是添加其他类或使用ID来使事情正常工作。


3
CSS的第n个子元素怎么样,您尝试过吗?注意:此功能仅在现代浏览器中有效
Sarfraz 2010年

4
该注释似乎是“ No IE”的同义词。
extraneon

1
@extraneon:是的,您说对了:)
Sarfraz 2010年

2
因为没有统一的父容器,所以这将无法工作,这就是为什么我想根据类名的出现来选择它的原因。我必须查看每个实例并找出父标记,id或类才能选择子代。这样做不会给我带来统一性,而且很难阅读,如果父对象/属性发生更改,则还需要更新。
Tumharyyaaden

1
IE 9+现在支持nth-child。
awilkinson

Answers:


32

您可能最终在发布此问题与今天之间就意识到了这一点,但是选择器的本质使其无法浏览与层次结构无关的HTML元素。

或者,简单地说,因为您在评论中说

没有统一的父容器

...仅使用选择器是不可能的,而不能像其他答案所示那样以某种方式修改标记。

必须使用jQuery.eq()解决方案。


是的,我知道css的层次结构问题,但是我希望这是一厢情愿的想法,这促使我无论如何都要发布此问题。
Tumharyyaaden

5
您不必使用jQuery的.eq()函数,只需使用普通的JavaScript就可以做到:document.querySelector(".myclass")[n]其中n是您想要的数字
Zach Saucier

5
@Zach Saucier:这是5年前。(... 4个半。)
BoltClock

5
@ZachSaucier * ahem *您在查询选择器中缺少“全部”😉–
KarelG

示例:document.querySelectorAll(“。class”)[1]
JohnP2

62

使用nth-child(项目编号)EX

<div class="parent_class">
    <div class="myclass">my text1</div>
    some other code+containers...

    <div class="myclass">my text2</div>
    some other code+containers...

    <div class="myclass">my text3</div>
    some other code+containers...
</div>
.parent_class:nth-child(1) { };
.parent_class:nth-child(2) { };
.parent_class:nth-child(3) { };

要么

:nth-​​of-type(项目编号)与您的代码相同

.myclass:nth-of-type(1) { };
.myclass:nth-of-type(2) { };
.myclass:nth-of-type(3) { };

35
-1您(以及支持此答案的每个人)似乎都误解了“其他一些代码+容器”部分。这不是字面意思。这是其他要素。如果这些元素中还有其他div元素,则选择器将完全停止工作。
BoltClock

@BoltClock,您的评论最初是误导我,直到我进一步调查为止。请在同一页面上查看我的“答案”,以演示您正在尝试指出的问题(我认为)。感谢您的专业知识。
安德鲁·威廉姆斯

15

是的,您可以这样做。例如,要设置构成表的不同列的td标签的样式,您可以执行以下操作:

table.myClass tr > td:first-child /* First column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td /* Second column */
{
  /* some style here */
}
table.myClass tr > td:first-child+td+td /* Third column */
{
  /* some style here */
}

4
也许第n个孩子是一个更好的解决方案:w3.org/TR/selectors/#nth-child-pseudo
David

17
-1问题询问关于选择一组具有类名称的不相关元素中的第n个,而不是第n个子元素。
BoltClock

13

这不是一个无答案的答案,而是一个示例,说明了为什么上面高度投票的答案之一实际上是错误的。

我认为答案看起来不错。实际上,它满足了我的需求::nth-of-type就我的情况而言,哪种方法有效。(因此,感谢@Bdwey。)

最初,我阅读了@BoltClock的评论(它说答案本质上是错误的),并将其消除了,因为我已经检查了用例,并且它起作用了。然后我意识到@BoltClock有300,000+(!)的声誉,并且拥有他声称是CSS专家的个人资料。嗯,我想,也许我应该再靠近一点。

结果如下:div.myclass:nth-of-type(2)并不意味着“ div.myclass的第二个实例”。相反,它的意思是“ div的第二个实例,并且还必须具有'myclass'类。当实例div之间存在s时,这是一个重要的区别div.myclass

我花了一些时间来解决这个问题。因此,要在帮助别人更快地算起来,我已经写了,我认为体现了概念更清晰比书面说明一个例子:我劫持了h1h2h3h4元素基本上是div秒。我A在其中一些上放了一个类,将它们分组为3,然后使用分别将第一,第二和第三实例着色为蓝色,橙色和绿色h?.A:nth-of-type(?)。(但是,如果您仔细阅读,应该问“什么的第一,第二和第三实例?”)。我也将不相似(即不同h级别)或相似(即相同h级别)的未分类元素插入到某些组中。

特别要注意的是最后一组3。这里,未分类的h3元素插入到第一和第二h3.A元素之间。在这种情况下,没有第二种颜色(即橙色)出现,并且第三种颜色(即绿色)出现在的第二个实例上h3.A。这表明nin在h3.A:nth-of-type(n)计算h3s,而不是h3.As。

好吧,希望能有所帮助。谢谢@BoltClock。

div {
  margin-bottom: 2em;
  border: red solid 1px;
  background-color: lightyellow;
}

h1,
h2,
h3,
h4 {
  font-size: 12pt;
  margin: 5px;
}

h1.A:nth-of-type(1),
h2.A:nth-of-type(1),
h3.A:nth-of-type(1) {
  background-color: cyan;
}

h1.A:nth-of-type(2),
h2.A:nth-of-type(2),
h3.A:nth-of-type(2) {
  background-color: orange;
}

h1.A:nth-of-type(3),
h2.A:nth-of-type(3),
h3.A:nth-of-type(3) {
  background-color: lightgreen;
}
<div>
  <h1 class="A">h1.A #1</h1>
  <h1 class="A">h1.A #2</h1>
  <h1 class="A">h1.A #3</h1>
</div>

<div>
  <h2 class="A">h2.A #1</h2>
  <h4>this intervening element is a different type, i.e. h4 not h2</h4>
  <h2 class="A">h2.A #2</h2>
  <h2 class="A">h2.A #3</h2>
</div>

<div>
  <h3 class="A">h3.A #1</h3>
  <h3>this intervening element is the same type, i.e. h3, but has no class</h3>
  <h3 class="A">h3.A #2</h3>
  <h3 class="A">h3.A #3</h3>
</div>


1
哈哈,我承认我的个人资料有点tongue舌...但这甚至不是我评论的答案的问题-问题在于,它完全需要“其他代码+容器...”文本从字面上看,当它显然是指其他实际的插入元素时,它们会干扰:nth-​​child()匹配项(再次看待它们,由于完全不同的原因,它们都写错了)。但是,正如您发现的那样,:nth-​​of-type()是另一种野兽...
BoltClock

1
此外,越来越多的:第n个孩子():第n-的类型(),并在我的这些其他答案任意选择:stackoverflow.com/questions/5545649/... stackoverflow.com/questions/24657555/...
BoltClock

9

也许使用CSS的“〜”选择器?

.myclass {
    background: red;
}

.myclass~.myclass {
    background: yellow;
}

.myclass~.myclass~.myclass {
    background: green;
}

参见我在jsfiddle上的示例


2
这仅适用于同级元素,而不适用于OP要求的内容(与标记无关)
Zach Saucier

1
但这在编写React Jest单元测试中很方便,因为伪选择器不起作用。因此,非常感谢Netsi1964
eon

0

将CSSnth-child与前缀类名一起使用

div.myclass:nth-child(1) {
  color: #000;
}

div.myclass:nth-child(2) {
  color: #FFF;
}

div.myclass:nth-child(3) {
  color: #006;
}

这是行不通的,并且无法回答其他答案暗示的其他评论中已经提到的问题:nth-child。如果div之间有任何元素,则会破坏您的解决方案。请考虑删除或更新您的答案。
cela

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.