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-typepolega 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-childjest 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 divna coś innego, na przykład h1, nadal będzie to pierwsze dziecko, ale divoczywiś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 divelementów będzie pasował div:first-of-type. W podanym przykładzie drugie dziecko staje divsię 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-childjest 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-childna raz, może i będzie miał tyle elementów potomnych pasujących do :first-of-typepseudoklasy, ile ma typów dzieci, które ma. W naszym przykładzie selektor .parent > :first-of-type(z niejawną *kwalifikacją :first-of-typepseudo) 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-childi :last-of-type: any :last-childjest również z konieczności :last-of-type, ponieważ absolutnie żaden inny element nie występuje w swoim rodzicu. Jednak ponieważ ostatnie divjest 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)?