CSS 选择器 - 在一组相同的 class 中具有 Class 的第一个元素
CSS Selector - first element with Class in a group of same class
我在同一容器下有一个元素列表。其中一些有 class A,其他有 class B。
我正在寻找 CSS select 或 select A 组中的第一个 A 元素和 B 组中的第一个 B 元素。
示例:
<style>
.A { background: red; }
.B { background: blue; }
</style>
<ul class="list">
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">aaa</li>
<li class="item A">aaa</li>
<li class="item B">BBB</li><!-- I want to select this -->
<li class="item B">bbb</li>
<li class="item B">bbb</li>
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">aaa</li>
<li class="item A">aaa</li>
</ul>
请注意,使用伪 select 或 :first-of-type
将不起作用,因为它将 select 没有组关系的类型的第一个元素。
同样尝试使用 :first-child
将无法工作,因为它只会 select 第一个 A 元素,而不会 select 第一个 B 元素,它也不会select 第二组中的第一个 A 元素。
备注
我不认为这是“CSS selector for first element with class”的重复。
到select第一个子元素ul
,可以使用:first-child
伪class.
到select每组的第一个元素,可以使用adjacent sibling selector。
.A + .B
将 select 任何带有 class B
的元素紧跟在带有 class A
的元素之后。类似地,.B + .A
将 select 任何带有 class A
的元素紧跟在带有 class B
的元素之后
.A { background: red; }
.B { background: blue; }
.A:first-child,
.B + .A,
.A + .B {
background: yellow;
}
<ul class="list">
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
<li class="item B">BBB</li><!-- I want to select this -->
<li class="item B">BBB</li>
<li class="item B">BBB</li>
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
</ul>
如果您不知道每个 class 名称是什么(例如,在抓取时),您可以使用 JS 来查找符合您条件的组:
let list = document.querySelector('.list');
let filtered = [...list.children].filter((item) => {
let previous = item.previousElementSibling;
return !previous || [...previous.classList].join('.') !== [...item.classList].join('.');
});
console.log(filtered);
.A {
background: red;
}
.B {
background: blue;
}
<ul class="list">
<li class="item A">First AAA</li>
<!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
<li class="item B">First BBB</li>
<!-- I want to select this -->
<li class="item B">BBB</li>
<li class="item B">BBB</li>
<li class="item A">Second AAA</li>
<!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
</ul>
您还可以将您的条件限制为共享其标签名称的元素组。
我在同一容器下有一个元素列表。其中一些有 class A,其他有 class B。 我正在寻找 CSS select 或 select A 组中的第一个 A 元素和 B 组中的第一个 B 元素。
示例:
<style>
.A { background: red; }
.B { background: blue; }
</style>
<ul class="list">
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">aaa</li>
<li class="item A">aaa</li>
<li class="item B">BBB</li><!-- I want to select this -->
<li class="item B">bbb</li>
<li class="item B">bbb</li>
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">aaa</li>
<li class="item A">aaa</li>
</ul>
请注意,使用伪 select 或 :first-of-type
将不起作用,因为它将 select 没有组关系的类型的第一个元素。
同样尝试使用 :first-child
将无法工作,因为它只会 select 第一个 A 元素,而不会 select 第一个 B 元素,它也不会select 第二组中的第一个 A 元素。
备注
我不认为这是“CSS selector for first element with class”的重复。
到select第一个子元素ul
,可以使用:first-child
伪class.
到select每组的第一个元素,可以使用adjacent sibling selector。
.A + .B
将 select 任何带有 class B
的元素紧跟在带有 class A
的元素之后。类似地,.B + .A
将 select 任何带有 class A
的元素紧跟在带有 class B
.A { background: red; }
.B { background: blue; }
.A:first-child,
.B + .A,
.A + .B {
background: yellow;
}
<ul class="list">
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
<li class="item B">BBB</li><!-- I want to select this -->
<li class="item B">BBB</li>
<li class="item B">BBB</li>
<li class="item A">AAA</li><!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
</ul>
如果您不知道每个 class 名称是什么(例如,在抓取时),您可以使用 JS 来查找符合您条件的组:
let list = document.querySelector('.list');
let filtered = [...list.children].filter((item) => {
let previous = item.previousElementSibling;
return !previous || [...previous.classList].join('.') !== [...item.classList].join('.');
});
console.log(filtered);
.A {
background: red;
}
.B {
background: blue;
}
<ul class="list">
<li class="item A">First AAA</li>
<!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
<li class="item B">First BBB</li>
<!-- I want to select this -->
<li class="item B">BBB</li>
<li class="item B">BBB</li>
<li class="item A">Second AAA</li>
<!-- I want to select this -->
<li class="item A">AAA</li>
<li class="item A">AAA</li>
</ul>
您还可以将您的条件限制为共享其标签名称的元素组。