Урок 12. Примеры: Каскад, наследование и специфичность
⚡ Кратко
В каждом примере на один элемент действуют два-три конфликтующих правила. Сначала посчитайте специфичность (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 родителя детям не передаётся (он не наследуется).
Дочерний абзац унаследовал бирюзовый цвет и шрифт Georgia — без собственных правил.
.article {
color: #0f766e; /* наследуется */
font-family: Georgia, serif; /* наследуется */
border: 2px solid #0f766e; /* НЕ наследуется детьми */
}
style="color:purple".
Правило #lead в панели Styles станет перечёркнутым — это проигравшее объявление.