DevSkillRoad

Псевдоклассы. Часть 2

🎯 :nth-child, :not, :is, :where

Продолжаем изучать псевдоклассы. В этой части разберём более сложные и мощные инструменты для выборки элементов.

1. :nth-child() — выбор по порядковому номеру

Выбирает элементы по их порядковому номеру внутри родителя.

Возможные значения:

Пример 1: каждый второй элемент (чётные)

li:nth-child(even) {
    background-color: #f0f0f0;
}
  • Элемент 1
  • Элемент 2 (чётный)
  • Элемент 3
  • Элемент 4 (чётный)
  • Элемент 5

✅ Чётные элементы имеют серый фон

Пример 2: каждый третий элемент

li:nth-child(3n) {
    background-color: #14b8a6;
    color: white;
}
  • Элемент 1
  • Элемент 2
  • Элемент 3 (3n)
  • Элемент 4
  • Элемент 5
  • Элемент 6 (3n)

✅ Третий и шестой элементы выделены

Пример 3: первые три элемента

li:nth-child(-n+3) {
    font-weight: bold;
}
  • Элемент 1 (жирный)
  • Элемент 2 (жирный)
  • Элемент 3 (жирный)
  • Элемент 4
  • Элемент 5

✅ Первые три элемента выделены жирным

2. :nth-of-type() — выбор по типу и порядку

Отличие от :nth-child: считает только элементы одного типа (например, только <p>).

p:nth-of-type(2) {
    background-color: #14b8a6;
    color: white;
}

Заголовок

Первый абзац (не считается, потому что p)

Второй абзац (будет выделен)

Третий абзац

✅ Выбран второй <p>, не считая заголовок

📌 Разница: :nth-child считает всех детей подряд. :nth-of-type считает только элементы с таким же тегом.

3. :not() — исключение элементов

Выбирает все элементы, которые не соответствуют селектору внутри скобок.

li:not(.special) {
    opacity: 0.5;
}
  • Обычный элемент
  • Особый элемент (не изменится)
  • Обычный элемент

✅ Все элементы без класса .special стали полупрозрачными

4. :is() — группировка селекторов

Позволяет группировать селекторы, сокращая код.

Без :is() (нужно перечислять каждый селектор):

h1.special, h2.special, h3.special {
    color: #14b8a6;
}

С :is() (группируем заголовки):

:is(h1, h2, h3).special {
    color: #14b8a6;
}

Заголовок h1

Заголовок h2

Заголовок h3

Абзац (не изменится)

✅ Все заголовки с классом .special стали бирюзовыми (абзац не изменился)

5. :where() — группировка с нулевой специфичностью

Работает как :is(), но имеет нулевой вес — его легко переопределить.

:where(h1, h2, h3).special {
    color: #14b8a6;
}

Сравнение :is() и :where() на примере

Представьте, что у вас есть правило, которое должно применяться ко всем заголовкам, но потом вы хотите переопределить цвет для одного из них.

С :is() — переопределить сложнее

:is(h1, h2, h3).special {
    color: #14b8a6;  /* этот стиль имеет вес 10 (класс) */
}
h2.special {
    color: #ffc107;  /* этот стиль тоже имеет вес 10 (класс) — не перебивает */
}

С :where() — переопределить легко

:where(h1, h2, h3).special {
    color: #14b8a6;  /* этот стиль имеет вес 0 (нулевая специфичность) */
}
h2.special {
    color: #ffc107;  /* этот стиль имеет вес 10 (класс) — перебивает */
}

С :is() — второму заголовку не удалось переопределить цвет:

Заголовок h1 (бирюзовый)

Заголовок h2 (остался бирюзовым)

С :where() — второй заголовок переопределил цвет:

Заголовок h1 (бирюзовый)

Заголовок h2 (жёлтый)

✅ В примере с :is() второй заголовок остался бирюзовым. В примере с :where() второй заголовок стал жёлтым — его легче переопределить.

📌 Разница между :is() и :where():
  • :is() — имеет вес самого специфичного селектора внутри. В примере выше вес равен классу (10).
  • :where() — всегда имеет вес 0. Его легко переопределить другим правилом.
  • Когда использовать: :is() для обычной группировки, :where() когда вы точно знаете, что правило нужно будет часто переопределять.
📓 Из тетради: «:nth-child — один из самых мощных псевдоклассов. Освоите формулы — сможете выбирать любые элементы: чётные, нечётные, каждый третий, первые три, начиная с пятого. :not и :is сделают код чище. А :where пригодится в больших проектах, где важна переопределяемость стилей».