element:first-child
との違いが分からないelement:first-of-type
例えばdivがあったとします
div:first-child
→<div>
親の最初の子であるすべての要素。
div:first-of-type
→親の<div>
最初の要素であるすべての要素。<div>
まったく同じことのように思えますが、動作は異なります。
誰か説明してもらえますか?
ベストアンサー1
親要素には 1 つ以上の子要素を含めることができます。
<div class="parent">
<div>Child</div>
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
これらの子のうち、1人だけが最初になることができます。これは次のように一致します:first-child
。
<div class="parent">
<div>Child</div> <!-- :first-child -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
:first-child
との違いは、HTMLではタグ名で表される要素タイプの最初の要素に一致する:first-of-type
ことです。:first-of-type
その要素が親の最初の子ではない場合でもこれまで見てきた子要素はすべてdiv
s でしたが、これについては後ほど説明します。
今のところ、逆も成り立ちます。つまり、any:first-child
も必然的に成り立ちます:first-of-type
。ここで最初の子は最初の でもあるので、div
両方疑似クラスと型セレクタdiv
:
<div class="parent">
<div>Child</div> <!-- div:first-child, div:first-of-type -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
ここで、最初の子の型を からdiv
などの別のものに変更するとh1
、最初の子は のままですが、明らかに最初の ではなくなります。div
代わりに、最初の (そして唯一の) になります。同じ親内でこの最初の子の後にh1
他の要素がある場合、それらの要素の最初のものが と一致します。上記の例では、最初の子が に変更された後、2 番目の子が最初の になります。div
div
div:first-of-type
div
h1
<div class="parent">
<h1>Child</h1> <!-- h1:first-child, h1:first-of-type -->
<div>Child</div> <!-- div:nth-child(2), div:first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
:first-child
は と同等であることに注意してください:nth-child(1)
。
:first-child
これは、どの要素も一度に1つの子要素しか一致しないが、:first-of-type
その要素が持つ子の種類の数と同じ数の擬似クラスに一致する子を持つことができることも意味します。この例では、セレクタ.parent > :first-of-type
(擬似クラスを暗黙的に*
修飾する:first-of-type
)は、二要素は 1 つだけではありません。
<div class="parent">
<h1>Child</h1> <!-- .parent > :first-of-type -->
<div>Child</div> <!-- .parent > :first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
同じことが:last-child
およびにも当てはまります:last-of-type
。any は:last-child
必然的に でもあります:last-of-type
。なぜなら、その親内には他に 1 つの要素も続かないからです。しかし、最後の はdiv
最後の子でもあるため、 はh1
その型の最後であるにもかかわらず、最後の子にはなり得ません。
:nth-child()
と は、:nth-of-type()
任意の整数引数(:nth-child(1)
上記の例のように)で使用される場合、原理的には非常によく似た機能を果たしますが、 と が一致する要素の潜在的な数が異なる点です:nth-of-type()
。これについては、p:nth-child(2)とp:nth-of-type(2)の違いは何ですか?