Батьківський елемент може мати один або більше дочірніх елементів:
<div class="parent">
<div>Child</div>
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Серед цих дітей першим може бути лише один із них. Це відповідає :first-child
:
<div class="parent">
<div>Child</div> <!-- :first-child -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Різниця між :first-child
і :first-of-type
полягає в тому, що :first-of-type
буде відповідати першому елементу його типу елементів, який у HTML представлений його ім'ям тега, навіть якщо цей елемент не є першим дочірнім батьком . Поки що всі дочірні елементи, на які ми дивимось, вже були div
, але потерпіть мене, я трохи доїду до цього.
На сьогодні зворотне також справедливо: будь- :first-child
яке також є :first-of-type
необхідним. Оскільки перша дитина тут також є першою div
, вона буде відповідати як псевдокласам, так і селектору типів div
:
<div class="parent">
<div>Child</div> <!-- div:first-child, div:first-of-type -->
<div>Child</div>
<div>Child</div>
<div>Child</div>
</div>
Тепер, якщо ви зміните тип першої дитини div
на щось інше, наприклад h1
, воно все одно буде першою дитиною, але div
явно вже не буде першою ; натомість він стає першим (і єдиним)h1
. Якщо div
за цим першим дочірньою частиною в тому ж батьківському середовищі є якісь інші елементи, то перший з них div
буде відповідати div:first-of-type
. У наведеному прикладі друга дитина стає першою div
після зміни першої дитини на 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>
Зауважте, що :first-child
еквівалентно :nth-child(1)
.
Це також означає, що хоча будь-який елемент може одночасно мати лише один дочірній елемент :first-child
, він може і матиме стільки дітей, які відповідають :first-of-type
псевдокласу, скільки число дітей. У нашому прикладі селектор .parent > :first-of-type
(з неявним*
кваліфікацією :first-of-type
псевдо) буде відповідати двом елементам, а не лише одному:
<div class="parent">
<h1>Child</h1> <!-- .parent > :first-of-type -->
<div>Child</div> <!-- .parent > :first-of-type -->
<div>Child</div>
<div>Child</div>
</div>
Те саме стосується і :last-child
та:last-of-type
: будь-який :last-child
є необхідним також :last-of-type
, оскільки абсолютно жоден інший елемент не слідує за ним у своєму батьківському. Однак, оскільки остання div
є також останньою дитиною, вона h1
не може бути останньою дитиною, незважаючи на те, що вона була останньою.
:nth-child()
і :nth-of-type()
функціонують дуже аналогічно в принципі, коли вони використовуються з довільним цілим аргументом (як у :nth-child(1)
згаданому вище прикладі), але там, де вони відрізняються, є потенційне число елементів, узгоджене з :nth-of-type()
. Це детально висвітлено в чому різниця між p: nth-дитина (2) та p: nth-типу (2)?