Ein übergeordnetes Element kann ein oder mehrere untergeordnete Elemente haben:
<div class="parent">
<div>Child</div>
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Unter diesen Kindern kann nur eines das erste sein. Dies entspricht :first-child
:
<div class="parent">
<div>Child</div> <!-- :first-child -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Der Unterschied zwischen :first-child
und :first-of-type
besteht darin, dass :first-of-type
es mit dem ersten Element seines Elementtyps übereinstimmt, das in HTML durch seinen Tag-Namen dargestellt wird, auch wenn dieses Element nicht das erste untergeordnete Element des übergeordneten Elements ist . Bisher waren die untergeordneten Elemente, die wir betrachten, alle div
s, aber ertrage es mit mir, ich werde gleich darauf zurückkommen.
Im Moment gilt auch das Gegenteil: Jedes :first-child
ist auch :first-of-type
notwendig. Da das erste Kind hier auch das erste ist div
, entspricht es sowohl den Pseudoklassen als auch der Typauswahl div
:
<div class="parent">
<div>Child</div> <!-- div:first-child, div:first-of-type -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Wenn Sie nun den Typ des ersten Kindes von div
etwas anderem ändern h1
, ist es immer noch das erste Kind, aber es ist div
offensichtlich nicht mehr das erste . stattdessen wird es das erste (und einzige) h1
. Wenn div
diesem ersten untergeordneten Element innerhalb desselben übergeordneten Elements weitere Elemente folgen, stimmt das erste dieser div
Elemente überein div:first-of-type
. Im angegebenen Beispiel wird das zweite Kind das erste, div
nachdem das erste Kind in Folgendes geändert wurde 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>
Beachten Sie, dass dies :first-child
äquivalent zu ist :nth-child(1)
.
Dies impliziert auch, dass jedes Element möglicherweise immer nur ein einzelnes untergeordnetes Element :first-child
gleichzeitig hat, aber so viele untergeordnete Elemente haben kann und wird, die mit der :first-of-type
Pseudoklasse übereinstimmen, wie die Anzahl der Arten von untergeordneten Elementen . In unserem Beispiel entspricht der Selektor .parent > :first-of-type
(mit einer impliziten *
Qualifizierung des :first-of-type
Pseudos) zwei Elementen, nicht nur einem:
<div class="parent">
<h1>Child</h1> <!-- .parent > :first-of-type -->
<div>Child</div> <!-- .parent > :first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
Gleiches gilt für :last-child
und :last-of-type
: jedes :last-child
ist notwendigerweise auch :last-of-type
, da ihm absolut kein anderes Element innerhalb seines Elternteils folgt. Da das Letzte div
auch das letzte Kind ist, h1
kann das nicht das letzte Kind sein, obwohl es das letzte seiner Art ist.
:nth-child()
und :nth-of-type()
funktionieren im Prinzip sehr ähnlich, wenn sie mit einem beliebigen ganzzahligen Argument verwendet werden (wie im :nth-child(1)
oben erwähnten Beispiel), aber wo sie sich unterscheiden, liegt in der möglichen Anzahl von Elementen, die mit übereinstimmen :nth-of-type()
. Dies wird ausführlich in Was ist der Unterschied zwischen p: n-tem Kind (2) und p: n-tem Typ (2)?