Статьи

Псевдоклассы CSS: стилизация элементов на основе их индекса

cssmasterthumb

Ниже приводится выдержка из нашей книги CSS Master , написанной Тиффани Б. Браун. Копии продаются в магазинах по всему миру, или вы можете купить их в электронном виде здесь .

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

  • :first-child

  • :last-child

  • :only-child

  • :nth-child()

  • :nth-last-child()

:first-child и :last-child

Как вы, вероятно, догадались по именам, псевдоклассы :first-child и :last-child позволяют выбирать элементы, которые являются первым или последним дочерним элементом узла (элемента). Как и в случае с другими псевдоклассами,: :first-child и :last-child имеют наименьшее количество побочных эффектов при оценке простым селектором.

Давайте посмотрим на HTML и CSS ниже:

 <!DOCTYPE html> <html lang="en-US"> <head> <meta charset="utf-8"> <title>:first-child and :last-child</title> <style type="text/css"> body { font: 16px / 1.5 sans-serif; } :first-child { color: #e91e63; } :last-child { color: #4caf50; } </style> </head> <body> <h2>List of fruits</h2> <ul> <li>Apples</li> <li>Bananas</li> <li>Blueberries</li> <li>Oranges</li> <li>Strawberries</li> </ul> </body> </html> 

Вы можете увидеть, как это выглядит на рисунке ниже.

SelectorFirstChild

Потому что :first-child неквалифицирован, и элемент h2 и первый элемент li ярко-розового цвета. В конце концов, h2 — первый дочерний элемент body , а li — первый дочерний элемент элемента ul . Но почему остальные элементы li зеленые? Что ж, это потому, что :last-child также не имеет квалификации, а ul — последний ребенок body . По сути, мы набрали *:first-child и *:last-child .

Если мы квалифицируем :first-child и :last-child , добавив простой селектор, все это имеет больше смысла. Давайте ограничим наш выбор элементами списка. Изменение :first-child на li:first-child и :last-child на li:last-child . изображение ниже показывает результат.

SelectorFirstChild2

:nth-child() и :nth-last-child()

Возможность выбора первого и последнего потомков документа в порядке. Но что, если мы хотим выбрать нечетные или четные элементы? Возможно, мы бы хотели выбрать шестой элемент в поддереве документа или применить стили к каждому третьему элементу. Здесь вступают в игру псевдоклассы :nth-child() и :nth-last-child() .

Например :not() :nth-child() и :nth-last-child() также являются функциональными псевдоклассами. Они принимают один аргумент, который должен быть либо:

  • odd ключевое слово

  • even ключевое слово

  • целое число, такое как 2 или 8, или

  • аргумент в форме An + B [5] где A — интервал шага, B — смещение, а n — переменная, представляющая положительное целое число.

Этот последний пункт имеет степень сложности. Мы вернемся к этому через минуту.

В чем разница между :nth-child() и :nth-last-child() ? Начальная точка:: :nth-child() считает вперед, а :nth-last-child() считает назад. Индексы CSS используют подсчет числа и начинаются с одного, а не с нуля.

Оба :nth-child() и :nth-last-child() полезны для чередующихся шаблонов. Создание полосок таблицы с цветами зебры — идеальный вариант использования. Приведенный ниже CSS дает четным строкам таблицы четкий голубовато-серый фон, результат которого можно увидеть на рисунке ниже:

 tr:nth-child(even) { background: rgba(96, 125, 139, 0.1); } 

SelectorNthChild1

Переключение :nth-child на :nth-last-child инвертирует эту полосу, поскольку отсчет начинается снизу, как показано ниже.

SelectorNthChild2

Как насчет того, чтобы попробовать несколько сложных примеров, используя более сложные аргументы? Начнем с документа, показанного ниже, который содержит 20 пунктов.

SelectorNthChild3

С помощью :nth-child() и :nth-last-child() мы можем выбрать одного ребенка в определенной позиции. Мы можем выбрать все дочерние элементы после определенной позиции или выбрать элементы по кратности со смещением. Давайте изменим цвет фона шестого элемента:

 .item:nth-child(6) { background: #e91e63; } 

Это дает нам результат ниже.

SelectorNthChild4

Но что, если мы хотим выбрать каждый третий элемент? Вот где появляется синтаксис An + B :

 .item:nth-child(3n) { background: #e91e63; } 

Опять же, А является шагом шага. Это почти как множитель для n , который начинается с 1. Итак, если A = 3, то 3n будет соответствовать 3-му, 6-му, 9-му и т. Д. Элементам. Это именно то, что происходит, как вы можете видеть ниже.

SelectorNthChild5

Здесь дела становятся немного интереснее. Мы можем использовать :nth-child() и :nth-last-child() чтобы выбрать все элементы после определенной точки. Давайте попробуем выбрать все, кроме первых семи элементов:

 .item:nth-child(n+8) { background: #e91e63; } 

Здесь нет значения шага. В результате n+8 соответствует каждому элементу n, начиная с восьмого элемента, как показано ниже.

SelectorNthChild6

Примечание: отрицательные смещения

Отрицательные значения смещения и диапазона также действительны. Использование :nth-child(-n+8) инвертирует наш выбор и будет соответствовать первым восьми элементам.

Мы также можем использовать значения смещения и шага, чтобы выбрать каждый третий элемент, начиная с пятого:

 .item:nth-child(3n+5) { background: #e91e63; } 

Вы можете увидеть результаты этого селектора ниже.

SelectorNthChild7

:единственный ребенок

Псевдокласс :only-child сопоставляет элементы, если они являются единственным дочерним элементом другого элемента. Ниже приведены два неупорядоченных списка. Первый содержит один элемент, а второй содержит три:

 <ul> <li>Apple</li> </ul> <ul> <li>Orange</li> <li>Banana</li> <li>Raspberry</li> </ul> , <ul> <li>Apple</li> </ul> <ul> <li>Orange</li> <li>Banana</li> <li>Raspberry</li> </ul> 

Использование li:only-child{color: #9c27b0;} выберет <li>Apple</li> , поскольку это единственный дочерний li:only-child{color: #9c27b0;} нашего первого списка. Однако ни один из элементов во втором списке не соответствует, потому что есть три родных брата. Вы можете увидеть, как это выглядит ниже.

SelectorOnlyChild

: пустой

Также можно выбрать элементы, у которых нет потомков, используя псевдокласс :empty . Теперь, когда мы говорим :empty , мы имеем в виду пусто . Чтобы элемент соответствовал псевдоклассу :empty , он не может содержать ничего, даже пробела. Другими словами, <p></p> будет соответствовать, но <p> </p> не будет.

Иногда редакторы WYSIWYG («Что видишь, то и получаешь») вставляют пустые элементы p в ваш контент. Вы можете использовать :empty в сочетании с псевдоклассом :not() чтобы избежать применения стилей к этим элементам; например, p:not(:empty) .

Выбор элементов определенного типа по их индексу

Псевдоклассы, обсуждаемые в предыдущем разделе, соответствуют элементам, если они занимают заданную позицию в поддереве документа. Например, p:nth-last-child(2) выбирает каждый элемент p который является ближайшим к последнему элементу его родителя.

В этом разделе мы обсудим типизированные дочерние индексированные псевдоклассы . Эти псевдоклассы также сопоставляют элементы в зависимости от значения их индексов; однако совпадения ограничены элементами определенного типа. Например, выбор пятого p элемента или четного h2 элемента.

Существует пять таких псевдоклассов с именами, которые отражают имена их нетипизированных аналогов:

  • :first-of-type

  • :last-of-type

  • :only-of-type

  • :nth-of-type()

  • :nth-last-of-type()

Разница между этими псевдоклассами и индексированными дочерними объектами является тонкой. Если p:nth-child(5) соответствует пятому элементу, только если это элемент p , p:nth-of-type(5) соответствует всем элементам p , а затем находит пятый элемент p среди них.

Давайте начнем с немного другого документа. Он по-прежнему содержит 20 элементов, но некоторые из них являются p элементами, а некоторые — элементами div . Элементы p имеют закругленные углы, как видно ниже.

NthOfType1

Использование :first-of-type :last-of-type и :only-type

С помощью :first-of-type мы можем выбрать первый элемент, который соответствует селектору. Как насчет того, чтобы мы дали нашему первому элементу p светло-зеленый фон:

 p:first-of-type { background: #cddc39; } 

Это будет соответствовать каждому элементу p который является первым элементом p его родителя, как показано ниже.

NthOfType2

Псевдокласс :last-of-type работает аналогично, сопоставляя последний такой элемент своего родителя, как показано ниже. Однако :only-of-type будет соответствовать элементу, если это единственный дочерний элемент этого типа его родителя, как показано ниже.

NthOfType3

NthOfType4

Давайте рассмотрим другой пример использования :first-of-type , но на этот раз с псевдоэлементом. Помните псевдоэлемент ::first-letter ранее в этой главе? Ну, как вы видели, он создал начальный капитал для каждого элемента, к которому он был применен. Как насчет того, чтобы мы пошли еще дальше и ограничили этот начальный капитал первым параграфом:

 p:first-of-type::first-letter { font: bold italic 3em / .5 serif; color: #3f51b5; } 

Как показано на рисунке ниже, теперь у нашего абзаца будет начальный капитал, даже если ему предшествует заголовок.

NthOfType5

Использование :nth-of-type и :nth-last-of-type

Функции :nth-of-type() и :nth-last-of-type() также являются функциональными псевдоклассами. Они принимают те же аргументы, что и :nth-child() и :nth-last-child() . Но как :first-of-type и :last-of-type , индексы разрешаются в элементы того же типа. Например, чтобы выбрать первый элемент p и каждый последующий элемент p , мы можем использовать ключевое слово odd с :nth-of-type() :

 p:nth-of-type(odd) { background: #cddc39; color: #121212; } 

Как видно из рисунка ниже, это соответствует только нечетным элементам p , а не нечетным дочерним элементам.

NthOfTypeOdd

Аналогично, использование :nth-last-of-type(even) выбирает четные p элементы, но отсчет начинается с последнего p элемента в документе — в данном случае, элемента 18 (показан ниже).

NthLastTypeEven

Если это все еще кажется нечетким, поиграйте с инструментом Nth-Test Пола Малони или посмотрите примеры на Nth Master. Оба проекта являются отличным способом узнать больше об этих псевдоклассах.


[5] Этот синтаксис An + B описан в модуле синтаксиса CSS уровня 3.