Найти тему
Waliot

Интригующие селекторы 4-го уровня CSS

Оглавление

Вольный перевод статьи Intriguing CSS Level 4 Selectors нашим frontend разработчиком Сэмом Булатовым.

CSS селекторы массово прогрессировали на протяжении многих лет и давали все новые возможности разработчикам, для построения своих страниц. Примеры в этой статье являются частью спеки о селекторах 4го уровня CSS. Давайте рассмотрим лучше 7 интригующих селекторов, некоторые из которых я уверен вы использовали на практике.

Селекторы 4-го уровня

4-й уровень содержит знакомые псевдо-классы такие как nth-child, last-childи другие.

Спека описывает много нового, а также некоторые крайне удобные псевдо-классы и псевдо-элементы, по этой теме мы быстро разберемся в чем разница между одиночным и двойным двоеточиями.

Одиночное vs Двойного двоеточия

На данный момент, главным правилом считается: двойное двоеточие :: следует использовать вместо одиночного :, чтобы различать псевдо-классы и псевдо-элементы.

Спека W3C по псевдо-элементам

Псевдо-классы vs Псевдо-элементы

Псевдо-класс всегда начинается с одного двоеточия :, затем идет название псевдо-класса ( так называемый keyword ), далее по возможности идут круглые скобки в которые передают один или несколько аргументов ( как CSS функции )

Псевдо-классы позволяют применить стили к элементу не только по отношению к древу документа, но и по отношению внешних факторов таких как “история браузера” ( :visited, к примеру ), статус содержимого ( :checked, на определенных элементах форм ), расположение мыши ( :hover, который позволяет узнать, над элементом ли мышь или нет ) - MDN Web Docs

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

Теперь, когда мы понимаем, как все это работает давайте, уже перейдем к самому интересному.

1. :matches()

:matches() безусловно очень мощный селектор 4 уровня, но браузеры все еще дискутируют на тему поддержки этого псевдо-класса, за из исключением Safari (WebKit)

/* Chrome */
:-webkit-any(:hover, :focus, :active) {
color: #222;
}

/* Firefox */
:-moz-any(:hover, :focus, :active) {
color: #222;
}

/* Safari */
:matches(:hover, :focus, :active) {
color: #222;
}

Этот сниппет объединяет 3 состояния: :hover, :focus, :activeв один селектор, но это все равно не раскрывает полный потенциал этого псевдо-класса.

Если вы знакомы с нестингом(nesting) в препроцессорах, то вас приятно удивит, что теперь подобные вещи есть в ванильном CSS.

:matches(section, article) :matches(h1, h2, h3, h4, h5, h6) {
color: goldenrod;
}

/* равен: */
section h1,
section h2,
section h3,
section h4,
section h5,
section h6,
article h1,
article h2,
article h3,
article h4,
article h5,
article h6 {
color: goldenrod;
}

Вы даже можете объединить их вместе, что бы получить новые возможности

/* Firefox */
:-moz-any(a):-moz-any(:link, :visited) {
color: blue;
}:-moz-any(a):-moz-any(:hover, :focus, :active) {
color: red;
text-decoration: none;
}

/* Chrome */
:-webkit-any(a):-webkit-any(:link, :visited) {
color: blue;
}
:-webkit-any(a):-webkit-any(:hover, :focus, :active) {
color: red;
text-decoration: none;
}

/* Safari */
:matches(a):matches(:link, :visited) {
color: blue;
}:matches(a):matches(:hover, :focus, :active) {
color: red;
text-decoration: none;
}

Этот сниппет, эквивалентен этому:

a:link,
a:visited {
...
}

a:hover,
a:focus,
a:active {
...
}

Имейте введу, что :matches() не работает с нестингом (:matches(:matches())), так же не работает с псевдо-селектором:not (:matches(:not()), :not(:matches())).

К сожалению, поддержка этого псевдо-класса есть только в Safari, а в других браузерах поддержка до сих пор под префиксами, так же вы должны использовать разные имена одного и того же псевдо-класса плюс вендорные префиксы. Сейчас, инструменты такие как Autoprefixer не поддерживают matches(). Но не стоит беспокоиться, недавно я попросил решить эту проблему через репозиторий на GitHub.

