Что означает слово специфичность в CSS?

👨‍💻 Frontend Developer 🟡 Часто попадается 🎚️ Средний
#CSS #HTML

Краткий ответ

Специфичность в CSS — это система приоритетов, которая определяет, какой стиль применится к элементу:

  1. Inline стили — самый высокий приоритет (1000) 🎯
  2. ID селекторы — высокий приоритет (100) 🆔
  3. Классы, атрибуты, псевдоклассы — средний приоритет (10) 📝
  4. Теги и псевдоэлементы — низкий приоритет (1) 🏷️
/* Специфичность: 1 */
p { color: black; }
 
/* Специфичность: 10 */
.text { color: blue; }
 
/* Специфичность: 100 */
#title { color: red; }
 
/* Специфичность: 1000 */
<p style="color: green;">Текст</p>

Полный ответ

Специфичность в CSS — это как система рангов в армии. Чем выше ранг селектора, тем больше у него власти над стилями элемента! 🎖️

Как работает специфичность — система счёта

CSS использует четырёхзначную систему подсчёта:

/* Формат: [inline, id, class, element] */
 
/* [0, 0, 0, 1] = 1 */
p { color: black; }
 
/* [0, 0, 1, 0] = 10 */
.text { color: blue; }
 
/* [0, 1, 0, 0] = 100 */
#title { color: red; }
 
/* [1, 0, 0, 0] = 1000 */
style="color: green;"

Категории селекторов по приоритету

1. Inline стили — генералы (1000)

<!-- Самый высокий приоритет -->
<p style="color: red;">Красный текст</p>

2. ID селекторы — полковники (100)

/* Специфичность: 100 */
#header { background: blue; }
#nav { color: white; }

3. Классы, атрибуты, псевдоклассы — майоры (10)

/* Специфичность: 10 каждый */
.button { padding: 10px; }
[type="text"] { border: 1px solid; }
:hover { opacity: 0.8; }
:first-child { margin-top: 0; }

4. Теги и псевдоэлементы — рядовые (1)

/* Специфичность: 1 каждый */
div { display: block; }
p { margin: 16px; }
::before { content: ""; }
::after { display: block; }

Примеры расчёта специфичности

/* [0, 0, 0, 1] = 1 */
h1 { color: black; }
 
/* [0, 0, 1, 1] = 11 */
h1.title { color: blue; }
 
/* [0, 1, 0, 1] = 101 */
#main h1 { color: red; }
 
/* [0, 1, 2, 1] = 121 */
#main .content h1.title { color: green; }
 
/* [0, 2, 1, 0] = 210 */
#header #nav .menu { color: purple; }

Сравнение специфичности — кто победит?

/* Битва стилей! */
 
/* Специфичность: 1 */
p { color: black; }
 
/* Специфичность: 10 - ПОБЕЖДАЕТ первый */
.text { color: blue; }
 
/* Специфичность: 11 - ПОБЕЖДАЕТ второй */
p.text { color: red; }
 
/* Специфичность: 100 - ПОБЕЖДАЕТ третий */
#content { color: green; }
 
/* Специфичность: 101 - ПОБЕЖДАЕТ четвёртый */
#content p { color: yellow; }

Таблица приоритетов

СелекторСпецифичностьПримерПриоритет
Inline1000style="color: red"Самый высокий
ID100#headerВысокий
Класс10.buttonСредний
Атрибут10[type="text"]Средний
Псевдокласс10:hoverСредний
Тег1divНизкий
Псевдоэлемент1::beforeНизкий

Особые случаи

!important — ядерная кнопка

/* !important побеждает всё (кроме другого !important) */
p { color: red !important; } /* Побеждает всё */
 
/* Даже inline стили! */
<p style="color: blue;">Всё равно красный!</p>

Универсальный селектор — ноль

/* Специфичность: 0 */
* { margin: 0; }
 
/* Специфичность: 0 + 10 = 10 */
*.class { padding: 0; }

Комбинаторы не считаются

/* Специфичность: 1 + 1 = 2 (комбинатор > не считается) */
div > p { color: blue; }
 
/* Специфичность: 10 + 1 = 11 */
.container p { color: red; }

Практические примеры

Проблема: стиль не применяется

/* Не работает - специфичность: 10 */
.button { background: blue; }
 
/* Работает - специфичность: 100 */
#sidebar .button { background: blue; }
 
/* Или используем !important */
.button { background: blue !important; }

Правильная архитектура стилей

/* ✅ Хорошо: низкая специфичность */
.card { padding: 20px; }
.card-title { font-size: 24px; }
.card-content { color: #666; }
 
/* ❌ Плохо: высокая специфичность */
#main .sidebar .card .card-header .card-title { font-size: 24px; }

Инструменты для работы со специфичностью

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

/* Используйте онлайн калькуляторы */
/* https://specificity.keegan.st/ */
/* https://polypane.app/css-specificity-calculator/ */

DevTools браузера

/* В DevTools видно какие стили перебиты */
/* Перечёркнутые стили = низкая специфичность */

Стратегии управления специфичностью

1. Методология BEM

/* Низкая и предсказуемая специфичность */
.block { }
.block__element { }
.block__element--modifier { }

2. Избегайте ID в стилях

/* ❌ Плохо: слишком высокая специфичность */
#header #nav .menu-item { }
 
/* ✅ Лучше: используйте классы */
.header .nav .menu-item { }

3. Используйте каскад правильно

/* Базовые стили */
.button { padding: 10px; background: gray; }
 
/* Модификации */
.button--primary { background: blue; }
.button--large { padding: 15px; }

Частые ошибки

Злоупотребление !important

/* ❌ Плохо: !important везде */
.text { color: red !important; }
.title { font-size: 24px !important; }
 
/* ✅ Лучше: правильная специфичность */
.content .text { color: red; }
.content .title { font-size: 24px; }

Слишком специфичные селекторы

/* ❌ Плохо: сложно переопределить */
.page .content .sidebar .widget .title { }
 
/* ✅ Лучше: простые селекторы */
.widget-title { }

Простые правила

  1. Чем специфичнее селектор — тем выше приоритет 📈
  2. ID > класс > тег — иерархия власти 👑
  3. !important — последний аргумент, используйте осторожно ⚠️
  4. Inline стили — самый высокий приоритет 🎯
  5. При равной специфичности — побеждает последний 🏁
  6. Держите специфичность низкой — проще поддерживать 🛠️

Понимание специфичности поможет вам писать предсказуемые и легко поддерживаемые стили! 💪


Хотите больше статей для подготовки к собеседованиям? Подписывайтесь на EasyAdvice, добавляйте сайт в закладки и совершенствуйтесь каждый день 💪