Element nadrzędny może mieć jeden lub więcej elementów podrzędnych:
<div class="parent">
<div>Child</div>
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Wśród tych dzieci tylko jedno z nich może być pierwsze. Odpowiada temu :first-child
:
<div class="parent">
<div>Child</div> <!-- :first-child -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Różnica pomiędzy :first-child
i :first-of-type
polega na tym, :first-of-type
że dopasuje pierwszy element swojego typu elementu, który w HTML jest reprezentowany przez jego nazwę tagu, nawet jeśli ten element nie jest pierwszym elementem podrzędnym elementu nadrzędnego . Jak dotąd wszystkie elementy potomne, na które patrzymy, byłydiv
s, ale proszę o cierpliwość, za chwilę do tego dojdę.
Na razie prawdą :first-child
jest również odwrotność: każdy też jest:first-of-type
z konieczności. Ponieważ pierwsze dziecko jest tutaj również pierwsze div
, dopasuje zarówno pseudoklasy, jak i selektor typu div
:
<div class="parent">
<div>Child</div> <!-- div:first-child, div:first-of-type -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Teraz, jeśli zmienisz typ pierwszego dziecka z div
na coś innego, na przykład h1
, nadal będzie to pierwsze dziecko, ale div
oczywiście nie będzie już pierwszym ; zamiast tego staje się pierwszym (i jedynym) h1
. Jeśli są jakieś innediv
po tym pierwszym dziecku w obrębie tego samego rodzica elementy, pierwszy z tych div
elementów będzie pasował div:first-of-type
. W podanym przykładzie drugie dziecko staje div
się pierwszym dzieckiem po zmianie pierwszego dziecka na 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>
Zauważ, że :first-child
jest to równoważne z :nth-child(1)
.
Oznacza to również, że chociaż każdy element może mieć tylko jeden pasujący element podrzędny :first-child
na raz, może i będzie miał tyle elementów potomnych pasujących do :first-of-type
pseudoklasy, ile ma typów dzieci, które ma. W naszym przykładzie selektor .parent > :first-of-type
(z niejawną *
kwalifikacją :first-of-type
pseudo) dopasuje dwa elementy, a nie tylko jeden:
<div class="parent">
<h1>Child</h1> <!-- .parent > :first-of-type -->
<div>Child</div> <!-- .parent > :first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
To samo odnosi się do :last-child
i :last-of-type
: any :last-child
jest również z konieczności :last-of-type
, ponieważ absolutnie żaden inny element nie występuje w swoim rodzicu. Jednak ponieważ ostatnie div
jest również ostatnim dzieckiem, plikh1
nie może być ostatnim dzieckiem, mimo że jest ostatnim w swoim rodzaju.
:nth-child()
i :nth-of-type()
działają w zasadzie bardzo podobnie, gdy są używane z dowolnym argumentem będącym liczbą całkowitą (jak w :nth-child(1)
powyższym przykładzie), ale różnią się potencjalną liczbą elementów dopasowanych przez :nth-of-type()
. Jest to szczegółowo omówione w artykule Jaka jest różnica między p: nth-child (2) a p: nth-of-type (2)?