mediaを使ってNavigation SideMenuを実現する


# はじめに

[事故マップ](https://jikomap.site)というサービスを個人開発しています。

このWebアプリでは、画面サイズが小さい場合は自動的にSideMenuを閉じるという動きを入れてレスポンシブなUIを実現しています。

![Dec-13-2019 23-58-04.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200963/c9beb060-05a9-6405-3df0-7cd5cc941a92.gif "Dec-13-2019 23-58-04.gif")

これはCSSのmediaクエリを使えば簡単に実現できるのでその方法を紹介します。

# mediaとは

CSS の media を指定すると、一つまたは複数のメディアクエリの結果に基づいて、適用するスタイルシートを変えることができます。

例えば、スクリーンのサイズが 600px 以下の場合に背景の色を変えたい時は次のように指定をします。

``` css
@media screen and (max-width: 600px) {
	body {background-color: #99cc00;}
}
```

# Navigation SideMenuの作り方

まずは、HTML全体を3つに分けます。

- main : コンテンツを配置するエリア
- topnav : ナビゲーションバー
- sidenav : サイドメニュー


![スクリーンショット 2019-12-14 9.36.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/200963/59814386-a58b-0e58-2c72-eff2f9acbe47.png "スクリーンショット 2019-12-14 9.36.54.png")

ポイントは、topnavはmainの子要素として配置し、mainはsidenavのwidthの分だけleft-marginを取るようにします。

``` html
<html>
<head>
<style>
.main {
  margin-left: 160px;
}
.sidenav {
  width: 160px;
}
</style>
</head>
<body>
<div class="sidenav"></div>
<div class="main">
  <div class="topnav" id="myTopnav"></div>
</div>
</body>
</html>
```

次はmediaをを指定します。

やりたいことは、画面サイズが600px以下になったときにsidenavを非表示にしてmainをsidenavの分大きくすることです。

具体的には次のCSSの指定を行います。

- 非表示 → ```display: none;```

- サイズ変更 → ```margin-left: 0px```


``` css
@media screen and (max-width: 600px) {
  .sidenav {display: none;}
  .main {margin-left: 0px;}
}
```

# 最終的なコード例

``` html
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css">
<style>
body {
  margin: 0;
  font-family: Arial, Helvetica, sans-serif;
}

.topnav {
  overflow: hidden;
  background-color: #333;
}

.topnav a {
  float: left;
  display: block;
  color: #f2f2f2;
  text-align: center;
  padding: 14px 16px;
  text-decoration: none;
  font-size: 17px;
}

.topnav a:hover {
  background-color: #ddd;
  color: black;
}

.topnav a.active {
  background-color: #4CAF50;
  color: white;
}

.topnav .icon {
  display: none;
}

.main {
  margin-left: 160px; /* Same as the width of the sidenav */
  font-size: 28px; /* Increased text to enable scrolling */
  padding: 0px;
}

.sidenav {
  height: 100%;
  width: 160px;
  position: fixed;
  z-index: 1;
  top: 0;
  left: 0;
  background-color: #111;
  overflow-x: hidden;
  padding-top: 20px;
}

.sidenav a {
  padding: 6px 8px 6px 16px;
  text-decoration: none;
  font-size: 25px;
  color: #818181;
  display: block;
}

.sidenav a:hover {
  color: #f1f1f1;
}

@media screen and (max-width: 600px) {
  .topnav a.icon {
    float: right;
    display: block;
  }
  .sidenav {display: none;}
  .main {margin-left: 0px;}
}
</style>
</head>
<body>
<div class="sidenav">
  <a href="#about">About</a>
  <a href="#services">Services</a>
  <a href="#clients">Clients</a>
  <a href="#contact">Contact</a>
</div>
<div class="main">
  <div class="topnav" id="myTopnav">
    <a href="#home" class="active">Home</a>
    <a href="javascript:void(0);" class="icon" onclick="myFunction()">
      <i class="fa fa-bars"></i>
    </a>
  </div>
  <div style="padding-left:16px">
    <h2>Responsive Topnav Example</h2>
    <p>Resize the browser window to see how it works.</p>
  </div>
</div>
</body>
</html>
```

上記のコードは[ここで](https://www.w3schools.com/code/tryit.asp?filename=G0VYWVSOU7D8)すぐに試す事ができます。