Как работает специфичность CSS-селекторов?
MiddleCSS #css #specificity
Вопрос
Как браузер решает, какое CSS-правило применить, если их несколько?
Короткий ответ
Специфичность — это "вес" селектора. Чем он выше, тем приоритетнее правило, независимо от порядка объявления в файле (кроме равной специфичности — там побеждает последнее правило).
Подробный ответ
Специфичность считается по категориям (от старшей к младшей):
- Инлайн-стили (
style="...") — самый высокий приоритет. - ID-селекторы (
#header). - Классы, атрибуты, псевдоклассы (
.btn,[type=text],:hover). - Теги и псевдоэлементы (
div,::before).
Считать удобно как тройку (ID, class, tag): #nav .item → (1, 1, 0), что больше, чем .nav .item → (0, 2, 0).
!important перебивает обычную специфичность и должен использоваться крайне редко — он усложняет отладку, так как ломает предсказуемый каскад.
При равной специфичности побеждает правило, объявленное позже в CSS (или подключённое позже).
Пример
.card p { color: blue; } /* (0, 1, 1) */
#article p { color: red; } /* (1, 0, 1) — победит, т.к. есть ID */
p { color: green; } /* (0, 0, 1) — самый низкий приоритет */
Дополнительные вопросы
- Как влияет порядок правил при равной специфичности?
- Почему
!importantсчитается антипаттерном? - Как специфичность работает с CSS-переменными и каскадными слоями (
@layer)?