Больше контроля над выбором :nth-child() с синтаксисом of S
Селекторы псевдоклассов :nth-child() и :nth-last-child()
С помощью селектора псевдокласса :nth-child() можно выбирать элементы в DOM по индексу. Используя микросинтаксис An+B, можно получить тонкий контроль над тем, какие элементы необходимо выбрать.
:nth-child(2): Выберет 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), … дочерние элементы.
Примечание: Посмотреть как логика
An+Bвлияет на выборку, можно в интерактивном:nth-childтестере.
Но выделение можно сделать более творческим, если опустить параметр A. Например:
- :nth-child(n+3)`: Выберет все дочерние элементы начиная с 3 (3, 4, 5 и так далее).
- :nth-child(-n+5)`: Выберет все дочерние элемент до 5 (1, 2, 3, 4, 5).
Объединив несколько таких выделений :nth-child(), можно выделять диапазоны элементов:
:nth-child(n+3):nth-child(-n+5): Выберет все дочерние элементы с 3 по 5 (3, 4, 5).
Используя :nth-last-child(), можно сделать аналогичные выделения, но вместо того, чтобы начинать считать с начала, начните считать с конца.
Примечание: Если хотите перейти на новый уровень, можете использовать
:nth-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 сделает своё дело.
Примеры
Например, :nth-child(2 of .highlight) выбирает второй подходящий элемент, имеющий класс .highlight. Иначе говоря: из всех дочерних элементов с классом .highlight выбирается второй.
В противоположность .highlight:nth-child(2), выбирающему элемент, имеющий класс .highlight и также являющимся вторым дочерним элементом.
В приведённом ниже примере можно увидеть эту разницу:
- Элемент, соответствующий
:nth-child(2 из .highlight), имеет розовый контур. - Элемент, соответствующий
.highlight:nth-child(2), имеет зелёный контур.
Обратите внимание, что S — это список селекторов, то есть он допускает несколько селекторов, разделённых запятой. Например, :nth-child(4 of .highlight, .sale) выбирает четвёртый элемент, который является либо .highlight, либо .sale, из набора одноуровневых элементов.
В приведённом далее примере к элементу, соответствующему :nth-child(4 из .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;
}Довольно мило, правда?