В прошлом для выполнения этой операции нам бы понадобился язык JavaScript. CSS3 дает нам новый псевдокласс для указания текущего элемента, т. е. элемент, чей ID-атрибут совпадает с текущим хешем в URL. Этот псевдокласс называется: target.
Давайте подсветим каждый заголовок в нашем примере полупрозрачным желтым, чтобы пользователь мог четко понимать, куда он попал на странице. Для этого мы можем использовать следующий код:
h1:target, h2:target,
h3:target, h4:target,
h5:target, h6:target {
background: hsla(65,100 %,50 %,5);
}
Указание цвета в профиле HSLA не нужно в данном случае, потому что в общем любой браузер, который поддерживает псевдокласс: target также поддерживает цвета HSLA. Старые браузеры, которые не поддерживают: target на самом деле не проблема, так как селектор улучшает юзабилити и его функциональность не ключевая. Википедия использует: target, когда вы щелкаете на сноску, подсвечивая ее в (обычно длинном) списке ссылок [51]. Это реально помогает вам быстро опознать правильную ссылку, так ведь?
Указание на элементы, основанные на их позиции в DOM (объектной модели документа)
Все это уже известно. Иногда мы хотим обратиться к нечетной строке таблицы или каждому третьему изображению на странице, или к последнему элементу в списке, или первым четырем параграфам в статье.
В CSS 2.1 у нас был только один структурный псевдокласс: first-child. CSS3 расширяет это и дает нам изобилие новых псевдоклассов, что решает не только перечисленные задачи, но и другие вопросы:
• nth-child
• last-child
• nth-last-child
• only-child
• first-of-type
• nth-of-type
• last-of-type
• nth-last-of-type
• only-of-type
Количество псевдоклассов в этом списке может испугать, но как только вы поймете возможности: nth-child и как это работает, вы легко уловите все остальные и узнаете, как это применять. Потому что это всего лишь варианты или ярлыки. Те, что начинаются с nth, представляют концепцию, которой не было в CSS 2.1: псевдоклассы с параметрами. Подобно функциям, они задают параметр, который дифференцирует их поведение, в круглых скобках. Синтаксис этого параметра может быть следующим:
• Число в: nth-child(1) равно псевдоклассу: first-child
в CSS 2.1.
• Чтобы выразить: nth-child(5) в CSS 2.1, вам нужно было бы написать: first – child + * + * + * + *
, что недопустимо многословно, особенно для больших цифр.
• Выражение типа 5n или 3n+2, где n равно любому числу от 0 до бесконечности. Например, nth-child(3n+1)
равно: nth-child(1)
, nth-child(4)
, nth-child(7)
, nth-child(10)
и т. д., с бесконечным списком.
• Одно из ключевых слов нечетное или четное, 2n+1 и 2n, соответственно.
Например, чтобы затемнить фон каждой нечетной строки таблицы, мы могли бы написать что-то наподобие:
tr: nth-child(odd) {
background: rgba(0,0,0,15);
}
Это, по существу, эффект полосок зебры, для которого мы обычно используем JavaScript.
Пожалуйста, обратите внимание на то, что разница между: nth-*
и: nth-last-*
– это чисто направление нумерации :nth-child
начинается от первого «родителя», тогда как: nth-last-child
стартует от последнего. Отсюда :last-child
по существу равен: nth-last-child(1)
, а :only-child
равен :first-child: last-child
, потому что он подходит к элементам без «братьев и сестер». Интересно то, что мы можем обобщить псевдокласс: only-child
так, что когда нам нужно обратиться к элементу ровно с пятью дочерними элементам, мы можем использовать: first-child: nth-last-child(6)
, чтобы обратиться к первому, а затем применить: first-child: nthlast– child(6) ~ *
для остальных.
Разница между псевдоклассами *-child
и *-of-type
в том, что последний поддерживает отдельный счет на тег. Например, body: first-child
никогда не совпадет, потому что body
всегда имеет заголовочный дочерний элемент, а body: first-of-type
всегда совпадает, так как у нас всего один элемент body
.
Это может быть не особо важно (не очень значимо) для позиционирования body, но чрезвычайно полезно, если мы хотим обратиться, предположим, к каждому третьему изображению в разметке, у которой переменное количество параграфов между изображениям. В этом случае псевдокласс: nth-child
рендерился бы непоследовательно, потому что он действует со всеми дочерними элементами, независимо от их типа.
Что насчет старых браузеров?
Обычно функциональные возможности, которые добавляются этими селекторами, не ключевые, так что страница обходится прекрасно и без них. Но если вам позарез нужна поддержка устаревших браузеров, тут может помочь полифил.
Читать дальше
Конец ознакомительного отрывка
Купить книгу