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

Источник: «More control over :nth-child() selections with the of S syntax»
Предварительно отфильтруйте набор дочерних элементов, прежде чем применять к нему логику Ab+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 of .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: Сохранение параметров запроса на второй странице