Какие нестандартные случаи специфичности в CSS важны на практике и как их применять?
Селекторы и специфичность
Есть случаи, где специфичность ведёт себя неочевидно — их полезно знать, чтобы не удивляться при отладке.
Нестандартные случаи
- `:where()` обнуляет специфичность — удобно для базовых стилей библиотек, которые легко переопределить:
:where(.btn) { padding: 8px; } /* (0,0,0) */
.btn { padding: 4px; } /* победит */- `:is()`, `:not()`, `:has()` берут максимум аргументов —
:is(#id, .a)весит как id, даже если сработал.a. - Повтор класса —
.btn.btnдаёт(0,2,0); приём для повышения веса без зависимости от разметки. - Атрибут по id —
[id="header"]весит как класс(0,1,0), а не как id. - `` и комбинаторы** не добавляют веса.
- Слои `@layer` важнее специфичности — правило в позднем слое побеждает более специфичное в раннем; стили вне слоёв сильнее любых слоёв.
- `!important` в слоях работает наоборот — важные стили раннего слоя сильнее важных стилей позднего.
- Наследованное значение проигрывает любому правилу для элемента, даже
*.
Коротко для собеседования
:where() обнуляет вес, :is()/:not() берут максимум, [id=…] весит как класс, слои важнее специфичности, а !important в слоях инвертирует порядок.
Подробнее: MDN — Специфичность