Тренажёр специфичности и каскада CSS

Специфичность — это вес CSS-селектора, который помогает определить, какое правило применится к элементу при прочих равных условиях каскада. Но вес — не единственное, что решает спор. В тренажёре два раздела: сначала задания на специфичность селекторов, затем на весь каскад — порядок правил, !important, атрибут style, слои и наследование.

Как пользоваться

  • Выберите задание в списке или переходите стрелками. Счётчик показывает номер текущего задания.
  • Посмотрите на HTML и CSS и выберите, каким будет цвет текста элемента <p>. Под каждым цветом подписано, откуда он может прийти: из какого правила, атрибута style или от родителя.
  • После верного ответа прочитайте объяснение. Если ошиблись, правильный ответ не раскрывается — попробуйте снова.
  • Счётчик решённых заданий показывает прогресс. Кнопка со стрелкой по кругу сбрасывает его. Решённые задания отмечаются галочкой. Прогресс сохраняется в этом браузере между посещениями, если доступно локальное хранилище.

Как устроена специфичность

Сначала сравниваются идентификаторы, затем классы, атрибуты и псевдоклассы, затем типы и псевдоэлементы. Комбинаторы и универсальный селектор веса не добавляют. При равном весе и прочих равных условиях побеждает более позднее правило.

:is(), :not() и :has() берут максимальный вес аргументов; :where() всегда даёт ноль. Для :nth-child(... of ...) вес аргументов прибавляется к весу псевдокласса.

Специфичность — только один этап каскада. Сначала учитываются происхождение, важность и слои; при равном весе также может учитываться близость области @scope.

Продолжить: Разобрать свой селектор, тренажёр селекторов, каскадность в CSS. Правила расчёта: спецификация Selectors.

Как браузер выбирает значение

Если к элементу подходят несколько объявлений одного свойства, браузер сравнивает их по этапам и останавливается на первом, где нашлась разница:

  1. Важность. Объявление с !important сильнее обычного.
  2. Атрибут style. Обычный inline-стиль сильнее обычных правил из таблицы стилей, но слабее их !important.
  3. Слои @layer. Более поздний слой сильнее, стили вне слоёв сильнее всех слоёв. Для !important порядок переворачивается.
  4. Специфичность селектора.
  5. Близость @scope. Побеждает правило, чей корень области ближе к элементу.
  6. Порядок в коде. Последнее объявление побеждает.

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

Тренажёр

Определите, каким цветом будет текст элемента <p>.

Правила записаны в одной таблице стилей сверху вниз, без анимаций и переходов. В разделе «Специфичность» оба селектора подходят к элементу, а !important, слоёв и inline-стилей нет. В разделе «Каскад» в игру вступают они, а также наследование и @scope.

1 из 38

HTML

CSS

Какого цвета будет текст элемента <p>?

Для проверки ответов включите JavaScript. Пример: .note { color: red } сильнее записанного ниже p { color: blue } для <p class="note">: класс имеет вес 0–1–0, тег — 0–0–1.

Разобрать свой селектор

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

Вес A–B–C: идентификаторы — классы, атрибуты и псевдоклассы — типы и псевдоэлементы. Сравниваем слева направо, без переноса разрядов. Результат обновляется во время ввода.

Попробуйте:

Для расчёта включите JavaScript. Пример: #menu .item:hover имеет вес 1–2–0, а nav a.active — 0–1–2. Первый селектор специфичнее.