Псевдокласс CSS `:nth-child()`
Базовая поддержка Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и в разных версиях браузеров. Она доступна во всех браузерах с июля 2015 года.
:nth-child() — это CSS псевдокласс, который выбирает элементы на основе их индексов в списке дочерних элементов родителя. Иными словами, селектор :nth-child() выбирает дочерние элементы в зависимости от их положения среди всех соседних элементов внутри родительского элемента.
Попробуйте
p {
font-weight: bold;
}
li:nth-child(-n + 3) {
border: 2px solid orange;
margin-bottom: 1px;
}
li:nth-child(even) {
background-color: lightyellow;
}
<p>Track & field champions:</p> <ul> <li>Adhemar da Silva</li> <li>Wang Junxia</li> <li>Wilma Rudolph</li> <li>Babe Didrikson-Zaharias</li> <li>Betty Cuthbert</li> <li>Fanny Blankers-Koen</li> <li>Florence Griffith-Joyner</li> <li>Irena Szewinska</li> <li>Jackie Joyner-Kersee</li> <li>Shirley Strickland</li> <li>Carl Lewis</li> <li>Emil Zatopek</li> <li>Haile Gebrselassie</li> <li>Jesse Owens</li> <li>Jim Thorpe</li> <li>Paavo Nurmi</li> <li>Sergei Bubka</li> <li>Usain Bolt</li> </ul>
Примечание: В синтаксисе element:nth-child() при подсчёте дочерних элементов учитываются соседние дочерние элементы любого типа; однако совпадение засчитывается, только если элемент на этой позиции среди дочерних элементов соответствует остальным компонентам селектора.
Синтаксис
:nth-child([ <An+B> | even | odd ] [of <complex-selector-list>]?) {
/* ... */
}
Параметры
:nth-child() принимает один аргумент, описывающий шаблон для сопоставления индексов элементов в списке соседних элементов. Индексы элементов начинаются с 1.
Ключевые слова
-
odd - Обозначает элементы с нечётной числовой позицией в последовательности соседних элементов: 1, 3, 5 и т. д.
-
even - Обозначает элементы с чётной числовой позицией в последовательности соседних элементов: 2, 4, 6 и т. д.
Функциональная нотация
-
<An+B> - Обозначает элементы, числовая позиция которых в последовательности соседних элементов соответствует шаблону
An+Bдля каждого положительного целого или нулевого значенияn, где:-
A— целый шаг, -
B— целое смещение, -
n— все неотрицательные целые числа, начиная с 0.
Это можно прочитать как
An+B-й элемент списка. ИA, иBдолжны иметь значения типа<integer>. -
Синтаксис of <selector>
Передав аргумент-селектор, мы можем выбрать n-й элемент, соответствующий этому селектору. Например, следующий селектор выбирает первые три элемента списка, у которых задано class="important".
:nth-child(-n + 3 of li.important) {
}
Это отличается от выноса селектора за пределы функции, например:
li.important:nth-child(-n + 3) {
}
Этот селектор выбирает элементы списка, если они входят в число первых трёх дочерних элементов и соответствуют селектору li.important.
Примеры
Примеры селекторов
-
tr:nth-child(odd)илиtr:nth-child(2n+1) - Обозначает нечётные строки HTML-таблицы: 1, 3, 5 и т. д.
-
tr:nth-child(even)илиtr:nth-child(2n) - Обозначает чётные строки HTML-таблицы: 2, 4, 6 и т. д.
-
:nth-child(7) - Обозначает седьмой элемент.
-
:nth-child(5n) - Обозначает элементы 5 [=5×1], 10 [=5×2], 15 [=5×3], и т. д. Первым результатом формулы будет 0 [=5x0], что не даст совпадения, поскольку индексация элементов начинается с 1, а
nначинается с 0. Сначала это может показаться странным, но становится понятнее, когдаBчасть формулы равна>0, как в следующем примере. -
:nth-child(n+7) - Обозначает седьмой и все последующие элементы: 7 [=0+7], 8 [=1+7], 9 [=2+7], и т. д.
-
:nth-child(3n+4) - Обозначает элементы 4 [=(3×0)+4], 7 [=(3×1)+4], 10 [=(3×2)+4], 13 [=(3×3)+4], и т. д.
-
:nth-child(-n+3) - Обозначает первые три элемента. [=-0+3, -1+3, -2+3]
-
p:nth-child(n) - Обозначает каждый элемент
<p>в группе соседних элементов. Этот селектор выбирает те же элементы, что и простой селекторp(хотя и обладает большей специфичностью). -
p:nth-child(1)илиp:nth-child(0n+1) - Обозначает каждый
<p>, который является первым элементом в группе соседних элементов. Это то же самое, что селектор:first-child(и у него такая же специфичность). -
p:nth-child(n+8):nth-child(-n+15) - Обозначает элементы
<p>с восьмого по пятнадцатый в группе соседних элементов.
Подробный пример
HTML
<h3> <code>span:nth-child(2n+1)</code>, WITHOUT an <code><em></code> among the child elements. </h3> <p>Children 1, 3, 5, and 7 are selected.</p> <div class="first"> <span>Span 1!</span> <span>Span 2</span> <span>Span 3!</span> <span>Span 4</span> <span>Span 5!</span> <span>Span 6</span> <span>Span 7!</span> </div> <br /> <h3> <code>span:nth-child(2n+1)</code>, WITH an <code><em></code> among the child elements. </h3> <p> Children 1, 5, and 7 are selected.<br /> 3 is used in the counting because it is a child, but it isn't selected because it isn't a <code><span></code>. </p> <div class="second"> <span>Span!</span> <span>Span</span> <em>This is an `em`.</em> <span>Span</span> <span>Span!</span> <span>Span</span> <span>Span!</span> <span>Span</span> </div> <br /> <h3> <code>span:nth-of-type(2n+1)</code>, WITH an <code><em></code> among the child elements. </h3> <p> Children 1, 4, 6, and 8 are selected.<br /> 3 isn't used in the counting or selected because it is an <code><em></code>, not a <code><span></code>, and <code>nth-of-type</code> only selects children of that type. The <code><em></code> is completely skipped over and ignored. </p> <div class="third"> <span>Span!</span> <span>Span</span> <em>This is an `em`.</em> <span>Span!</span> <span>Span</span> <span>Span!</span> <span>Span</span> <span>Span!</span> </div>
CSS
* {
font-family: sans-serif;
}
span,
div em {
padding: 5px;
border: 1px solid tomato;
display: inline-block;
margin-bottom: 3px;
}
.first span:nth-child(2n + 1),
.second span:nth-child(2n + 1),
.third span:nth-of-type(2n + 1) {
background-color: tomato;
}
Результат
Использование «of <selector>»
В этом примере приведён маркированный список имён, некоторые из которых отмечены как примечательные с помощью class="noted". Они выделены толстой нижней границей.
HTML
<ul> <li class="noted">Diego</li> <li>Shilpa</li> <li class="noted">Caterina</li> <li>Jayla</li> <li>Tyrone</li> <li>Ricardo</li> <li class="noted">Gila</li> <li>Sienna</li> <li>Titilayo</li> <li class="noted">Lexi</li> <li>Aylin</li> <li>Leo</li> <li>Leyla</li> <li class="noted">Bruce</li> <li>Aisha</li> <li>Veronica</li> <li class="noted">Kyouko</li> <li>Shireen</li> <li>Tanya</li> <li class="noted">Marlene</li> </ul>
CSS
* {
font-family: sans-serif;
}
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
font-size: 1.2rem;
padding-left: 0;
}
li {
margin: 0.125rem;
padding: 0.25rem;
}
li {
border: 1px solid tomato;
}
.noted {
border-bottom: 5px solid tomato;
}
В следующем CSS мы выбираем чётные элементы списка, отмеченные с помощью class="noted".
li:nth-child(even of .noted) {
background-color: tomato;
border-bottom-color: seagreen;
}
Результат
У элементов с class="noted" есть толстая нижняя граница, а элементы 3, 10 и 17 имеют сплошной фон, поскольку это чётные элементы списка с class="noted".
Синтаксис «of selector» и селектор nth-child
В этом примере показаны два маркированных списка имён. В первом списке демонстрируется эффект li:nth-child(-n + 3 of .noted), а во втором — эффект li.noted:nth-child(-n + 3).
HTML
<ul class="one"> <li class="noted">Diego</li> <li>Shilpa</li> <li class="noted">Caterina</li> <li>Jayla</li> <li>Tyrone</li> <li>Ricardo</li> <li class="noted">Gila</li> <li>Sienna</li> <li>Titilayo</li> <li class="noted">Lexi</li> </ul> <ul class="two"> <li class="noted">Diego</li> <li>Shilpa</li> <li class="noted">Caterina</li> <li>Jayla</li> <li>Tyrone</li> <li>Ricardo</li> <li class="noted">Gila</li> <li>Sienna</li> <li>Titilayo</li> <li class="noted">Lexi</li> </ul>
CSS
* {
font-family: sans-serif;
}
ul {
display: flex;
flex-wrap: wrap;
list-style: none;
font-size: 1.2rem;
padding-left: 0;
}
li {
margin: 0.125rem;
padding: 0.25rem;
}
li {
border: 1px solid tomato;
}
.noted {
border-bottom: 5px solid tomato;
}
ul.one > li:nth-child(-n + 3 of .noted) {
background-color: tomato;
border-bottom-color: seagreen;
}
ul.two > li.noted:nth-child(-n + 3) {
background-color: tomato;
border-bottom-color: seagreen;
}
Результат
В первом случае стиль применяется к первым трём элементам списка с class="noted" независимо от того, являются ли они первыми тремя элементами списка.
Во втором случае стиль применяется к элементам с class="noted", если они входят в число первых трёх элементов списка.
Использование селектора «of» для исправления полосатых таблиц
Распространённый способ оформления таблиц — использовать чередование светлого и тёмного фона строк («зебру»), чтобы таблицы было проще читать и сделать их доступнее. Если строка скрыта, полосы сольются, и желаемый эффект будет нарушен. В этом примере показаны две таблицы со строкой hidden. Во второй таблице скрытые строки обрабатываются с помощью of :not([hidden]).
HTML
<table class="broken">
<thead>
<tr><th>Name</th><th>Age</th><th>Country</th></tr>
</thead>
<tbody>
<tr><td>Mamitiana</td><td>23</td><td>Madagascar</td></tr>
<tr><td>Yuki</td><td>48</td><td>Japan</td></tr>
<tr hidden><td>Tlayolotl</td><td>36</td><td>Mexico</td></tr>
<tr><td>Adilah</td><td>27</td><td>Morocco</td></tr>
<tr><td>Vieno</td><td>55</td><td>Finland</td></tr>
<tr><td>Ricardo</td><td>66</td><td>Brazil</td></tr>
</tbody>
</table>
<table class="fixed">
<thead>
<tr><th>Name</th><th>Age</th><th>Country</th></tr>
</thead>
<tbody>
<tr><td>Mamitiana</td><td>23</td><td>Madagascar</td></tr>
<tr><td>Yuki</td><td>48</td><td>Japan</td></tr>
<tr hidden><td>Tlayolotl</td><td>36</td><td>Mexico</td></tr>
<tr><td>Adilah</td><td>27</td><td>Morocco</td></tr>
<tr><td>Vieno</td><td>55</td><td>Finland</td></tr>
<tr><td>Ricardo</td><td>66</td><td>Brazil</td></tr>
</tbody>
</table>
CSS
body {
display: flex;
justify-content: space-around;
}
td {
padding: 0.125rem 0.5rem;
}
.broken > tbody > tr:nth-child(even) {
background-color: silver;
}
.fixed > tbody > tr:nth-child(even of :not([hidden])) {
background-color: silver;
}
Результат
В первой таблице используется только :nth-child(even); к третьей строке применён атрибут hidden. Поэтому в данном случае третья строка не отображается, а вторая и четвёртая строки считаются чётными — технически это так, но визуально нет.
Во второй таблице используется синтаксис «of», чтобы выбрать только tr, которые не скрыты с помощью :nth-child(even of :not([hidden])).
Оформление столбца таблицы
Чтобы оформить столбец таблицы, нельзя задать стиль для элемента <col>, поскольку ячейки таблицы не являются его дочерними элементами (в отличие от элемента строки <tr>). Псевдоклассы вроде :nth-child() удобно использовать для выбора ячеек столбца.
В этом примере для каждого столбца задаются разные стили.
HTML
<table>
<caption>Student roster</caption>
<colgroup>
<col/>
<col/>
<col/>
</colgroup>
<thead>
<tr><th>Name</th><th>Age</th><th>Country</th></tr>
</thead>
<tbody>
<tr><td>Mamitiana</td><td>23</td><td>Madagascar</td></tr>
<tr><td>Yuki</td><td>48</td><td>Japan</td></tr>
</tbody>
</table>
CSS
td {
padding: 0.125rem 0.5rem;
height: 3rem;
border: 1px solid black;
}
tr :nth-child(1) {
text-align: left;
vertical-align: bottom;
background-color: silver;
}
tbody tr :nth-child(2) {
text-align: center;
vertical-align: middle;
}
tbody tr :nth-child(3) {
text-align: right;
vertical-align: top;
background-color: tomato;
}
Результат
Спецификации
| Спецификация |
|---|
| Selectors Level 4 # nth-child-pseudo |
Совместимость с браузерами
| Компьютеры | Мобильные устройства | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox для Android | Opera Android | Safari для iOS | Samsung Internet | WebView Android | WebView для iOS | |
nth-child |
1 |
12 |
3.5 |
9.5До Opera 15 браузер Opera не обрабатывает динамически добавленные элементы для:nth-child(). |
3.1 |
18 |
4 |
10.1До Opera 15 браузер Opera не обрабатывает динамически добавленные элементы для:nth-child(). |
2 |
1.0 |
4.4 |
2 |
no_parent_required |
57 |
79 |
52 |
44 |
Нет |
57 |
52 |
43 |
Нет |
7.0 |
57 |
Нет |
of_syntax |
111 |
111 |
113 |
97 |
9 |
111 |
113 |
75 |
9 |
22.0 |
111 |
9 |
См. также
:nth-of-type():nth-last-child()-
:has(): псевдокласс для выбора родительского элемента - Псевдоклассы структуры дерева
- модуль CSS-селекторов
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Selectors/:nth-child