Популярный пост
CSS псевдоклассы :nth-child и :nth-of-type
:nth-child
Псевдокласс :nth-child позволяет выбирать элементы по порядку их следования в коде.
Например, можно выбрать все четные строки таблицы и сделать ее полосатой.
Возьмем обычный список, зададим симпатичные стили его элементам и отдельно раскрасим 5ый элемент:
See the Pen aboqOvL by Websitio (@Websitio) on CodePen.
Таким образом можно выбрать несколько элементов, 5ый и 7ой:
See the Pen wvwyaGw by Websitio (@Websitio) on CodePen.
Переменная n
В общем виде значение задаётся с помощью математического выражения an+b, где a и b это целые числа, а n последовательность целых чисел от 0 и до бесконечности (0, 1, 2, 3 ....). Если браузер находит элемент с вычисленным порядковым номером, то применяет кнему указанные стили.
Рассмотрим на примере :nth-child(2n)
.
При n=0 получаем 2х0=0. Нулевых элементов нет - ничего не покрасится.
При n=1 2х1=2. Стили применятся ко второму по порядку элементу.
При n=2 2х2=4. Стили применятся к четвертому элементу.
И т.д.
Так мы получили последовательность для выбор четных элементов.
Для чётных элементов существует также специальное ключевое слово even
.
li:nth-child(even) { }
Аналогично для нечетных чисел есть специальное слово odd
или запись через счетчик n :nth-child(2n
+ 1)
n=0 получаем 2х0+1=1. 1ый элемент.
n=1 2х1+1=3. 3ий элемент.
n=2 2х2+1=5. 5ый элемент.
В примере ниже одновременно применены odd и even.
See the Pen vYBdOxb by Websitio (@Websitio) on CodePen.
Более сложные выражения
:nth-child(5n-1)
- стили применятся к каждому 5му элементу начиная с 4го
See the Pen LYPQVLB by Websitio (@Websitio) on CodePen.
Выделить все элементы кроме нескольких начальных
Если в формуле an+b задать b как большое положительное число, то элементы с номером меньше b не будут покрашены, а все остальные, начиная с номера b - будут
See the Pen rNBJVGG by Websitio (@Websitio) on CodePen.
Отрицательный n
:nth-child(-n+5)
Такая запись позволит выделить только 5 начальных элементов, а все остальные не выделять.
See the Pen ZEzrGay by Websitio (@Websitio) on CodePen.
Комбинирование выражений в :nth-child
Можно применять последовательно несколько :nth-child()
:nth-child(n+3):nth-child(-n+13)
Первая часть выражения выделит элементы с 3-го до бесконечности, вторая до 13го.
Стили применяться к элементам на пересечении этих двух множеств: от 3 до 13. Всего будут выделены 11 элементов.
See the Pen WNeMvMx by Websitio (@Websitio) on CodePen.
Комбинировать можно сколько угодно выражений. Возьмем только четные элементы из предыдущего интервала [3,13]
:nth-child(n+3):nth-child(-n+13):nth-child(odd)
See the Pen qBWxdKJ by Websitio (@Websitio) on CodePen.
Или не будем писать плохой код и переопределять цвета, а зададим 2 отдельных правила:
See the Pen eYOVNje by Websitio (@Websitio) on CodePen.
Особенность :nth-child
:nth-child
ищет лишь те элементы, которые соответствуют указанному типу селектора.
Пусть в теге p
есть дочерние элементы strong
и b
Запись strong:nth-child(even)
сработает только для тегов strong. Соответствующие номера попадающие на тег b
будут пропущены. Обратите внимание, элемент номер 8 является первым, т.е. нечетным strong'ом, но четным элементом в наборе. И к нему будет применен фон, потому что расчет идет среди всех элементов набора.
Дополнительный синтаксис of selector
При такой записи в расчете последовательности будут учитываться только те элементы, которые указаны после of
Примеры:
li:nth-child(-n + 3 of .bright)
li:nth-child(odd of li.bright)
See the Pen nth-child by Websitio (@Websitio) on CodePen.
:nth-of-type
Похож на предыдущий псевдокласс, но учитывает тип элемента
Возьмем блок и разместим в него через один теги b
и strong
. Для наглядности b
сделаем круглыми, а strong
квадратными, а нумерацию не сквозную, а по тегам.
Для начала попробуем простые выражения для псевдокласса :nth-of-type
b:nth-of-type(2)
и strong:nth-of-type(5)
В примере можно увидеть, что браузер считает только элементы указанного типа, а не все подряд как в случае с :nth-child
See the Pen pozaJYr by Websitio (@Websitio) on CodePen.
Выберем нечетные b:nth-of-type(odd)
и четные strong:nth-of-type(even)
See the Pen dybdoLE by Websitio (@Websitio) on CodePen.
Комбинированные :nth-of-type
Зададим фон нечетным b
только из первых 5ти b:nth-of-type(odd):nth-of-type(-n+5)
Зададим фон четным strong
после 5го strong:nth-of-type(even):nth-of-type(n+6)
See the Pen aboqOrR by Websitio (@Websitio) on CodePen.
Отличия :nth-child от :nth-of-type
Значения этих псевдоклассов задаются одинаково. Но нумерация элементов при использовании :nth-child
идет по всем дочерним элементам родительского блока, а при использовании :nth-of-type
расчет идет среди потомков указанного типа. На данный момент тип элемента может быть задан как селектором по тегу, так и классами, но считаться он будет по типу тега.