レスポンシブデザインに欠かせないメディアクエリについて整理する

## はじめに
コーディングの勉強で色々なサイトを見ている時、実際に自分でコーディングする時、レビューをする時など、「ブレークポイントが768px以上の場合（※）は`min-width：768px；`だっけ? いや`max-width：768px；`か?」と一定の確率で迷うので、年末年始のお休みを使ってメディアクエリ周辺の知識を整理して、自分の頭をスッキリさせたいと思います。

> ※`min-width：767px；`か`max-width：768px；`のどちらかで、ウィンドウ幅768px以上を指定できます。どちらを選択するかは、他のCSSの記述方法によって変わってくると思います。

## メディアクエリとは
メディアクエリとは、メディアの特性（ブラウザのウィンドウ幅や高さ、デバイスの向き）などに応じて適用するスタイルを切り替えることができるCSS3で追加された仕様の1つです。

> 今回はレスポンシブデザインに使う部分のみ紹介していきますが、もっとメディアクエリについて学びたい方は[MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/CSS/Media_Queries/Using_media_queries)をご一読ください。

## ブレークポイントとは
ブレークポイントとは、スタイルが切り替わる画面サイズのことを指します。
![Web 1280 – 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/6364ec6e-200f-bd35-e52e-fdd0ec89c9bf.png)


### ブレークポイントの決め方
自分のサイトの用途やデザインに応じて細かく設定することも可能ですが、分岐が細かくなるほどその後の管理が煩雑になります。
だいたいはPC、タブレット、スマートフォンの3つのデバイスのサイズを想定し、ブレークポイントを２箇所（※）、もしくは1箇所（※）で設定しているのではないでしょうか。

画面サイズに関しては、それぞれ時代に応じたトレンドや自分のサイトの傾向があると思うので、適宜アナリティクスなどでデバイスシェアを調べて設定してみると良さそうです。

> ※ブレークポイントが２箇所：PC、タブレット、スマートフォンそれぞれで分岐
※ブレークポイントが1箇所：PC・タブレット合同、スマートフォンで分岐

## メディアクエリを使ってCSSを書いてみる
ブレークポイントを768pxとして、メディアクエリを使って実際にCSSを書いていきましょう。

### 画面サイズが768px未満の場合
![Web 1280 – 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/530526ed-7378-43de-2df2-44909e9370c4.png)

```css
@media (max-width: 767px){
 /* 画面サイズが768px未満の場合の設定 */
}
```
> `max-width`でブレークポイントの最大値を指定。
> `(max-width: ●●px)`は`●●px以下`という設定になるので、未満で設定する時は1px小さい値で設定する必要があります。

### 画面サイズが768px以上の場合
![Web 1280 – 3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/150c3cbf-8cc9-c88d-7d6c-cb346b38c60e.png)

```css
@media (min-width: 768px){
 /* 画面サイズが768px以上の場合の設定 */
}
```
> `min-width`でブレークポイントの最小値を指定。


### 画面サイズが768px以上、960px未満の場合
![Web 1280 – 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/8ae01cdb-7868-27d8-d989-f64e7a0a7603.png)

ブレークポイントを2箇所設定する場合は、下記のような記述になります。
1箇所の時に比べて若干ややこしくなるので、私はこの記述方法にならないようにしています。

```css
@media (min-width: 768px) and (max-width: 959px){
 /* 画面サイズが768px以上、960px未満の設定 */
}
```

### モバイルファーストインデックスに対応した書き方
cssのカスケーディングの特性を利用して、タブレットやPCの画面幅のスタイルを上書きしていきます。
下記画像のように上書きしていきます。
もし、スマートフォンと同じスタイルで問題ない場合は、上書きせずそのまま使用します。
![Web 1280 – 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351760/9e39354c-6377-7420-05c9-0cd78d9882c2.png)

<p class="codepen" data-height="265" data-theme-id="default" data-default-tab="css,result" data-user="yamaki0405" data-slug-hash="RwNZyZB" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;" data-pen-title="Media Queries">
  <span>See the Pen <a href="https://codepen.io/yamaki0405/pen/RwNZyZB">
  Media Queries</a> by yamaking (<a href="https://codepen.io/yamaki0405">@yamaki0405</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>

codepenで書いてみました。
ウィンドウ幅を伸縮させてどうなるかを実際に試してみていただけると嬉しいです。

## まとめ
メディアクエリ|意味|結果
---|---|---
@media (max-width: 767px)|ブレークポイントの最大値が767px|画面サイズが768px未満の場合のスタイルが指定できる
@media (min-width: 768px)|ブレークポイントの最小値が768px|画面サイズが768px以上の場合のスタイルが指定できる
@media (min-width: 768px) and (max-width: 959px)|ブレークポイントが768px〜959pxの間|画面サイズが768px以上、960px未満

「`max-width`で`ブレークポイントの最大値`、`min-width`で`ブレークポイントの最小値`ということの設定ができる」ということを頭に入れておくと、迷わずにすみそうですね。

<br>
以上です。
最後までお読みいただき、ありがとうございました。

---

## お世話になったサイト
- [MDN Web Docs](https://developer.mozilla.org/ja/docs/Web/CSS/Media_Queries/Using_media_queries)
- [メディアクエリーの初心者向けガイド｜MDN Web Docs](https://developer.mozilla.org/ja/docs/Learn/CSS/CSS_layout/Media_queries)
- [【初心者向け】メディアクエリを活用しモバイルファーストなレスポンシブWebデザインを構築する方法](https://design-plus1.com/tcd-w/2019/04/mediaquery-breakpoint.html)
- [レスポンシブデザインに必須！CSSでメディアクエリを書こう【初心者向】 | ビギナーズハイ](https://beginners-high.com/mediaqueries-css/)