Разработчики давно полюбили Sass и Less за вложенные правила. Вместо того чтобы писать длинные селекторы много раз, можно было аккуратно вложить дочерние стили внутрь родительских. В 2024 году это умение получил сам CSS — никаких препроцессоров больше не нужно.

Как выглядит вложенность

Раньше, без препроцессора, приходилось повторять родительский селектор:

.card { background: white; }
.card .title { font-size: 20px; }
.card:hover { box-shadow: 0 4px 12px rgba(0,0,0,.1); }
.card .btn { padding: 8px 16px; }
.card .btn:hover { background: darkblue; }

С нативным нестингом это выглядит компактнее и читается как дерево:

.card {
  background: white;

  .title {
    font-size: 20px;
  }

  &:hover {
    box-shadow: 0 4px 12px rgba(0,0,0,.1);
  }

  .btn {
    padding: 8px 16px;

    &:hover {
      background: darkblue;
    }
  }
}

Символ &

Амперсанд & — ключевой символ в нестинге. Он означает «текущий родительский селектор». Без него вложенный селектор добавляется через пробел (потомок). С ним — склеивается напрямую:

.btn {
  /* .btn:hover — псевдокласс */
  &:hover { opacity: .8; }

  /* .btn--primary — модификатор */
  &--primary { background: blue; }

  /* .dark .btn — родитель с классом */
  .dark & { color: white; }
}

Попробуйте сами

Обычная карточка

Стили написаны с нативным нестингом

Акцентная карточка

Модификатор через &.nest-card--accent

@media и @layer внутри правил

Нестинг работает и с at-правилами. Это особенно удобно для медиазапросов — больше не нужно держать брейкпоинты в конце файла:

.sidebar {
  width: 260px;

  @media (max-width: 768px) {
    width: 100%;
  }
}

Раньше такое было только в Sass. Теперь это нативный CSS.

При нативном нестинге без & вложенный селектор неявно оборачивается в :is(). Это важно: :is() берёт специфичность самого специфичного своего аргумента. На практике в большинстве случаев это не вызывает проблем, но при отладке стоит помнить об этой особенности.

Нативный CSS nesting поддерживается во всех современных браузерах начиная с 2023–2024 годов: Chrome 112+, Firefox 117+, Safari 16.5+. Для большинства проектов уже можно использовать без оглядки на совместимость.

Таким образом, нативный CSS nesting позволяет вкладывать правила друг в друга прямо в CSS — так же, как в Sass, но без компиляции. Символ & ссылается на родительский селектор, а @media внутри правила описывает адаптивность прямо рядом с базовыми стилями.