Больше контроля над выбором :nth-child() с синтаксисом of S

Источник: «More control over :nth-child() selections with the of S syntax»
Предварительная фильтрация набора дочерних элементов перед применением c к ним логики An+B.

Селекторы псевдоклассов :nth-child() и :nth-last-child()

С помощью селектора псевдокласса :nth-child() можно выбирать элементы в DOM по индексу. Используя микросинтаксис An+B, можно получить тонкий контроль над тем, какие элементы необходимо выбрать.

Примечание: Посмотреть как логика An+B влияет на выборку, можно в интерактивном :nth-child тестере.

Но выделение можно сделать более творческим, если опустить параметр A. Например:

Объединив несколько таких выделений :nth-child(), можно выделять диапазоны элементов:

Используя :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 и также являющимся вторым дочерним элементом.

В приведённом ниже примере можно увидеть эту разницу:

See the Pen

Обратите внимание, что S — это список селекторов, то есть он допускает несколько селекторов, разделённых запятой. Например, :nth-child(4 of .highlight, .sale) выбирает четвёртый элемент, который является либо .highlight, либо .sale, из набора одноуровневых элементов.

В приведённом далее примере к элементу, соответствующему :nth-child(4 из .highlight, .sale), применяется оранжевый контур.

See the Pen

Новый взгляд на "Зебру"

Классический пример использования :nth-child() — создание таблицы с полосами зебры. Это визуальный приём, при котором в каждой строке таблицы чередуются цвета. Обычно к этому можно подойти следующим образом:

tr:nth-child(even) {
background-color: lightgrey;
}

Хотя это прекрасно работает для статических таблиц, это становится проблематичным, когда вы переходите к динамической фильтрации содержимого таблицы. Например, если скрыть вторую строку, то в итоге будут видны первая и третья строки, каждая из которых имеет одинаковый цвет фона.

See the Pen

Чтобы это исправить, можно использовать :nth-child(An+B [of S]?), исключив скрытые строки из логики An+B:

tr:nth-child(even of :not([hidden])) {
background-color: lightgrey;
}

See the Pen

Довольно мило, правда?

Дополнительные материалы

Предыдущая Статья

PHP Enum: Руководство для начинающих

Следующая Статья

Laravel Pagination: Сохранение параметров запроса на второй странице