Skip to content

Миксины в SCSS

Скачать PDF

Что такое миксины?

Миксины (mixins) - это одна из самых мощных функций SCSS, которая позволяет определять группы CSS-свойств, которые можно повторно использовать в разных селекторах. Миксины помогают избежать повторения кода и делают стили более модульными и поддерживаемыми.

Синтаксис

Определение миксина

Миксины определяются с помощью директивы @mixin, за которой следует имя и опциональные параметры:

scss
@mixin mixin-name($parameter1, $parameter2, ...) {
  // CSS свойства и правила
}

Использование миксина

Для использования миксина применяется директива @include:

scss
.selector {
  @include mixin-name(argument1, argument2, ...);
}

Простые миксины

Миксин без параметров

scss
@mixin flex-center {
  display: flex;
  justify-content: center;
  align-items: center;
}

.container {
  @include flex-center;
  height: 100vh;
}

.card {
  @include flex-center;
  width: 300px;
}

Скомпилированный CSS:

css
.container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}

.card {
  display: flex;
  justify-content: center;
  align-items: center;
  width: 300px;
}

Миксины с параметрами

Базовый пример с параметрами

scss
@mixin padding($top, $right, $bottom, $left) {
  padding-top: $top;
  padding-right: $right;
  padding-bottom: $bottom;
  padding-left: $left;
}

.box {
  @include padding(10px, 20px, 10px, 20px);
}

Параметры со значениями по умолчанию

scss
@mixin button($bg-color: #3498db, $text-color: white, $padding: 10px 15px) {
  background-color: $bg-color;
  color: $text-color;
  padding: $padding;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  
  &:hover {
    background-color: darken($bg-color, 10%);
  }
}

.primary-button {
  @include button; // использует значения по умолчанию
}

