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-childund :first-of-typebesteht darin, dass :first-of-typees 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 divs, aber ertrage es mit mir, ich werde gleich darauf zurückkommen.
Im Moment gilt auch das Gegenteil: Jedes :first-childist auch :first-of-typenotwendig. 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 divetwas anderem ändern h1, ist es immer noch das erste Kind, aber es ist divoffensichtlich nicht mehr das erste . stattdessen wird es das erste (und einzige) h1. Wenn divdiesem ersten untergeordneten Element innerhalb desselben übergeordneten Elements weitere Elemente folgen, stimmt das erste dieser divElemente überein div:first-of-type. Im angegebenen Beispiel wird das zweite Kind das erste, divnachdem 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-childgleichzeitig hat, aber so viele untergeordnete Elemente haben kann und wird, die mit der :first-of-typePseudoklasse ü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-typePseudos) 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-childund :last-of-type: jedes :last-childist notwendigerweise auch :last-of-type, da ihm absolut kein anderes Element innerhalb seines Elternteils folgt. Da das Letzte divauch das letzte Kind ist, h1kann 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)?