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
。
- これも最初/最後を選択するため
~
and/orによるオーバーライド+
編集
- DOM は、例に示されているものと必ずしも同じになるとは限りません。結局のところ、これは単なる例です。
- first と last
<p>
は両方とも記事の子ですが、常に直接の子であるとは限りません。つまり、 first/last<p>
と parentの間に他の要素が存在する可能性があります<article>
。 - jQueryを思い出しました。
$('main>article p:first')
そして$('main>article p:last')
jQueryからはまさに私が望むことをするでしょうが、私はCSSに制限されています.