🎀

SASSでメディアクエリのベストプラクティスを探ってみた

2024/03/04に公開

SASSのメディアクエリ記述のベストプラクティス

  • 駆け出しウェブデザイナーやフロントエンドエンジニアの方、
  • それらを目指していて効率的なsassの記述を学びたい方
    このような方々の参考になると思ったので、自分のためにもアウトプットしてみます。

結論、map-get()を活用すると、とても良いです。

「んなもん知っとるわ」と思った方は、ここで読了してください(笑)

ノーマルプラクティス

まずは一般的な書き方がこんな感じだと思います。
※他のやり方もあります。

var.scss
//変数定義をまとめたファイル

//ブレークポイントを変数化
$pc: 796px; //パソコン
$sp: 420px; //スマホ
@mixin pc {
  @media screen and (min-width: ($pc)) {  //引数に上記の変数を入れる
    @content;
  }
}
@mixin sp {
  @media screen and (max-width: ($sp)) {  
    @content;
  }
}

↓呼び出し側のスタイル
※2022年で廃止された@importの代わりに@useを使用

index.scss
@use 'var';
//mixinで定義したmedia queryを呼び出す
@include var.pc {
    height: 105vh;
  }

@include var.sp {
    height: 90vh;
  }

もちろん、この記述が悪いわけではありません。

しかし、
ブレークポイントがさらに細分化されて数が増えると、
その分mixinの記述量も増やさないといけません。

例えば、
「PCやSPだけでなく、タブレットや最小サイズのスマホにも細かく対応したい」
といった場合、おそらくこうなります。

var.scss
$pc: 796px; //パソコン
$tablet: 795px; //タブレット
$sp: 420px; //スマホ
$small-screen: 320px; //最小スマホ
);
@mixin pc {
  @media screen and (min-width: ($pc)) { 
    @content;
  }
}
@mixin tablet {
  @media screen and (max-width: ($tablet)) {  
    @content;
  }
}
@mixin sp {
  @media screen and (max-width: ($sp)) {  
    @content;
  }
}
@mixin small-screen {
  @media screen and (max-width: ($small-screen)) {  
    @content;
  }
}

↓呼び出し側の記述

index.scss
@use 'var';

@include var.pc {
    height: 105vh;
  }
@include var.tablet {
    height: 100vh;
  }
@include var.sp {
    height: 90vh;
  }
@include var.small-screen {
    height: 80vh;
  }

可読性が低いわけではありませんが、実は定義する側の記述量をもう少し減らせます。
それが、次にご紹介する map-get() です。

ベストプラクティス

map-get()のおかげで、トータルの記述量がとても楽になります。
ブレークポイントの数がどれだけ増えても、
都度引数を渡すだけで再利用できるので、定義するmixinの数は1つだけでいいからです。

var.scss
//map型(key: value)でブレークポイントを定義する。
$breakpoints: (
  "pc": "screen and (min-width: 796px)",
  "tablet": "screen and (max-width: 795px)",
  "sp": "screen and (max-width: 420px)",
  "small-screen": "screen and (max-width: 320px)",
);

@mixin breakPoint($key) {
  @media #{map-get($breakpoints, $key)} {
    @content;
  }
}

↓呼び出し側のスタイル

index.scss
@use 'var';
  @include var.breakPoint("pc") {
    height: 105vh;
  }
  @include var.breakPoint("tablet") {
    height: 100vh;
  }
  @include var.breakPoint("sp") {
    height: 90vh;
  }
  @include var.breakPoint("small-screen") {
    height: 80vh;
  }

1、map-get()

map-get()は、第1引数に指定した変数から、第2引数で指定したkeyを元にその値を取得します。

例えば、varで定義したbreakpointに引数pcを指定すると、screen and (min-width: 796px)が返されます。

まとめ

レスポンシブ対応がほとんどないプロジェクトでしたら、ノーマルプラクティスでもいいのかもしれませんが、知っておくとすごく便利だと私は思いました。

まだまだ勉強不足な点もありますので、補足などありましたら遠慮なくコメントくださいませ。

Discussion