Кратко

  • В феврале 2018 года W3C описал ещё не названный псевдокласс с нулевой специфичностью. Ноябрьский черновик дал ему имя :where() и показал конфликт правил для ссылки.
  • Условия внутри :where() участвуют в сопоставлении элементов, но не прибавляют специфичности. Всё, что написано вне скобок, продолжает считаться обычным образом.

Начнём с двух правил. a:not(:hover) убирает подчёркивание у ссылки, над которой сейчас нет указателя. nav a возвращает подчёркивание ссылкам меню. Кажется, что второе правило можно просто поставить ниже. У CSS другой порядок счёта: псевдокласс в первом селекторе весит больше, чем добавочное имя элемента во втором. Линия не появляется. Программист тянется к новому классу, затем к ещё одному, а под конец к !important. Для одной черты под текстом это уже похоже на заседание чрезвычайной комиссии.

Черновик Selectors Level 4 от 21 ноября 2018 года разбирает именно эту пару. Общее правило записывается как a:where(:not(:hover)). Ссылки без наведения остаются выбранными, зато условие внутри :where() больше не поднимает специфичность. Наружный a сохраняет свой вес; nav a получает преимущество внутри меню. Автор общей таблицы стилей продолжает задавать исходный вид, а автор меню может менять его без игры в синтаксические мышцы.

Сначала появилась идея, затем вывеска. Текст от 2 февраля 2018 года упоминал псевдокласс типа :matches() с нулевой специфичностью, оставляя имя открытым. В ноябре в документе появилось :where(); сообщение рабочей группы CSS отдельно отметило новое название. История здесь не о том, что браузер научился находить ссылки. Он давно умел это делать. Авторам понадобился способ искать точно и не превращать точность в право навсегда диктовать внешний вид.

Селектор отвечает сразу на два вопроса: какие элементы получают правило и какой вес оно имеет при столкновении деклараций. :where() разделяет эти роли. В черновике от 7 мая 2022 года пример .qux:where(em, #foo#bar#baz) получает специфичность (0,1,0). Грозные идентификаторы внутри функции участвуют в выборе элементов, но очков не приносят. Класс .qux снаружи приносит одно. Ноль относится к функции и её аргументам; остальной селектор остаётся на табло.

Эта арифметика полезна тем, кто выпускает общие стили для многих страниц. Базовое правило может точно находить нужные кнопки или ссылки, а команда конкретного продукта легко меняет детали в своём контексте. Библиотеке не приходится заранее знать каждое будущее меню. Продукту не приходится воевать с библиотекой длиной селектора. Браузер выполняет общий расчёт; авторы сами решают, сколько веса дать исходному правилу.

Черновик от 11 ноября 2022 года описывает и работу терпимого списка селекторов: неверный элемент списка может быть отброшен, а верные сохранены по установленным правилам разбора. Это конкретное свойство синтаксиса, а не разрешение писать что угодно. Хронология публикаций W3C фиксирует этапы 2018 и 2022 годов. Вся история помещается в одном подчеркивании: общее правило может точно знать свой адрес и всё же позволить местному автору принять окончательное решение.