Урок 12. Примеры: Каскад, наследование и специфичность

📁 Раздел: Основы CSS ⏱️ Время изучения: ~45 мин 🎯 Сложность: Начальная
#p #hover #style

⚡ Кратко

В каждом примере на один элемент действуют два-три конфликтующих правила. Сначала посчитайте специфичность (inline, id, class, tag), предскажите цвет — и сверьтесь с блоком «Результат».

Рабочие примеры

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

1. Тег vs класс: класс сильнее

Элемент <p class="text"> подходит и под p, и под .text. Специфичность: p = (0,0,0,1), .text = (0,0,1,0). Класс старше тега — побеждает синий.

Абзац с классом .text — текст синий, хотя правило p хочет серый.

p      { color: gray; }    /* (0,0,0,1) */
.text  { color: #2563eb; } /* (0,0,1,0) ← побеждает */

2. Класс vs id: id сильнее

Тот же абзац теперь несёт и класс, и id: <p class="text" id="lead">. .text = (0,0,1,0), #lead = (0,1,0,0). Id старше класса — побеждает оранжевый.

Абзац с id #lead — текст оранжевый, правило .text проиграло.

.text  { color: #2563eb; } /* (0,0,1,0) */
#lead  { color: #ea580c; } /* (0,1,0,0) ← побеждает */

3. Inline побеждает всё (кроме !important)

Атрибут style прямо на элементе имеет специфичность (1,0,0,0) — старше любого id. Поэтому зелёный цвет из style перебивает и #lead, и .text.

Этот абзац покрашен через style="color:#15803d" — inline сильнее id и класса.

<!-- inline = (1,0,0,0), сильнее #lead и .text -->
<p id="lead" class="text" style="color:#15803d">…</p>

4. Порядок решает при равной специфичности

Два правила .button имеют одинаковую специфичность (0,0,1,0). Спор решает порядок: побеждает то, что написано ниже — фон бирюзовый.

.button { background: #e5e7eb; } /* (0,0,1,0) */
.button { background: #0f766e; } /* (0,0,1,0) ← ниже, побеждает */

5. !important перебивает специфичность

Слабое правило по тегу p с !important побеждает даже id без !important. Так делать на базовом уровне не нужно — пример показывает силу флага, а не рекомендацию.

Текст красный: p { color: red !important } перебил #lead.

#lead { color: #ea580c; }          /* (0,1,0,0) */
p     { color: #b91c1c !important; } /* !important ← побеждает */

6. Наследование: цвет течёт от родителя к детям

Зададим color и font-family на контейнере — вложенные абзацы унаследуют их. А вот border родителя детям не передаётся (он не наследуется).

Родитель: задан color и font-family.

Дочерний абзац унаследовал бирюзовый цвет и шрифт Georgia — без собственных правил.

.article {
  color: #0f766e;            /* наследуется */
  font-family: Georgia, serif; /* наследуется */
  border: 2px solid #0f766e;   /* НЕ наследуется детьми */
}
Эксперимент: открой пример 2 в DevTools (F12) и добавь абзацу style="color:purple". Правило #lead в панели Styles станет перечёркнутым — это проигравшее объявление.