Медиа-запросы с помощью миксинов Sass и карт

Привет! Сегодня вы узнаете, как использовать медиа-запросы с Sass-миксинами и картами. В курсе 3 этапа, каждый из которых посвящен различным подходам и концепциям.

Надеюсь, вам понравится!

Этап I

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

Сначала создайте миксин, который не принимает никаких аргументов и возвращает постоянный запрос @media.

_media-query.scss

@mixin mq() {
   @media only screen and (min-width: 50em) {
     @content;
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Если вы уже опробовали это в основном файле:

style.scss

@use 'media-query' as *;

:root {
  --fs-400: 1rem;

  @include mq() {
    --fs-400: 1.125rem;
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Скомпилированный CSS должен выглядеть следующим образом:

style.css

:root {
  --fs-400: 1rem;
}

@media only screen and (min-width: 50em) {
  :root {
    --fs-400: 1.125rem;
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Этап II

Теперь пришло время сделать его динамическим, передав параметр внутри карты:

_media-query.scss

@mixin mq($size) {
   @media only screen and (min-width: $size) {
     @content;
  }
}
Войти в полноэкранный режим Выйти из полноэкранного режима

А в главном файле попробуйте передать аргумент:

style.scss

@use 'media-query' as *;

:root {
  --fs-400: 1rem;

  @include mq(50em) {
    --fs-400: 1.125rem;
  }
}
Enter fullscreen mode Выйти из полноэкранного режима

Результат должен выглядеть так же.


Третья стадия

Однако все еще можно сделать его более динамичным.

Теперь вы можете добавить карту и использовать ее с нашим миксином. Карты эквивалентны объектам в JavaScript или словарям в Python. Сначала установите несколько точек останова внутри карты:

_media-query.scss

$breakpoints: (
  sm: 30em,
  md: 50em,
  lg: 75em,
);
Войти в полноэкранный режим Выйти из полноэкранного режима

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

Теперь, чтобы получить значение внутри карты, вы можете использовать функцию map-get(), которая принимает 2 аргумента, объявленную вами карту и ключ внутри этой карты. И она возвращает значение, привязанное к ключу. Теперь, используя эту концепцию…:

_media-query.scss

$breakpoints: (
  sm: 30em,
  md: 50em,
  lg: 75em,
);

@mixin mq($key) {
  $size: map-get($breakpoints, $key);

  @media only screen and (min-width: $size) {
    @content;
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

В основном файле используйте ключ из карты $breakpoints в качестве аргумента внутри вашего миксина mq():

style.scss

@use 'media-query' as *;

:root {
  --fs-400: 1rem;

  @include mq('md') {
    --fs-400: 1.125rem;
  }
}
Вход в полноэкранный режим Выйти из полноэкранного режима

Примечание: вы можете заключать или не заключать аргумент в кавычки внутри функции mq() в соответствии с вашими предпочтениями. Мне нравится заключать его в кавычки:).

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

style.css

:root {
  --fs-400: 1rem;
}

@media only screen and (min-width: 50em) {
  :root {
    --fs-400: 1.125rem;
  }
}
Вход в полноэкранный режим Выход из полноэкранного режима

Также, в качестве бонуса, вы можете улучшить проверку медиа-запроса, включив в него правила @if и @else:

_media-query.scss

$breakpoints: (
  sm: 30em,
  md: 50em,
  lg: 75em,
);

@mixin mq($key) {
  $size: map-get($breakpoints, $key);

  @if ($size) {
    @media only screen and (min-width: $size) {
      @content;
    }
  } @else {
    @error '`#{$key}` does not exist in the $breakpoints';
  }
}
Войти в полноэкранный режим Выход из полноэкранного режима

Это просто гарантирует, что вы можете использовать ключи только внутри точек останова. В противном случае выдается ошибка.


Вы можете получить код из репозитория GitHub.

Если вам понравилась эта статья, пожалуйста, поделитесь с другими. Для меня это очень важно.


Вот и все! Надеюсь, вам понравилось!

Оцените статью
devanswers.ru
Добавить комментарий