Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Вложенность и &

Вложенность позволяет писать правило внутри другого правила, повторяя структуру HTML. Less сам склеивает селекторы при компиляции. Стили одного компонента собираются в одном блоке, и не нужно много раз писать .card.

Вложенные правила

Напишите стили карточки в styles/components/cards.less:

// styles/components/cards.less
.card {
  padding: 16px;
 
  .title {
    margin: 0;
  }
 
  p {
    color: #4b5563;
  }
}
.card {
  padding: 16px;
}
.card .title {
  margin: 0;
}
.card p {
  color: #4b5563;
}

Внутреннее правило стало селектором потомка: .card .title — это .title где угодно внутри .card.

Ссылка на родителя &

Символ & означает «селектор родителя». Он нужен, когда пробел между селекторами не нужен — для псевдоклассов и составных классов:

// styles/components/buttons.less
.btn {
  background: #2563eb;
 
  &:hover {
    background: #1d4ed8;
  }
 
  &.active {
    outline: 2px solid black;
  }
}
.btn {
  background: #2563eb;
}
.btn:hover {
  background: #1d4ed8;
}
.btn.active {
  outline: 2px solid black;
}

Без & получилось бы .btn :hover с пробелом — наведение на любой потомок кнопки.

Модификаторы и родитель в конце

& можно склеивать с текстом, как в именах по БЭМ, и ставить в конец селектора:

// styles/components/buttons.less
.btn {
  color: white;
 
  &-large {
    padding: 12px 24px;
  }
 
  .dark & {
    color: black;
  }
}
.btn {
  color: white;
}
.btn-large {
  padding: 12px 24px;
}
.dark .btn {
  color: black;
}
<style>
  .btn {
    color: white;
  }
  .btn-large {
    padding: 12px 24px;
  }
  .dark .btn {
    color: black;
  }
</style>
 
<button class="btn btn-large" style="background: #2563eb">Обычная тема</button>
<div class="dark" style="padding: 8px">
  <button class="btn btn-large" style="background: #facc15">Тёмная тема</button>
</div>

&-large дал класс .btn-large, а .dark & — правило для кнопки внутри элемента с классом dark.

Медиазапросы внутри правила

@media можно вложить прямо в правило. Less вынесет его наружу и повторит селектор:

// styles/components/cards.less
.card {
  padding: 16px;
 
  @media (min-width: 768px) {
    padding: 32px;
  }
}
.card {
  padding: 16px;
}
@media (min-width: 768px) {
  .card {
    padding: 32px;
  }
}

Так всё про карточку, включая адаптивность, остаётся в одном месте.

Частая ошибка

Глубокая вложенность «как в HTML» даёт длинные селекторы с высокой специфичностью:

// styles/components/cards.less
.page {
  .content {
    .card {
      .title {
        color: #111827;
      }
    }
  }
}
.page .content .card .title {
  color: #111827;
}

Такой селектор трудно переопределить, и он ломается при любом изменении разметки. Держите вложенность в два-три уровня и вкладывайте только то, что действительно зависит от родителя.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.