CanIUse

2. :placeholder-shown

Тег input имеет атрибут placeholder значение, которого показывает подсказку, что нужно ввести в поле.

/* свойства для input */
:placeholder-shown {
opacity: 1; /* работает */
color: gold; /* не плоностью*/
background: blue; /* работает */
font-weight: bold; /* работает */
border: 1px solid red; /* работает */
}

/* только для placeholder текста */
::placeholder {
opacity: 1; /* работает */
color: gold; /* работает */
background: goldenrod; /* работает */
font-weight: bold; /* работает */
border: 1px solid red; /* работает */
}

Короче говоря, :placeholder-shown стилизует тег input полностью, если у него есть атрибут placeholder, в то время как псевдо-элемент ::placeholderстилизует только текст placeholder'a. Этот факт задокументирован в CSS Pseudo-Elements Module Level 4 Editors Draft.

Имейте введу :placeholder-shown это псевдо-класс (элемент в определенном состоянии), а ::placeholderпсевдо-элемент (объект который видно, но он не находится в конечном DOM)

CanIUse

:any-link представляет якорь гиперссылки

:any-link {
...
}

Для примера, в HTML5 любые <a>, <area> или <link> имеют атрибут href, выступает как эквивалент :matches(:link, :visited). Я думаю это очень своеобразный псевдо-класс и еще ожидает более лучшего названия. Поддерживается практически везде, за исключением Edge.

4. :indeterminate

Псевдо-класс :indeterminate стилизует любые элементы форм, у которых состояние (state) находится в неопределенном.

:indeterminate {
background: lime;
}

Обычно этот псевдо-класс используется для тега input типа радио или чекбокса, у которых не установлен атрибут checked.

Он так же может стилизовать, тег progress, у котого не поставлен атрибут value

CanIUse

Заметка от переводчика

Обратите внимание, что бы псевдо-класс заработал, нужно получить определенный тег, через JS и поставить свойство indeterminate в true

let input = document.querySelector('input');input.indeterminate = true;

5. :user-error

Псевдо-класс :user-error представляет, состояние не корректности тега input, но только после пользовательского взаимодействия. Например, с момента, когда пользователь попытался отправить форму и перед тем, как пользователь снова взаимодействует с элементом формы.

:user-error {
background: red;
color: red;
border: 2px solid red;
}

Поддержка, однако, ее просто нету и нет способа узнать, будет ли вообще поддержка популярных браузеров. Лучше всего будет использовать :invalidили :required, если вам нужно стилизовать ошибки в ваших формах.

:invalid {
background: red;
color: red;
border: 2px solid red;
}

6. :optional

Делает выборку любого тега input или textarea, у которого нетатрибута required. Это позволяет легко стилизовать элементы форм, которые не обязательны.

:optional {
...
}

Это один из легко описанных псевдо-классов спеки 4-го уровня. Поддерживается всеми популярными браузерами.

CanIUse

7. :scope

Псевдо-класс :scope, ограничивает стили только на той части страницы в которой был использован тег style с атрибутом scoped

<ul>
<style scoped>
:scope {
color: red;
}
</style>
<li>item 1</li>
<li>item 2</li>
<li>item 3</li>
</ul>

К сожалению, популярные браузеры не поддерживают этот псевдо-класс, или поддерживали какое то время, но потом выпилили в новых версиях.

По исследованиям, Chrome 35 и FF 55 уже не поддерживают этот псевдо-класс. Однако, было время, когда Chrome и FF поддерживали :scope.Сейчас, Chrome не поддерживает :scope, а в FF поддержка осталась за флагами (думаю и там, скоро ее уберут).

CanIUse

Заключение

Это определенно многообещающие псевдо-классы из 4 уровня спеки и еще множество других было не упомянуто. в спецификации, много еще чего может поменяться или вовсе исчезнуть, так что все зависит от разработчиков, которые следят за развитием спеки. Если у вас есть, какие либо идеи или примеры кода с перечисленными псевдо-классами, то оставляйте их в комментариях. Всем удачного кодинга !

Спецификации:

От переводчика

Очень интересный доклад на тему спек в CSS был от Антона Немцевана WSD в Минске