Предварительно отфильтруйте набор дочерних элементов перед применением к нему логики An+B.
Селекторы псевдоклассов :nth-child()
и :nth-last-child()
С помощью селектора псевдокласса :nth-child()
можно выбирать элементы в DOM по их индексу. Используя микросинтаксис An+B
вы получаете точный контроль над тем, какие элементы вы хотите выбрать.
-
:nth-child(2)
: выберите второго дочернего элемента. -
:nth-child(2n)
: выбрать всех четных дочерних элементов (2-й, 4-й, 6-й, 8-й и т. д.) . -
:nth-child(2n+1)
: выбрать всех нечетных детей (1-го, 3-го, 5-го, 7-го и т. д.) . -
:nth-child(5n+1)
: выберите 1-й (=(5×0)+1) , 6-й (=(5×1)+1) , 11-й (=(5×2)+1) , … дочерний элемент . -
:nth-child(5n+2)
: выберите 2-й (=(5×0)+2) , 7-й (=(5×1)+2) , 12-й (=(5×2)+2) , … дочерний элемент .
Но вы можете сделать более творческий выбор, если опустите параметр A
Например:
-
:nth-child(n+3)
: выберите каждого дочернего элемента, начиная с третьего (3-го, 4-го, 5-го и т. д.) . -
:nth-child(-n+5)
: выберите каждого дочернего элемента до пятого (1-го, 2-го, 3-го, 4-го, 5-го) .
Объедините несколько из этих вариантов :nth-child()
, и вы сможете выбирать диапазоны элементов:
-
:nth-child(n+3):nth-child(-n+5)
: выберите каждого дочернего элемента с 3-го по 5-й (3-й, 4-й, 5-й) .
Используя :nth-last-child()
вы можете делать аналогичный выбор, но вместо того, чтобы начинать отсчет с начала, вы начинаете отсчет с конца.
Предварительная фильтрация выборок с помощью синтаксиса of S
Новым в CSS Selectors Level 4 является возможность опционально передавать список селекторов в :nth-child()
и :nth-last-child()
.
:nth-child(An+B [of S]?)
:nth-last-child(An+B [of S]?)
Если указано of S
, логика An+B
применяется только к элементам, которые соответствуют данному списку селекторов S
По сути, это означает, что вы можете предварительно отфильтровать потомков до того, как An+B
сделает свое дело.
Поддержка браузера
- 111
- 111
- 113
- 9
Примеры
Например, :nth-child(2 of .highlight)
выбирает второй соответствующий элемент, имеющий класс .highlight
. Другими словами: из всех дочерних элементов класса .highlight
выберите второй.
В этом отличие от .highlight:nth-child(2)
, который выбирает элемент, имеющий класс .highlight
и являющийся вторым дочерним элементом.
В демо ниже вы можете увидеть эту разницу:
- Элемент, соответствующий
:nth-child(2 of .highlight)
имеет розовый контур. - Элемент, соответствующий
.highlight:nth-child(2)
имеет зеленый контур.
Обратите внимание, что S
— это список селекторов, что означает, что он принимает несколько селекторов, разделенных запятой. Например, :nth-child(4 of .highlight, .sale)
выбирает четвертый элемент .highlight
или .sale
из набора дочерних элементов.
В приведенной ниже демонстрации элемент, соответствующий :nth-child(4 of .highlight, .sale)
имеет оранжевый контур.
Разметка зебры, новый взгляд
Классический пример использования :nth-child()
— создание таблицы с полосками зебры. Это визуальный прием, при котором каждая строка таблицы чередует цвета. Обычно к этому относятся следующим образом:
tr:nth-child(even) {
background-color: lightgrey;
}
Хотя это прекрасно работает для статических таблиц, становится проблематичным, когда вы начинаете динамически фильтровать содержимое таблицы. Когда, например, вторая строка будет скрыта, вы получите видимую первую и третью строки, каждая из которых будет иметь одинаковый цвет фона.
Чтобы это исправить, мы можем использовать :nth-child(An+B [of S]?)
, исключив скрытые строки из логики An+B
:
tr:nth-child(even of :not([hidden])) {
background-color: lightgrey;
}
Довольно мило, правда?
Фото Маркуса Списке на Unsplash
,Предварительно отфильтруйте набор дочерних элементов перед применением к нему логики An+B.
Селекторы псевдоклассов :nth-child()
и :nth-last-child()
С помощью селектора псевдокласса :nth-child()
можно выбирать элементы в DOM по их индексу. Используя микросинтаксис An+B
вы получаете точный контроль над тем, какие элементы вы хотите выбрать.
-
:nth-child(2)
: выберите второго дочернего элемента. -
:nth-child(2n)
: выбрать всех четных дочерних элементов (2-й, 4-й, 6-й, 8-й и т. д.) . -
:nth-child(2n+1)
: выбрать всех нечетных детей (1-го, 3-го, 5-го, 7-го и т. д.) . -
:nth-child(5n+1)
: выберите 1-й (=(5×0)+1) , 6-й (=(5×1)+1) , 11-й (=(5×2)+1) , … дочерний элемент . -
:nth-child(5n+2)
: выберите 2-й (=(5×0)+2) , 7-й (=(5×1)+2) , 12-й (=(5×2)+2) , … дочерний элемент .
Но вы можете сделать более творческий выбор, если опустите параметр A
Например:
-
:nth-child(n+3)
: выберите каждого дочернего элемента, начиная с третьего (3-го, 4-го, 5-го и т. д.) . -
:nth-child(-n+5)
: выберите каждого дочернего элемента до пятого (1-го, 2-го, 3-го, 4-го, 5-го) .
Объедините несколько из этих вариантов :nth-child()
, и вы сможете выбирать диапазоны элементов:
-
:nth-child(n+3):nth-child(-n+5)
: выберите каждого дочернего элемента с 3-го по 5-й (3-й, 4-й, 5-й) .
Используя :nth-last-child()
вы можете делать аналогичный выбор, но вместо того, чтобы начинать отсчет с начала, вы начинаете отсчет с конца.
Предварительная фильтрация выборок с помощью синтаксиса of S
Новым в CSS Selectors Level 4 является возможность опционально передавать список селекторов в :nth-child()
и :nth-last-child()
.
:nth-child(An+B [of S]?)
:nth-last-child(An+B [of S]?)
Если указано of S
, логика An+B
применяется только к элементам, которые соответствуют данному списку селекторов S
По сути, это означает, что вы можете предварительно отфильтровать потомков до того, как An+B
сделает свое дело.
Поддержка браузера
- 111
- 111
- 113
- 9
Примеры
Например, :nth-child(2 of .highlight)
выбирает второй соответствующий элемент, имеющий класс .highlight
. Другими словами: из всех дочерних элементов класса .highlight
выберите второй.
В этом отличие от .highlight:nth-child(2)
, который выбирает элемент, имеющий класс .highlight
и являющийся вторым дочерним элементом.
В демо ниже вы можете увидеть эту разницу:
- Элемент, соответствующий
:nth-child(2 of .highlight)
имеет розовый контур. - Элемент, соответствующий
.highlight:nth-child(2)
имеет зеленый контур.
Обратите внимание, что S
— это список селекторов, что означает, что он принимает несколько селекторов, разделенных запятой. Например, :nth-child(4 of .highlight, .sale)
выбирает четвертый элемент .highlight
или .sale
из набора дочерних элементов.
В приведенной ниже демонстрации элемент, соответствующий :nth-child(4 of .highlight, .sale)
имеет оранжевый контур.
Разметка зебры, новый взгляд
Классический пример использования :nth-child()
— создание таблицы с полосками зебры. Это визуальный прием, при котором каждая строка таблицы чередует цвета. Обычно к этому относятся следующим образом:
tr:nth-child(even) {
background-color: lightgrey;
}
Хотя это прекрасно работает для статических таблиц, становится проблематичным, когда вы начинаете динамически фильтровать содержимое таблицы. Когда, например, вторая строка будет скрыта, вы получите видимую первую и третью строки, каждая из которых будет иметь одинаковый цвет фона.
Чтобы это исправить, мы можем использовать :nth-child(An+B [of S]?)
, исключив скрытые строки из логики An+B
:
tr:nth-child(even of :not([hidden])) {
background-color: lightgrey;
}
Довольно мило, правда?
Фото Маркуса Списке на Unsplash