LoginSignup
16
20

More than 5 years have passed since last update.

メディアクエリをsassで設定するmixin

Last updated at Posted at 2019-05-02

今まで 〜どんどんmixin作る

今まで、数値を変数にしたりしつつ、こんな感じのメディアクエリを作って使いまわしてましたが、

@mixin for-phone-only {
  @media (max-width: 599px) { @content; }
}
@mixin for-tablet-portrait-up {
  @media (min-width: 600px) { @content; }
}
@mixin for-tablet-landscape-up {
  @media (min-width: 900px) { @content; }
}
@mixin for-desktop-up {
  @media (min-width: 1200px) { @content; }
}
@mixin for-big-desktop-up {
  @media (min-width: 1800px) { @content; }
}

mixin増えていくし、なんかかっこいい系に引数つけてちょっとまとめてみようかと。

とはいえ、bootstrapに使われているのをはじめ、色々同じこと書いてらっしゃるblogとかあるんですけどね。

改善?しよう。 〜mixinおまとめ

まずbreakpointを変数に設定

$bp-smartphone-portrait: 520px;
$bp-tablet-portrait: 768px;
$bp-laptop_s: 1000px;
$bp-tablet-landscape: 1024px;
$bp-laptop_m: 1366px;
$bp-laptop_l: 1920px;

で、連想配列にする
(↑で作った変数を全て入れてはないのは、6バージョンも実際にはごにゃごにゃしないだろうな〜 というところで、捨てました。必要に応じて入れ替えればいいさ。)

$breakpoints:(
  xs: $bp-smartphone-portrait,
  sm: $bp-tablet-portrait,
  md: $bp-tablet-landscape,
  lg: $bp-laptop_m,
  xl: $bp-laptop_l
) !default;

まずは小さいスクリーン優先のmixin。
呼び出しかたは@include mediaQuery-up(sm)で、引数に指定したサイズ以上のスクリーンサイズ用のメディアクエリに。

@mixin mediaQuery-up($breakpoint) {
  @media ( min-width: #{map-get($breakpoints, $breakpoint)} ) {
    @content;
  }
}

大きいスクリーン優先のmixin。
呼び出しかたは@include mediaQuery-down(sm)で、引数に指定したサイズ以下のスクリーンサイズ用のメディアクエリに。

@mixin mediaQuery-down($breakpoint) {
  @media ( max-width: #{map-get($breakpoints, $breakpoint)} ) {
    @content;
  }
}

で、間。
配布するわけじゃないから、引数が1つしか入ってこなかった時とか、いいや〜 ってなってます。
@include mediaQuery-down(sm, lg)で呼び出し。大きい方と小さい方、逆になってても大丈夫。

@mixin mediaQuery-between($breakpoint1, $breakpoint2) {
  $size1: null;
  $size2: null;
  @each $bp, $size in $breakpoints{
    @if ( $bp == $breakpoint1 ){
      $size1: $size;
    }
    @if ( $bp == $breakpoint2 ){
      $size2: $size;
    }
  }

  @if ( $size1 <= $size2 ) {
    @media ( min-width: #{map-get($breakpoints, $breakpoint1)} ) and ( max-width: #{map-get($breakpoints, $breakpoint2)} ) {
      @content;
    }
  } @else {
    @media ( min-width: #{map-get($breakpoints, $breakpoint2)} ) and ( max-width: #{map-get($breakpoints, $breakpoint1)} ) {
      @content;
    }
  }

}

landscapeとか、printとか、必要に応じて組み合わせてくとどんどん複雑に使い勝手がよくなりますな。

16
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
20