.secondary-button {
  @include button(#2ecc71); // переопределяет только цвет фона
}

.danger-button {
  @include button(#e74c3c, white, 15px 20px); // переопределяет все параметры
}

Именованные параметры

scss
@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) {
  position: $position;
  top: $top;
  right: $right;
  bottom: $bottom;
  left: $left;
}

.element {
  @include position(absolute, $left: 10px, $top: 20px);
}

// Компилируется в:
// .element {
//   position: absolute;
//   top: 20px;
//   left: 10px;
// }

Продвинутые техники с миксинами

Переменное количество аргументов

Используйте ... для работы с переменным количеством аргументов:

scss
@mixin box-shadow($shadows...) {
  -webkit-box-shadow: $shadows;
  -moz-box-shadow: $shadows;
  box-shadow: $shadows;
}

.card {
  @include box-shadow(0 2px 2px rgba(0, 0, 0, 0.1), 0 4px 4px rgba(0, 0, 0, 0.1));
}

Передача содержимого в миксин

Директива @content позволяет передавать блок стилей в миксин:

scss
@mixin media-query($breakpoint) {
  @if $breakpoint == small {
    @media (max-width: 576px) {
      @content;
    }
  } @else if $breakpoint == medium {
    @media (max-width: 768px) {
      @content;
    }
  } @else if $breakpoint == large {
    @media (max-width: 992px) {
      @content;
    }
  }
}

.responsive-element {
  width: 100%;
  
  @include media-query(small) {
    font-size: 14px;
    padding: 5px;
  }
  
  @include media-query(medium) {
    font-size: 16px;
    padding: 10px;
  }
}

Вложенные миксины

Миксины могут включать другие миксины:

scss
@mixin reset-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

@mixin horizontal-list {
  @include reset-list;
  
  li {
    display: inline-block;
    margin-right: 10px;
  }
}

.nav-list {
  @include horizontal-list;
}

Практические примеры миксинов

Миксин для кросс-браузерных префиксов

scss
@mixin prefix($property, $value, $prefixes: ()) {
  @each $prefix in $prefixes {
    -#{$prefix}-#{$property}: $value;
  }
  #{$property}: $value;
}

.element {
  @include prefix(transform, rotate(45deg), (webkit, moz, ms, o));
}

// Компилируется в:
// .element {
//   -webkit-transform: rotate(45deg);
//   -moz-transform: rotate(45deg);
//   -ms-transform: rotate(45deg);
//   -o-transform: rotate(45deg);
//   transform: rotate(45deg);
// }

Миксин для типографики

scss
@mixin typography($font-size, $line-height: 1.5, $font-weight: normal, $font-family: inherit) {
  font-size: $font-size;
  line-height: $line-height;
  font-weight: $font-weight;
  font-family: $font-family;
}

h1 {
  @include typography(32px, 1.2, bold, 'Montserrat');
}

p {
  @include typography(16px, 1.6, normal, 'Roboto');
}

Миксин для создания сетки

scss
@mixin grid-column($columns, $total-columns: 12, $gutter: 20px) {
  width: calc(#{percentage($columns / $total-columns)} - #{$gutter});
  margin-right: $gutter;
  float: left;
  
  &:last-child {
    margin-right: 0;
  }
}

.sidebar {
  @include grid-column(4);
}

.content {
  @include grid-column(8);
}

Миксин для анимаций

scss
@mixin keyframes($name) {
  @keyframes #{$name} {
    @content;
  }
}

@mixin animation($name, $duration: 1s, $timing-function: ease, $delay: 0s, $iteration-count: 1, $direction: normal, $fill-mode: none) {
  animation-name: $name;
  animation-duration: $duration;
  animation-timing-function: $timing-function;
  animation-delay: $delay;
  animation-iteration-count: $iteration-count;
  animation-direction: $direction;
  animation-fill-mode: $fill-mode;
}

// Использование
@include keyframes(fade-in) {
  0% { opacity: 0; }
  100% { opacity: 1; }
}

.element {
  @include animation(fade-in, 0.5s, ease-in);
}

Лучшие практики использования миксинов

  1. Создавайте миксины для повторяющихся паттернов

    • Если вы пишете один и тот же код более двух раз, рассмотрите возможность создания миксина
  2. Давайте миксинам ясные, описательные имена

    • Имя должно отражать функциональность миксина
  3. Документируйте параметры миксинов

    • Добавляйте комментарии, объясняющие назначение каждого параметра
  4. Организуйте миксины в отдельных файлах

    • Храните миксины в отдельном файле (например, _mixins.scss)
  5. Избегайте слишком сложных миксинов

    • Миксин должен выполнять одну конкретную задачу
  6. Используйте параметры со значениями по умолчанию

    • Это делает миксины более гибкими и удобными в использовании

Миксины vs. Плейсхолдеры

SCSS предлагает два основных механизма для повторного использования кода: миксины и плейсхолдеры (placeholders). Важно понимать разницу:

scss
// Миксин
@mixin large-text {
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

// Плейсхолдер
%large-text {
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

// Использование миксина
.title {
  @include large-text;
}

.header {
  @include large-text;
}

// Использование плейсхолдера
.subtitle {
  @extend %large-text;
}

.alert {
  @extend %large-text;
}

Разница в скомпилированном CSS:

  • Миксины дублируют код в каждом селекторе, где они используются
  • Плейсхолдеры группируют селекторы вместе с общими стилями
css
/* Скомпилированный CSS для миксинов */
.title {
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

.header {
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

/* Скомпилированный CSS для плейсхолдеров */
.subtitle, .alert {
  font-size: 20px;
  font-weight: bold;
  color: #333;
}

Когда использовать миксины, а когда плейсхолдеры:

  • Используйте миксины, когда вам нужны параметры или когда вы хотите, чтобы каждый селектор имел свой собственный набор свойств
  • Используйте плейсхолдеры, когда вам нужно повторно использовать точно такой же набор свойств без параметров

Заключение

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