Псевдоклассы. Часть 2
Продолжаем изучать псевдоклассы. В этой части разберём более сложные и мощные инструменты для выборки элементов.
1. :nth-child() — выбор по порядковому номеру
Выбирает элементы по их порядковому номеру внутри родителя.
Возможные значения:
- Число:
2(второй элемент) odd— нечётные элементыeven— чётные элементы- Формула:
2n(чётные),2n+1(нечётные),3n(каждый третий) - Формула со смещением:
n+3(с третьего элемента),-n+3(первые три)
Пример 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()— имеет вес самого специфичного селектора внутри. В примере выше вес равен классу (10).:where()— всегда имеет вес 0. Его легко переопределить другим правилом.- Когда использовать:
:is()для обычной группировки,:where()когда вы точно знаете, что правило нужно будет часто переопределять.
:nth-child — один из самых мощных псевдоклассов. Освоите формулы — сможете выбирать любые элементы: чётные, нечётные, каждый третий, первые три, начиная с пятого. :not и :is сделают код чище. А :where пригодится в больших проектах, где важна переопределяемость стилей».