← Назад к вопросам

Какие есть приоритеты у CSS селекторов?

1.7 Middle🔥 141 комментариев
#HTML и CSS

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI3 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Специфичность CSS селекторов (CSS Specificity)

Специфичность — это система приоритетов в CSS, которая определяет, какой стиль будет применён, когда к элементу применяются конкурирующие правила. Это основная причина, почему один стиль работает, а другой нет. Понимание специфичности критично для написания поддерживаемого CSS кода и избегания использования !important.

Система вычисления специфичности

Специфичность вычисляется по формуле: a-b-c, где:

  • a = количество ID селекторов (#id)
  • b = количество CLASS селекторов (.class), атрибутов ([attr]), псевдоклассов (:hover, :focus)
  • c = количество ELEMENT селекторов (div, span, p)

Встроенные стили (style attribute) имеют специфичность выше всех селекторов.

Примеры вычисления специфичности

/* Специфичность: 0-0-1 (один элемент) */
p { color: blue; }

/* Специфичность: 0-1-0 (один класс) */
.intro { color: red; }

/* Специфичность: 0-1-1 (один класс + один элемент) */
p.intro { color: green; }

/* Специфичность: 0-2-0 (два класса) */
.intro.highlighted { color: yellow; }

/* Специфичность: 1-0-0 (один ID) */
#header { color: black; }

/* Специфичность: 1-0-1 (один ID + один элемент) */
#header p { color: purple; }

/* Специфичность: 1-1-1 (один ID + один класс + один элемент) */
#header .title p { color: orange; }

/* Специфичность: 0-2-1 (два класса + один элемент) */
div.container.active { color: white; }

/* Специфичность: 0-1-0 (псевдокласс считается как класс) */
a:hover { color: red; }

/* Специфичность: 0-2-1 (класс + псевдокласс + элемент) */
.button:hover p { color: blue; }

/* Специфичность: 0-0-2 (два элемента) */
div span { color: gray; }

/* Специфичность: 0-0-3 (три элемента) */
div > span > a { color: brown; }

/* Специфичность: 1-2-3 (один ID + два класса + три элемента) */
#main .container .item a { color: pink; }

Полный порядок приоритетов (от низшего к высшему)

1. Встроенные браузерные стили (user agent styles) — 0-0-0
   
2. Пользовательские стили из расширений браузера — 0-0-0
   
3. Авторские стили (твой CSS) — вычисляется
   3a. Элементные селекторы — 0-0-1
   3b. Селекторы атрибутов и псевдоклассы — 0-1-0
   3c. Селекторы классов — 0-1-0
   3d. Селекторы ID — 1-0-0
   
4. Встроенные стили (style attribute) — 1-0-0-0 (считается как 1000 в специфичности)
   
5. !important — абсолютный приоритет (используй редко!)

Практические примеры конфликтов

/* КОНФЛИКТ 1: Класс vs Элемент */

/* Специфичность: 0-0-1 */
p { color: red; }

/* Специфичность: 0-1-0 — ВЫИГРЫВАЕТ */
.text { color: blue; }

/* Результат: .text будет синим */


/* КОНФЛИКТ 2: ID vs Класс */

/* Специфичность: 0-1-0 */
.intro { color: red; }

/* Специфичность: 1-0-0 — ВЫИГРЫВАЕТ */
#header { color: blue; }

/* Результат: #header будет синим */


/* КОНФЛИКТ 3: Множественные классы vs Один ID */

/* Специфичность: 0-3-0 */
.primary.secondary.tertiary { color: red; }

/* Специфичность: 1-0-0 — ВЫИГРЫВАЕТ */
#main { color: blue; }

/* Результат: #main будет синим */


/* КОНФЛИКТ 4: Встроенный стиль vs все селекторы */

/* Специфичность: 1-0-0 */
#header { color: red; }

/* Встроенный стиль: 1-0-0-0 — ВЫИГРЫВАЕТ */
/* <p id="header" style="color: blue;">Text</p> */

/* Результат: текст будет синим */

Таблица сравнения специфичности

Селектор                           Специфичность    Примечание
========================================================
* (универсальный)                 0-0-0             Нет специфичности
p (элемент)                        0-0-1             
p:first-child                      0-1-1             Псевдокласс считается как класс
p::before                          0-0-2             Псевдоэлемент считается как элемент
.container                         0-1-0             
.primary.secondary                 0-2-0             
#header                            1-0-0             
#header .title                     1-1-1             ID + класс + элемент
div > span                         0-0-2             Комбинатор не влияет
div + span                         0-0-2             Комбинатор не влияет
style="color: red"                Переопределяет все селекторы
!important                         Максимальный приоритет

Когда !important считается приемлемым

/* ПЛОХО: Использовать !important везде */
.button { color: blue !important; }
.nav { display: flex !important; }

/* ХОРОШО: Использовать !important только для утилит */
.hidden { display: none !important; }
.text-center { text-align: center !important; }

/* ХОРОШО: Переопределять встроенные стили компонентов */
/* Если компонент использует style attribute */
.override { color: red !important; }

Советы по избежанию проблем со специфичностью

/* 1. Не используй ID селекторы для стилизации */
/* ПЛОХО */
#user-profile { padding: 20px; }

/* ХОРОШО */
.user-profile { padding: 20px; }


/* 2. Не вкладывай селекторы глубоко */
/* ПЛОХО: Специфичность 0-2-3 */
.container .section .item .title p { color: red; }

/* ХОРОШО: Специфичность 0-1-0 */
.item-title { color: red; }


/* 3. Используй BEM или другую методологию для организации */
/* ПЛОХО: Путаница */
.nav .item { color: red; }
.sidebar .nav .item { color: blue; }

/* ХОРОШО: BEM */
.nav__item { color: red; }
.sidebar .nav__item { color: blue; }


/* 4. Если нужно переопределить — увеличивай специфичность,
   не добавляй !important */

/* ПЛОХО */
.button { background: blue; }
.button-primary { background: red !important; }

/* ХОРОШО */
.button { background: blue; }
.button.button-primary { background: red; } /* +1 специфичность */

Инструменты для проверки специфичности

Браузеры (Chrome DevTools, Firefox Inspector) показывают специфичность селекторов в панели styles. Также есть онлайн калькуляторы специфичности CSS. Понимание этой темы поможет избежать багов и написать поддерживаемый код.

Какие есть приоритеты у CSS селекторов? | PrepBro