0
1

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.

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

Posted at

はじめに

事故マップというサービスを個人開発しています。

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

Dec-13-2019 23-58-04.gif

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

mediaとは

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

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

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

Navigation SideMenuの作り方

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

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

スクリーンショット 2019-12-14 9.36.54.png

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

<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

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

最終的なコード例

<!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>

上記のコードはここですぐに試す事ができます。

0
1
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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?