如何仅针对 CSS 中选择器的第一个和最后一个匹配项?
示例(这只是一个示例,需要通用解决方案)来说明我的要求:
<style>
main>article p:first { /* to select the first p anywhere under article */ }
main>article p:last { /* to select the last p anywhere under article */ }
</style>
<main>
<article>
<section>
<p>SHOULD be selected as first element</p>
<p>SHOULD NOT be selected</p>
</section>
<ul>
<li><p>SHOULD NOT be selected</p></li>
<li><p>SHOULD NOT be selected</p></li>
</ul>
<p>SHOULD be selected as last element</p>
</article>
</main>
下的 DOM<article>
可能有<p>
子级。<p>
s(包括第一个和最后一个)不需要是<article>
虽然的直接孩子,并且可以有任何一组父母。是否有任何不必要的优雅 CSS 规则来仅选择第一个和最后一个<p>
?
不允许使用此问题的标签所指示的 JavaScript,但出于演示目的......以下代码正是我想要实现的:
var els = document.querySelectorAll('main>article p'),
first = els[0],
last = els[els.length - 1];
现在我已经尝试过使用并且对我没有用的东西:
:first-child
与,的任何选择器组合:last-child
- 无法保证可以使用任何结构来制作防故障选择器,该选择器只会选择第一个和最后
p
一个是<article>
.
- 无法保证可以使用任何结构来制作防故障选择器,该选择器只会选择第一个和最后
:first-of-type
与,的任何选择器组合:last-of-type
- 因为这也会选择第一个/最后一个
article *>p
- 特别是我尝试过
main>article p:first-of-type
和main>article p:first-of-type
.
- 因为这也会选择第一个/最后一个
- 覆盖
~
和/或+
编辑
- DOM 不一定与示例中给出的相同——毕竟这只是一个示例。
- first 和 last
<p>
都是 article 的子项,但并不总是直接子项。<p>
这意味着在 first/last和 parent之间可能还有其他元素<article>
。 - 只记得jQuery。
$('main>article p:first')
并且$('main>article p:last')
从 jQuery 中可以完全满足我的要求,但我仅限于 CSS。