Encodera

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

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

Оглавление

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

Вложенность — это правила для дочерних элементов, записанные внутри правила родителя. Sass превращает вложенные правила в обычные плоские селекторы. Так все стили одного компонента — карточки, кнопки — остаются в одном блоке.

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

Правило внутри другого правила относится к потомкам, как если бы селекторы стояли через пробел. Пока все примеры пишутся в styles/main.scss, по файлам их разложит глава о модулях:

// styles/main.scss
.card {
  padding: 16px;
 
  h3 {
    margin: 0;
  }
 
  p {
    color: gray;
  }
}
.card {
  padding: 16px;
}
.card h3 {
  margin: 0;
}
.card p {
  color: gray;
}

Родительский селектор &

Знак & обозначает селектор родителя. С ним состояния и классы прикрепляются к самому родителю, а не ищутся среди потомков:

// styles/main.scss
.btn {
  background: #2563eb;
 
  &:hover {
    background: #1d4ed8;
  }
 
  &.is-active {
    outline: 2px solid black;
  }
}
.btn {
  background: #2563eb;
}
.btn:hover {
  background: #1d4ed8;
}
.btn.is-active {
  outline: 2px solid black;
}

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

Суффиксы имён классов

В Sass к & можно приклеить текст и получить новое имя класса. Это удобно для именования по БЭМ, где элементы и модификаторы повторяют имя блока:

// styles/main.scss
.card {
  padding: 16px;
 
  &__title {
    font-size: 20px;
  }
 
  &--featured {
    border: 2px solid gold;
  }
}
.card {
  padding: 16px;
}
.card__title {
  font-size: 20px;
}
.card--featured {
  border: 2px solid gold;
}
<style>
  .card {
    padding: 16px;
  }
  .card__title {
    font-size: 20px;
  }
  .card--featured {
    border: 2px solid gold;
  }
</style>
 
<div class="card card--featured">
  <h3 class="card__title">Избранная карточка</h3>
</div>

Встроенная вложенность CSS так не умеет: в CSS запись &__title недопустима. Это одна из причин оставаться на Sass.

Вложенные медиазапросы

Медиазапрос можно написать прямо внутри правила. Sass вынесет его наружу и повторит селектор:

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

Вложенность Sass и вложенность CSS

Встроенная вложенность из учебника HTML и CSS работает в браузерах с 2023 года и подходит для простых случаев. Вложенность Sass компилируется в плоские селекторы, поэтому работает в любом браузере и поддерживает суффиксы вроде &__title. Если проект уже на Sass, пользуйтесь его вложенностью — смесь двух подходов в одном файле только запутывает.

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

Глубокая вложенность копирует структуру HTML в CSS и создаёт длинные тяжёлые селекторы:

// styles/main.scss
.page {
  .content {
    .card {
      .title {
        color: navy;
      }
    }
  }
}
.page .content .card .title {
  color: navy;
}

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

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

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