Elemen induk dapat memiliki satu atau lebih elemen anak:
<div class="parent">
<div>Child</div>
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Di antara anak-anak ini, hanya satu yang bisa menjadi yang pertama. Ini cocok dengan :first-child:
<div class="parent">
<div>Child</div> <!-- :first-child -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Perbedaan antara :first-childand :first-of-typeis yang :first-of-typeakan cocok dengan elemen pertama dari jenis elemennya, yang dalam HTML diwakili oleh nama tag-nya, meskipun elemen tersebut bukan anak pertama dari induknya . Sejauh ini elemen anak yang kita lihat semuanya telah divs, tapi bersabarlah, saya akan membahasnya sebentar lagi.
Untuk saat ini, kebalikannya juga berlaku: apapun :first-childjuga :first-of-typekarena kebutuhan. Karena anak pertama di sini juga yang pertama div, ini akan cocok dengan kedua pseudo-class, serta selektor tipe div:
<div class="parent">
<div>Child</div> <!-- div:first-child, div:first-of-type -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Sekarang, jika Anda mengubah jenis anak pertama dari yang divlain, seperti h1, itu akan tetap menjadi anak pertama, tetapi jelas bukan lagi yang pertama div; sebaliknya, ini menjadi yang pertama (dan satu-satunya) h1. Jika ada divelemen lain yang mengikuti anak pertama ini dalam induk yang sama, elemen pertama divakan cocok div:first-of-type. Dalam contoh yang diberikan, anak kedua menjadi anak pertama divsetelah anak pertama diubah menjadi 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>
Perhatikan bahwa :first-childitu setara dengan :nth-child(1).
Ini juga menyiratkan bahwa meskipun setiap elemen mungkin hanya memiliki satu elemen turunan yang cocok :first-childpada satu waktu, elemen tersebut dapat dan akan memiliki banyak turunan yang cocok dengan :first-of-typepseudo-class sebanyak jumlah tipe turunan yang dimilikinya. Dalam contoh kita, selektor .parent > :first-of-type(dengan *kualifikasi implisit yang memenuhi syarat :first-of-typepseudo) akan mencocokkan dua elemen, bukan hanya satu:
<div class="parent">
<h1>Child</h1> <!-- .parent > :first-of-type -->
<div>Child</div> <!-- .parent > :first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
Hal yang sama berlaku untuk :last-childdan :last-of-type: ada :last-childjuga :last-of-typekarena kebutuhan , karena sama sekali tidak ada elemen lain yang mengikutinya di dalam induknya. Namun, karena yang terakhir divjuga merupakan anak terakhir, maka h1tidak bisa menjadi anak terakhir, meskipun merupakan yang terakhir dari jenisnya.
:nth-child()dan :nth-of-type()berfungsi sangat mirip pada prinsipnya saat digunakan dengan argumen bilangan bulat arbitrer (seperti dalam :nth-child(1)contoh yang disebutkan di atas), tetapi perbedaannya terletak pada jumlah potensi elemen yang cocok :nth-of-type(). Hal ini dibahas secara rinci dalam Apa perbedaan antara p: n-anak (2) dan p: n-jenis (2)?