Безопасный каскад стилей CSS с :where
В прошлой статье из цикла #научите_меня_css мы разобрали как объединять селекторы в цепочку с помощью :is, сегодня мы продолжим тему полезных псевдоклассов и разберем :where.
Так же как и :is, :where - это прощающая функция псевдокласса, которая принимает список селекторов, разделенных запятыми, для сопоставления.
Предположим, мы хотим написать следующий селектор:
.nav-link:focus,
.nav-link:hover,
.nav-link[aria-current="page"] {}Используя :where это можно было бы написать вот так:
.nav-link:where(:focus, :hover, [aria-current="page"]) {}Когда мы разбирали псевдокласс :is, то выяснили, что подобного эффекта можно добиться вот таким кодом:
.nav-link:is(:focus, :hover, [aria-current="page"]) {}Однако, два эти варианта код не идентичны. Единственное различие между :is и :where заключается в том, что :is предполагает наивысшую специфичность из своего набора селекторов, тогда как :where всегда сводится к нулевой специфичности.
Если говорить проще, то вот это:
.nav-link {}Будет иметь такую же специфичность, что и вот это:
.nav-link:where(:focus, :hover, [aria-current="page"]) {}Интересно:
Если переходить к числам, то оба имеют 10 баллов числовой специфичности из-за класса .nav-link. Другими словами , :where не вносит никакой дополнительной специфичности в общий селектор.
Даже вот такой сложный и громоздкий селектор имеет нулевую специфичность:
:where(#id:not(.very.high.specificity).more.classes) {}Так где же это использовать?
:where - очень хорошо подходит, когда вы хотите реализовать каскад переопределений. Фактически, один из отличных вариантов использования :where заключается в объявлении значений по умолчанию, которые гарантированно всегда будут иметь минимально возможную специфичность (ноль).
Например, Элад Шехтер использует эту технику в своем modern CSS reset для определения безопасных значений по умолчанию для определенных элементов. Вот как это может выглядеть на практике:
:where(ul, ol) {
list-style: none;
}
:where(img) {
max-width: 100%;
height: auto;
}Все селекторы имеют нулевую специфичность, что позволяет переопределить их любым другим допустимым селектором позже (или даже раньше в таблице стилей!). Без необходимости искусственного увеличения специфичности этих селекторов.
Это правда, что в любом случае вы должны сначала объявлять значения по умолчанию (что-то вроде best practice), и редко вы когда-либо захотите стилизовать элементы, используя только имена тегов в другом месте вашей таблицы стилей (например, если вы используете методологию BEM). Но :where, по крайней мере, дает вам некоторый уровень уверенности в том, что определенные вами стили никогда не столкнутся с какими-либо конфликтами специфики.
На этом статья подходит к концу, надеюсь вы узнали для себя что-то новое!
Если вам хочется почитать и другие стать из рубрики #научите_меня_css, то не забывайте подписываться на мой телеграм канал и искать там по этому хештегу!
Читайте еще:
- Карточка профиля с помощью HTML & CSS
- Возможно, вы не все знаете о useState...
- Красивый курсор при помощи CSS и JavaScript