Каскад, специфичность и наследование

Понимаем, почему из двух правил для одного элемента побеждает конкретное, и какие свойства передаются детям сами.

Когда на элемент претендуют несколько правил, CSS выбирает победителя по трём механизмам: каскад, специфичность и наследование.

Каскад: кто последний, тот и прав

Если два правила одинаково «весомы» и оба относятся к элементу, побеждает то, что записано ниже в коде. CSS читает стили сверху вниз, и более поздние перекрывают более ранние.

p { color: blue; }
p { color: green; }

Абзацы станут зелёными: второе правило идёт после первого и побеждает. Это и есть каскад в простейшем виде.

Специфичность: чем точнее селектор, тем он сильнее

Но порядок — не единственное, что важно. Более конкретный селектор побеждает менее конкретный, даже если стоит выше. Грубая шкала «веса» селекторов:

Тип селектораВес
по тегу (p, div)самый слабый
по классу (.note)средний
по id (#main)сильный
inline-стиль (style="...")сильнее всех (кроме !important)

Посмотрим на конфликт. Один и тот же абзац с классом:

<p class="note">Текст</p>
p { color: black; }      /* по тегу — слабее */
.note { color: red; }    /* по классу — сильнее */

Текст станет красным: селектор по классу .note специфичнее, чем по тегу p, и побеждает несмотря на то, что стоит ниже (а здесь он ещё и ниже — сошлось вдвойне). Если бы оба были по тегу, решал бы порядок.

Наследование: некоторые свойства передаются детям

Часть свойств элемент-родитель передаёт своим потомкам автоматически. В первую очередь это свойства текста: color, font-family, font-size, line-height.

<div>
  <p>Я внутри div.</p>
  <span>И я тоже.</span>
</div>
div {
  color: purple;
  font-family: Georgia, serif;
}

И абзац, и span внутри станут фиолетовыми и шрифтом Georgia, хотя стиль задан только для div. Они унаследовали эти свойства от родителя. А вот рамки, отступы и фоны (border, margin, padding, background) не наследуются — иначе вложенные блоки получали бы кучу дублирующих рамок.

Как это работает вместе

Когда браузер решает, каким будет, например, цвет элемента, он:

  1. собирает все правила, которые подходят элементу (свои и унаследованные);
  2. сравнивает их специфичность — выигрывает самый конкретный;
  3. при равной специфичности берёт то, что ниже в коде (каскад).

Практический вывод: не гонитесь за !important и длинными цепочками с id. Чаще всего хватает аккуратных классов — ими управлять проще всего, и конфликты решаются предсказуемо.

Итог

  • Каскад: при равной силе побеждает правило, записанное ниже.
  • Специфичность: id сильнее класса, класс сильнее тега; конкретное бьёт общее.
  • Наследование: свойства текста (color, font) передаются детям; отступы и рамки — нет.
Проверьте себя
1. Два правила одинаковой специфичности задают абзацу разный цвет. Какое победит?
AТо, что записано выше в коде
BТо, что записано ниже в коде
CОба применятся одновременно
DСлучайное из двух
2. Какой селектор сильнее по специфичности?
AПо тегу (p)
BПо классу (.note)
CПо id (#main)
DВсе одинаково сильные
3. Какое свойство НЕ наследуется потомками автоматически?
Acolor
Bfont-family
Cborder
Dline-height
Поддержать проект