Encodera

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

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

Оглавление

Блоки содержимого: @content

Аргументы передают в миксин отдельные значения. Иногда нужно передать целый блок стилей — например, «эти объявления, но только на широких экранах». Правило @content отмечает место внутри миксина, куда этот блок вставляется.

Миксин с @content

Самый частый пример — миксин точки перелома (breakpoint). Добавьте его в styles/abstracts/_mixins.scss:

// styles/abstracts/_mixins.scss
@mixin tablet {
  @media (min-width: 768px) {
    @content;
  }
}

При подключении после имени пишут блок в фигурных скобках. Этот блок встаёт на место @content:

// styles/components/_cards.scss
@use "../abstracts/mixins";
 
.cards {
  display: grid;
  gap: 16px;
 
  @include mixins.tablet {
    grid-template-columns: 1fr 1fr;
  }
}
// styles/main.scss
@use "components/cards";
.cards {
  display: grid;
  gap: 16px;
}
@media (min-width: 768px) {
  .cards {
    grid-template-columns: 1fr 1fr;
  }
}

Медиазапрос оказался снаружи .cards, а селектор повторился внутри него — так же, как вложенные медиазапросы в уроке о вложенности.

Точка перелома как аргумент

Отдельные миксины для каждого размера — это повторы. Передайте ширину аргументом со значением по умолчанию:

// styles/abstracts/_mixins.scss
@mixin from($width: 768px) {
  @media (min-width: $width) {
    @content;
  }
}
// styles/components/_cards.scss
@use "../abstracts/mixins";
 
.cards {
  display: grid;
  gap: 16px;
 
  @include mixins.from {
    grid-template-columns: 1fr 1fr;
  }
 
  @include mixins.from(1024px) {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
// styles/main.scss
@use "components/cards";
.cards {
  display: grid;
  gap: 16px;
}
@media (min-width: 768px) {
  .cards {
    grid-template-columns: 1fr 1fr;
  }
}
@media (min-width: 1024px) {
  .cards {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
<style>
  .cards {
    display: grid;
    gap: 16px;
  }
  @media (min-width: 768px) {
    .cards {
      grid-template-columns: 1fr 1fr;
    }
  }
  @media (min-width: 1024px) {
    .cards {
      grid-template-columns: 1fr 1fr 1fr;
    }
  }
</style>
 
<div class="cards">
  <div>Карточка 1</div>
  <div>Карточка 2</div>
  <div>Карточка 3</div>
</div>

Меняйте ширину окна браузера: одна колонка, затем две, затем три. В уроке о картах ширины переедут в один список именованных точек перелома.

Где ещё пригодится @content

@content не ограничен медиазапросами. Подойдёт любая обёртка: наведение только для устройств с мышью, селектор тёмной темы, проверка @supports:

// styles/abstracts/_mixins.scss
@mixin on-hover {
  @media (hover: hover) {
    &:hover {
      @content;
    }
  }
}

Внутри .btn запись @include mixins.on-hover { background: black; } даёт .btn:hover внутри медиазапроса, и на сенсорных экранах наведение не «залипает».

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

Если передать блок миксину без @content, Sass остановится с ошибкой Mixin doesn't accept a content block. Обратная ситуация проходит молча: миксин с @content, подключённый без блока, просто ничего туда не вставит. Если миксин точки перелома как будто не работает, проверьте, что блок в фигурных скобках действительно есть.

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

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