Псевдокласс :nth-child() | CSS справочник
CSS селекторыЗначение и применение
Псевдокласс :nth-child() позволяет выбрать дочерние элементы внутри родительского элемента в зависимости от их размещения (порядкового номера).
Применение данного псевдокласса широко распространено, он позволяет чередовать стили строк в таблицах, списках, придать стиль сочетанию дочерних элементов и так далее.
Поддержка браузерами
Селектор | Chrome | Firefox | Opera | Safari | IExplorer | Edge |
---|---|---|---|---|---|---|
:nth-child() | 4.0 | 3.5 | 9.6 | 3.2 | 9.0 | 12.0 |
CSS синтаксис:
:nth-child(номер | ключевое слово | формула) { блок объявлений; }
Версия CSS
CSS3Пример использования
Стилизация по порядковому номеру
Давайте рассмотрим пример, в котором перед Вами стоит задача изменить стиль для всех элементов, которые выделены оранжевым цветом на изображении:
Пример выбора селектора дочерних элементов.
Что общего у элементов, выделенных на изображении? А общее у них то, что они выделены оранжевым цветом. Смешно? Не думаю. Общее у них все же есть, элементы <li> являются вторыми дочерними элементами своих родителей, а элемент <h3> тоже можно посчитать, и его порядковый номер будет третьим (третий дочерний элемент своего родителя <body>). Чтобы стилизовать эти элементы, нам необходимо использовать псевдокласс :nth-child.
Перейдем к примеру:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Псевдокласс :first-child</title> <style> /* групповой селектор, который выбирает каждый третий дочерний элемент <h3> своего родителя и каждый второй элемент <li> своего родителя */h3:nth-child(3), li:nth-child(2) { background-color: orange; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <h3>Первый заголовок h3 тега body</h3> <ul> <li>один</li> <li>два</li> <li>три</li> </ul> <h3>Второй заголовок h3 тега body</h3> <article> <h3>Первый заголовок h3 тега article</h3> <ul> <li>один</li> <li>два</li> <li>три</li> </ul> </article> </body> </html>
В этом примере с использованием псевдокласса
Результат нашего примера:
Пример использования псевдоэлемента :last-child.Стилизация по ключевому слову
В качестве значения псевдокласса :nth-child() может выступать не только порядковый номер дочерних элементов, которые необходимо стилизовать, но и ключевые слова, которые могут определять целую группу элементов. В качестве ключевого слова можно использовать два значения:
- even (четные элементы)
- odd (нечетные элементы)
Стилизация элементов с использованием ключевых слов имеет очень широкое применение, так как вы с легкостью можете выбрать и стилизовать четные, либо нечетные дочерние элементы в документе.
Давайте для примера создадим две простые таблицы с разными стилевыми классами и рассмотрим наглядно разницу в применении значений ключевых слов псевдокласса :nth-child для HTML элемента <tr>, который определяет строку таблицы:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Стилизация четных и нечетных дочерних элементов</title> <style> .primer1 tr:nth-child(even) { /* стилизация четных дочерних элементов */ background-color: #AAA; /* устанавливаем цвет заднего фона */ } .primer2 tr:nth-child(odd) { /* стилизация нечетных дочерних элементов */ background-color: #AAA; /* устанавливаем цвет заднего фона */ } caption {/* селектор типа (выбираем HTML элемент <caption>) */ color: red; /* устанавливаем цвет текста */ } </style> </head> <body> <table class = "primer1"> <caption>Значение even (четные)</caption> <tr> <th>1 строка</th><th>Позиция</th><th>Количество</th> </tr> <tr> <td>2 строка</td><td></td><td></td> </tr> <tr> <td>3 строка</td><td></td><td></td> </tr> <tr> <td>4 строка</td><td></td><td></td> </tr> <tr> <td>5 строка</td><td></td><td></td> </tr> </table> <table class = "primer2"> <caption>Значение odd (нечетные)</caption> <tr> <th>1 строка</th><th>Позиция</th><th>Количество</th> </tr> <tr> <td>2 строка</td><td></td><td></td> </tr> <tr> <td>3 строка</td><td></td><td></td> </tr> <tr> <td>4 строка</td><td></td><td></td> </tr> <tr> <td>5 строка</td><td></td><td></td> </tr> </table> </body> </html>
В этом примере с использованием псевдокласса :nth-child() мы стилизовали четные строки первой таблицы (элементы <tr>) и нечетные во второй таблице.
Стилизация по простой математической формуле
Псевдокласс :nth-child() позволяет выбрать не только чётные, нечетные, или дочерние элементы с определённым порядковым номером, но и дочерние элементы, заданные по элементарной математической формуле. Давайте рассмотрим следующий селектор и разберем, что значит эта запись:
td:nth-child(4n+2) { background-color: lightblue; /* устанавливаем цвет заднего фона */ }
Этот селектор означает, что каждая четвёртая ячейка таблицы (<td>) внутри строки, начиная со второй ячейки таблицы, будет стилизована:
- 4n – каждый четвертый элемент.
- 2 – с какого элемента начинать.
В формулах допускается использование значений со знаком вычитания, но в этом как правило нет необходимости:
td:nth-child(4n-1) { background-color: lightblue; /* устанавливаем цвет заднего фона */ }
Этот селектор означает, что каждая четвёртая ячейка таблицы (<td>) внутри строки, начиная с третьей ячейки таблицы (-1 ячейки нет по объективным причинам, поэтому происходит сдвиг влево), будет стилизована:
- 4n – каждый четвертый элемент.
- -1 – с какого элемента начинать.
Давайте рассмотрим пример использования:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Стилизация дочерних элементов по математической формуле</title> <style> td, th{ /* групповым селектором выбираем заголовочные ячейки и ячейки данных */ border: 1px solid green; /* задаём сплошную границу размером 1 пиксель зеленого цвета */ width: 50px; /* устанавливаем ширину заголовочным ячейкам и ячейкам данных */ } td:nth-child(4n+2) { background-color: lightblue; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <table> <tr> <th>1</th><th>2</th><th>3</th><th>4</th><th>5</th><th>6</th><th>7</th><th>8</th><th>9</th><th>10</th><th>11</th><th>12</th><th>13</th><th>14</th> </tr> <tr> <td>2</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td> </tr> <tr> <td>3</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td> </tr> <tr> <td>4</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td> </tr> </table> </body> </html>
В этом примере с использованием псевдокласса :nth-child мы выбрали и стилизовали каждую четвёртую ячейку таблицы (<td>) внутри строки, начиная со второй ячейки таблицы.
Отличие :nth-child от :nth-of-type()
Давайте разберем еще очень важный пример, чтобы понять в чем заключается отличие псевдокласса :nth-child от псевдокласса :nth-of-type(), который выбирает каждый указанный элемент определенного типа, при этом он является дочерним элементом своего родительского элемента.
Допустим, у нас есть статья, в которой два параграфа и мы хотим стилизовать абзац №2 отлично от первого, установив задний фон цвета khaki:
<article> <p>Первый параграф </p> <p>Второй параграф</p> </article>
Допустим мы стоим перед выбором какой селектор использовать: p:nth-child(2) или p:nth-of-type(2). Попробуем проверить как работают оба варианта:
p:nth-child(2) { background-color: khaki; /* устанавливаем цвет заднего фона */ } p:nth-of-type(2) { background-color: khaki; /* устанавливаем цвет заднего фона */ }
Что не удивительно оба селектора работают для данной задачи. Но в чём разница?
Давайте рассмотрим на примере, ах да, мы добавим к нашей статье заголовок второго уровня (тег <h3>), про него мы совсем забыли:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Отличие :nth-child() от :nth-of-type()</title> <style> p:nth-of-type(2) { background-color:khaki; /* устанавливаем цвет заднего фона */ } p:nth-child(2) { background-color:khaki; /* устанавливаем цвет заднего фона */ } </style> </head> <body> <article> <h3>Заголовок второго уровня</h3> <p>Первый параграф</p> <p>Второй параграф</p> </article> </body> </html>
Сразу посмотрите на результат использования обоих селекторов в одном примере, затем будем разбираться почему так происходит:
Пример использования псевдоклассов :nth-of-type() и :nth-child().В данном примере селектор p:nth-child(2) выбирает второй дочерний элемент своего родителя, а с добавлением заголовка второго уровня (тег <h3>) порядок элементов в родительком элементе изменился и это у нас стал первый абзац, а не второй, что для нас не приемлимо. Для нашей задачи оптимальным выбором является использование селектора с псевдоклассом :nth-of-type() по той причине, что он выбирает второй элемент того же типа, а у нас количество элементов этого типа не изменилось.
CSS селекторыNth-child и nth-of-type • Про CSS
:nth-child
— один из моих самых любимых селекторов, потому что с помощью него можно делать клевые разноцветные штуки собирать элементы списка в группы произвольной длины и делать с ними разные интересные вещи: от полосатых таблиц до целых разноцветных дизайнов, и все это без необходимости задавать дополнительные классы или как-то менять разметку.
Вот простой пример полосатых таблиц:
Полоски помогают легче скользить глазами по длинной строке или столбцу, это увеличивает читабельность больших таблиц, а сделать это можно всего лишь парой строчек в CSS:
/* Горизонтальные полоски */ TR:nth-child(odd) { background: #EEE; } /* Вертикальные полоски */ TD:nth-child(odd) { background: #EEE; }
Или вот что можно сделать с обычным списком вроде такого:
<ul> <li></li> <li></li> <li></li> <li></li> <li></li> </ul>
Никаких дополнительных классов, все сделано только с помощью :nth-child
:
Вот пример разноцветного дизайна для ЖЖ, где используется этот же эффект:
Если у вас есть ЖЖ, вы можете установить этот дизайн из каталога.
Как работает nth-child()?
В круглых скобках задается размер цикла: например (3n)
выберет каждый третий элемент.
Также можно задать сдвиг вперед или назад: (3n+1)
— найдет каждый третий и сделает один шаг вперед, а (3n-2)
— два шага назад от найденого.
Если размер цикла не задан — (n)
— выберутся все элементы списка.
Если размер цикла не задан, но задано конкретное число — (5)
— выберется элемент списка с этим индексом.
nth-child
в своем цикле считает все элементы, находящиеся на одном уровне вложенности относительно родительского элемента.
Селектор работает во всех современных браузерах с поддержкой CSS3.
Примеры
:nth-child(3n)
Выбирает каждый 3-й элемент списка.
:nth-child(3n+1)
Выбирает каждый 3-й элемент списка и делает сдвиг на один шаг вперед. Таким образом можно выбрать первые элементы в каждой группе.
:nth-child(even) = :nth-child(2n)
(even)
— ключевое слово, выбирает четные элементы списка, как если бы мы задали (2n)
.
:nth-child(odd) = :nth-child(2n+1)
(odd)
— ключевое слово, выбирает нечетные элементы, как если бы мы задали (2n+1)
.
:nth-child(3n-1) = :nth-child(3n+2)
Выбирает каждый 3-й элемент списка и делает сдвиг на один шаг назад.
:nth-child(5) = :nth-child(0n+5)
Выберет 5-й элемент списка.
:nth-child(n+6)
Выберет все элементы начиная с 6-го.
:nth-child(-n+6)
Выберет 6 элементов с начала списка.
Сочетания селекторов
:nth-child(n+3):nth-child(-n+8)
Выберет элементы в диапазоне от 3 до 8-ми.
:nth-child(n+4):nth-child(even)
Выберет элементы начиная с 4-го, а потом выделит только четные из них.
:nth-child(3n+1):nth-child(even)
Выберет 1-й, 4-й, 7-й и 10-й элементы, а затем только четные из них.
:nth-child(n+3):nth-child(-n+8):nth-child(even)
Выберет элементы с 3-го по 8-й, а затем только четные из них.
nth-of-type()
Все примеры выше сделаны на основе однородного списка, но что если нам требуется выбрать, например, несколько абзацев в статье, которая содержит не только абзацы, но и заголовки?
Предположим, мы хотим покрасить нечетные абзацы, поэтому напишем что-то вроде:
P:nth-child(odd)
но результат будет каким-то странным (слева), и если попробовать написать то же самое, но без тега (справа) — сразу становится ясно почему:
:nth-child
считает все элементы, не обращая внимания на тег, хотя показывает только те, что соответствуют заданному тегу или классу.
Чтобы выбрать только абзацы, нам потребуется другой селектор — :nth-of-type
:
:nth-of-type
работает также, как :nth-child
, но считает только элементы заданного типа.
:nth-child
удобно использовать в сочетании с Sass:
С помощью :nth-child
одинаковым элементам списка заданы разноцветные рамки и разные фоновые картинки.
Используя широкие возможности этих технологий можно делать не только забавные галереи с котятами, но и прочие нарядные штуки разной степени бесполезности (нажмите Rerun, если анимация застыла):
Здесь с помощью :nth-child
элементам списка помимо разноцветных градиентов задаются также задержки воспроизведения анимации, из-за чего фигуры движутся не все вместе, а волнами.
:nth-child
— полезный селектор, который поможет добавить разнообразия однотипным элементам сайта и тем самым без особых усилий сделает страницу интереснее для визуального восприятия.
Строка №1 | ||||
Строка №2 | ||||
Строка №3 | ||||
Строка №4 | ||||
Строка №5 | ||||
Строка №1 | ||||
Строка №2 | ||||
Строка №3 | ||||
Строка №4 | ||||
Строка №5 |
Селектор CSS nth-child [Руководство 2022]
Сегодня мы изучим некоторые основы CSS. я склоняюсь к nth-child Селекторы CSS в моих статьях.
Но это заставило меня понять, что я не изучил основы использования селекторов nth-child.
Сегодня мы рассмотрим возможности этого мощного CSS-селектора на нескольких примерах.
Базовые селекторы N-го потомка
Начнем с некоторых базовых селекторов n-го потомка:
Мы можем определить, какой номер элемента мы хотим выбрать. Допустим, мы хотим выбрать третий элемент списка .
<ул>
li:nth-child(3) { цвет: зеленый; }
В результате для стилей выбирается только третий элемент:
Селектор нечетного/четного
С помощью этих атрибутов мы можем выбрать каждый нечетный или четный номер элемента.
li:nth-ребенок(нечетный) { красный цвет; }
В результате выбираются только нечетные элементы:
li:nth-child(even) { цвет синий; }
В этом примере селектор берет все четные элементы HTML и применяет стиль:
Каждый селектор x
Что-то классное, что мы можем сделать с селектором nth-child, это выбрать для каждого элемента x . Допустим, нам нужен каждый четвертый элемент:
li:nth-child(4n) { цвет: фиолетовый; }
Теперь выбран каждый 4-й дочерний элемент:
Или, если мы хотим включить первый элемент :
li:nth-child(4n + 1) { цвет: фиолетовый; }
Результат:
Мы также можем начать с второго элемента , например:
li:nth-child(4n + 2) { цвет: фиолетовый; }
Результат:
Выбрать все элементы, кроме первых x элементов
Мы даже можем использовать селектор, который выбирает все теги, кроме первых трех элементов.
li: n-й ребенок (n + 4) { цвет: бирюзовый; }
Результат:
Выбрать первое x количество элементов
Еще одна интересная вещь, которую мы можем сделать, это выбрать только первое количество x. Получим первые три элемента:
li:nth-child(-n + 3) { цвет: бирюзовый; }
Результат:
Выбрать последний элемент
Мы можем даже выбрать последний элемент.
li:последний ребенок { оранжевый цвет; }
Результат:
Мы также можем сместиться, чтобы получить предпоследний элемент списка.
li:nth-last-child(2) { оранжевый цвет; }
Результат:
Комбинирование селекторов
Мы также можем комбинировать n-дочерние селекторы!
Допустим, вы хотите получить каждое четное число из нечетного списка.
<ул>
ul:nth-child(нечетное) li:nth-child(четное) { оранжевый цвет; }
Это позволит получить все нечетные теги ul
, а затем все четные теги li
.
Результат:
Посмотрите все примеры в этом Codepen, чтобы попробовать
Поэкспериментируйте с этим Codepen.