Наследование в CSS: какие свойства передаются, а какие нет (CSS)

Наследование — это когда дочерний элемент автоматически берёт стиль у родителя, если сам не задаёт своё значение. Не все свойства так умеют: одни передаются, другие — строго «только для себя».


Какие свойства наследуются (и что это значит на практике)

К наследуемым относятся в основном свойства, которые про «как выглядит текст» и «в каком направлении идёт поток».

Примеры:

css
body {
  font-family: Arial, sans-serif;
  color: #333;
  line-height: 1.6;
  text-align: left;
}

HTML:

html
<body>
  <h1>Заголовок</h1>
  <p>Абзац с текстом.</p>
  <ul>
    <li>Пункт списка</li>
  </ul>
</body>

Что произойдёт:

  • font-family, color, line-height, text-align применятся ко всем вложенным элементам: заголовкам, абзацам, пунктам списка.
  • То есть ты один раз задаёшь стиль для body — и весь текст на странице сразу становится единообразным.

Типичные наследуемые свойства:

  • color
  • font-* (family, size, weight, style, variant, etc.)
  • line-height
  • text-align, text-indent, text-transform
  • letter-spacing, word-spacing
  • direction, unicode-bidi
  • некоторые редко используемые вроде cursor, visibility

Какие свойства НЕ наследуются (почему приходится задавать явно)

Большинство свойств, которые про «размеры, рамки, отступы и позиционирование», не передаются детям. Иначе верстка бы «разъезжалась»: например, если родитель задаст margin, все дети тоже получили бы такие же внешние отступы — и страница выглядела бы странно.

Пример:

css
.box {
  border: 2px solid blue;
  padding: 20px;
  margin: 40px;
  width: 300px;
}
html
<div class="box">
  <div class="inner">Внутренний блок</div>
</div>

Что будет:

  • .inner не получит border, padding, margin, width.
  • У него будут свои дефолтные значения (или те, что ты явно пропишешь).

Типичные ненаследуемые свойства:

  • margin-*, padding-*
  • border-*, outline-*
  • width, height, min-width, max-width и аналоги
  • position, top, right, bottom, left
  • display, float, clear
  • background-* (цвет, картинка, позиция и т.п.)
  • box-shadow
  • overflow

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

В спецификации CSS у каждого свойства есть строка Inherited: yes или Inherited: no. В жизни проще запомнить группы:

  • «про текст» — чаще наследуется.
  • «про коробку/размеры/позицию» — почти никогда.

Ключевое слово inherit: принудительно включить наследование

Если свойство по умолчанию не наследуется, можно явно сказать: «возьми значение у родителя».

css
.parent {
  border-color: red;
}
 
.child {
  border-color: inherit; /* возьмёт red от родителя */
}

Или для всех границ сразу:

css
.child {
  border: inherit;
}

Это удобно, когда хочешь, чтобы дочерний элемент повторял какое‑то значение родителя, но не копировать его вручную.


Ключевое слово initial: сбросить до значения по умолчанию

Иногда нужно, чтобы элемент не брал стиль от родителя и не применял своё, а использовал браузерное «по умолчанию».

css
.special-text {
  color: initial; /* будет не цвет родителя, а дефолтный цвет браузера */
}

Для color это обычно чёрный. Для margin — 0, для border — none и т.д.


Ключевое слово unset: умное поведение

unset работает по-разному:

  • если свойство наследуемое (например, color) → ведёт себя как inherit;
  • если ненаследуемое (например, margin) → ведёт себя как initial.
css
.reset-all {
  color: unset;   /* возьмёт цвет у родителя */
  margin: unset;  /* станет как у браузера по умолчанию (обычно 0) */
}

Практический пример: типичная ловушка

Ты хочешь, чтобы все ссылки внутри .content были красными:

css
.content {
  color: red;
}

HTML:

html
<div class="content">
  <a href="#">Ссылка</a>
</div>

Ссылка не станет красной, потому что у <a> в браузере есть свои стили (часто синий цвет и подчёркивание). color наследуется, но браузерный стиль ссылки перебивает наследование за счёт своей специфичности.

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

css
.content a {
  color: red;
  text-decoration: none;
}

Теперь явно сказано: «для ссылок внутри .content — красный цвет».


Ещё один пример: фон и цвет текста

css
.panel {
  background: #eee;
  color: #000;
}
 
.panel .inner {
  /* тут нет background и color — они не наследуются автоматически */
}

Результат:

  • У .inner фон будет не #eee, а тем, что задано выше по дереву или дефолтным (часто белый).
  • Цвет текста останется чёрным, потому что color наследуется.

Если нужен такой же фон — надо задать явно:

css
.panel .inner {
  background: inherit; /* или background: #eee; */
}

Шпаргалка: быстрый ориентир

Группа свойств Наследуется? Пример
Цвет и текст Да color, font-family, line-height
Отступы и рамки Нет margin, padding, border
Размеры и позиция Нет width, height, position, top
Фон и тени Нет background, box-shadow
Отображение Нет display, float

Практические советы

  • Не рассчитывай, что padding или border «спустится» к детям. Если нужно — задавай явно или используй inherit.
  • Если хочешь единый цвет текста на всей странице — ставь color на body. Это сработает почти везде.
  • Для ссылок, кнопок и форм часто приходится переопределять стили явно, потому что браузеры дают им свои правила.
  • Избегай !important и длинных цепочек селекторов ради «победы» над наследованием — лучше явно задать нужное свойство там, где оно нужно.

Добавить комментарий