Вложенность

Оригинальное название: nesting

Коротко

Принцип размещения одних конструкций внутри других — тегов в тегах, CSS-правил в правилах, компонентов в компонентах, — который выражает иерархию и область действия.

Что такое «Вложенность»

Вложенность пронизывает всю фронтенд-разработку. HTML-документ — дерево, где каждый тег вложен в родителя. Функции вкладываются в функции, объекты — в объекты, компоненты интерфейса — в другие компоненты. Понять структуру кода — во многом значит понять, что во что вложено. Отношения «родитель — потомок» описаны в статье про родительский элемент.

Долгое время в CSS вложенности не было: каждое правило писали с полным селектором от корня. Её добавили препроцессоры Sass и Less, и она стала одной из главных причин их популярности. Теперь вложенные правила понимают сами браузеры — поддержка появилась во всех основных браузерах в 2023 году.

Пример: нативная вложенность в CSS

.card {
  padding: 16px;

  & h3 { margin-top: 0; }
  &:hover { box-shadow: 0 2px 8px rgb(0 0 0 / 0.15); }

  @media (min-width: 768px) {
    padding: 24px;
  }
}

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

Отличия от препроцессоров

Синтаксис похож на Sass, но не совпадает. В браузерном CSS нельзя склеивать имена: запись &__title для БЭМ-классов работает только в препроцессоре. Кроме того, браузер вычисляет вложенный селектор по правилам :is(), и специфичность в отдельных случаях получается выше, чем у той же конструкции после компиляции Sass.

Сколько уровней — это много

Глубокая вложенность в CSS порождает длинные специфичные селекторы вроде .page .content .catalog .item .title a. Их трудно перебить и невозможно переиспользовать: блок, перенесённый в другое место страницы, теряет стили. Распространённое правило — не больше трёх уровней. В HTML лишние обёртки утяжеляют дерево DOM и замедляют пересчёт стилей; конструкторы страниц нередко создают по пять-шесть вложенных div на каждую кнопку. В JavaScript глубокая вложенность условий и колбэков ухудшает читаемость — её уменьшают ранними выходами из функций и async/await.

Обновлено:

Все термины раздела «Frontend»

Что будем искать? Например,Продвижение