56
62

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Sassでメディアクエリを効率的に管理するマップとmixin

Last updated at Posted at 2015-09-19

使用するのはSass3.3から追加された新しいデータタイプのマップ。これはkeyとvalueのペアを定義できるものです。マップでvalueを取得するにはmap-get()関数を使用します。

map-get($map, $key)

詳しくはこちらの記事を参照してください。

Sass 3.3で追加された新しいデータタイプ「マップ」まとめ解説 | HTML5Experts.jp

マップはこのように定義しておきます。

$breakpoints: (
    'sm': 'screen and (min-width: 400px)',
    'md': 'screen and (min-width: 768px)',
    'lg': 'screen and (min-width: 1000px)',
    'xl': 'screen and (min-width: 1200px)',
) !default;

例えばsmがkeyでscreen and (min-width: 400px)がvalueになります。valueをクウォートで囲んで文字列として明示的に定義しておきます。

上述したmap-get()関数の$mapは定義したマップの$breakpointsにあたり、$keysmmdなどにあたります。mixinは以下のように定義します。引数にkeyを渡してvalueをブレイクポイントとして取得できるようにしています。

@mixin media-query($breakpoint) {
    @if map-has-key($breakpoints, $breakpoint) {
        @media #{inspect(map-get($breakpoints, $breakpoint))} {
            @content;
        }
    } @else {
        @warn "Unfortunately, no value could be retrieved from `#{$breakpoint}`. "
        + "Please make sure it is defined in `$breakpoints` map.";
    }
}

map-has-key()はマップが存在しているかを判定(これはなくてもOKです)、unquote()でvalueで囲んでいるクウォートを取り除きます。

実際にメディアクエリを呼び出す時にはこのようにします。

.foo {
  color: red;
  @include media-query(sm) {
    color: blue;
  }
}

コンパイル結果はこのようになります。

.foo {
  color: red;
}
@media screen and (min-width: 400px) {
  .foo {
    color: blue;
  }
}

この方法を使えば、1つのmixinとマップだけで様々な条件のブレイクポイントに対応ができ、それによってブレイクポイントの管理が分かりやすく変更しやすくなります。

以下の記事を参考にさせていただきました。

56
62
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
56
62

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?