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-child
and :first-of-type
is yang :first-of-type
akan 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 div
s, tapi bersabarlah, saya akan membahasnya sebentar lagi.
Untuk saat ini, kebalikannya juga berlaku: apapun :first-child
juga :first-of-type
karena 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 div
lain, 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 div
elemen lain yang mengikuti anak pertama ini dalam induk yang sama, elemen pertama div
akan cocok div:first-of-type
. Dalam contoh yang diberikan, anak kedua menjadi anak pertama div
setelah 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-child
itu setara dengan :nth-child(1)
.
Ini juga menyiratkan bahwa meskipun setiap elemen mungkin hanya memiliki satu elemen turunan yang cocok :first-child
pada satu waktu, elemen tersebut dapat dan akan memiliki banyak turunan yang cocok dengan :first-of-type
pseudo-class sebanyak jumlah tipe turunan yang dimilikinya. Dalam contoh kita, selektor .parent > :first-of-type
(dengan *
kualifikasi implisit yang memenuhi syarat :first-of-type
pseudo) 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-child
dan :last-of-type
: ada :last-child
juga :last-of-type
karena kebutuhan , karena sama sekali tidak ada elemen lain yang mengikutinya di dalam induknya. Namun, karena yang terakhir div
juga merupakan anak terakhir, maka h1
tidak 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)?