こんにちは、Ryohei(@ityryohei)です!

ドロワーメニューというのは、ボタンやリンクのクリックでスライド表示されるメニューのことを指します。

ドロワーは日本語では引き出しという意味になります。

スマートフォンやタブレットといった小型端末でのサイトの閲覧を考慮して、メニューを非表示にしてメインコンテンツの表示領域を広くするためによく利用されています。

本記事では、レスポンシブに対応したドロワーメニューを実装してみたいと思います。

以下デモです。

デモ1が左側、デモ2が右側からスライド表示するドロワーメニューです。解像度が高い場合はサイドバーにメニューを固定して表示します。

Demo 1

Demo 2

jQueryを読み込む

GoogleのCDNを利用してjQueryを読み込みます。

CDNというのはContents Delivery Network(コンテンツ・デリバリー・ネットワーク)の略称で、ネットワークを経由してウェブコンテンツを利用するサービスを指します。ネットワークに接続されている機器であれば利用することができます。

CDNには有料、無料のものがありますが、jQueryのライブラリファイルは無料で利用できます。

jQueryのライブラリは以下の記述で読み込むことができます。

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>

左からスライド表示されるドロワーメニュー

以下、ドロワーメニューで使用するHTMLです。

wrap内にメインコンテンツを記述します。

HTML

<div id="drawer">
  <div id="drawer_btn">
    <span></span>
    <span></span>
    <span></span>
  </div>
  <div id="drawer_menu">
    <p id="drawer_header">Menu</p>
    <ul>
      <li><a href="#">Item 1</a></li>
      <li><a href="#">Item 2</a></li>
      <li><a href="#">Item 3</a></li>
      <li><a href="#">Item 4</a></li>
      <li><a href="#">Item 5</a></li>
    </ul>
  </div>
</div>

<div id="wrap">
  <header id="header">
    <h1>Header</h1>
  </header>
  <main id="main-contents">
    <h1>Main Contents</h1>
  </main>
  <footer>
  </footer>
</div>

CSS

以下、CSSです。

解像度が768以上の場合はサイドバーにメニューを固定表示するように記述しています。

body {
  margin: 0;
  padding: 0;
}

h1 {
  margin: 0;
  padding: 20px;
}

#header {
  height: 75px;
  border-bottom: 1px solid #000;
}

#drawer_header {
  font-size: 20px;
  padding: 15px 25px;
  color: #fff;
  font-weight: bolder;
}

#drawer_menu {
  position: fixed;
  left: 0;
  display: none;
  width: 250px;
  height: 100%;
  background: #000;
  overflow: auto;
}

#drawer_menu > ul > li > a {
  text-decoration: none;
  color: #fff;
}

#drawer_menu > ul {
  width: 250px;
  padding-left: 0;
  list-style-type: none;
}

#drawer_menu > ul > li {
  padding: 20px 25px;
}

#drawer_btn,
#drawer_btn span {
  position: fixed;
  top: 25px;
  right: 25px;
  transition: 0.3s;
}

#drawer_btn {
  width: 30px;
  height: 30px;
}

#drawer_btn span {
  position: absolute;
  left: 0;
  width: 100%;
  height: 4px;
  border-radius: 4px;
  background-color: #000000;
}

#drawer_btn span:nth-of-type(1) {top: 0;}
#drawer_btn span:nth-of-type(2) {top: 12px;}
#drawer_btn span:nth-of-type(3) {top: 24px;}

@media screen and ( min-width: 768px ) {
  #wrap {
    margin-left: 250px;
  }

  #header > h1 {
    margin: 0;
  }

  #drawer_btn {
    display: none;
  }
}

JS

以下、スクリプトです。

jQueryのon()でクリックを取得して、animate()を使って表示・非表示の切り替え処理を実行しています。

animat()については以下のリンク先で詳しく解説されています。多くのプロパティがありますので、詳細に関しては以下をご覧いただければと思います。

animate

$(function () {
  $('#drawer_btn').on('click', function () {
    $('#drawer_menu').animate({ width: 'toggle'}, 300);
  });

  $(window).on('load resize', function(){
    var w = $(window).width();
    if(w >= 768){
      $('#drawer_menu').animate({ width: 'show'}, 300);
    }else{
      $('#drawer_menu').animate({ width: 'hide'}, 300);
    }
  });
});

Copy & Paste

以下、コピペ用です。

<!DOCTYPE html>
<html>
<head lang="ja">
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Demo - Drawer Menu</title>
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
  <script>
  $(function () {
    $('#drawer_btn').on('click', function () {
      $('#drawer_menu').animate({ width: 'toggle'}, 300);
    });

    $(window).on('load resize', function(){
      var w = $(window).width();
      if(w >= 768){
        $('#drawer_menu').animate({ width: 'show'}, 300);
      }else{
        $('#drawer_menu').animate({ width: 'hide'}, 300);
      }
    });
  });
  </script>
  <style>
  body {
    margin: 0;
    padding: 0;
  }

  h1 {
    margin: 0;
    padding: 20px;
  }

  #header {
    height: 75px;
    border-bottom: 1px solid #000;
  }

  #drawer_header {
    font-size: 20px;
    padding: 15px 25px;
    color: #fff;
    font-weight: bolder;
  }

  #drawer_menu {
    position: fixed;
    left: 0;
    display: none;
    width: 250px;
    height: 100%;
    background: #000;
    overflow: auto;
  }

  #drawer_menu > ul > li > a {
    text-decoration: none;
    color: #fff;
  }

  #drawer_menu > ul {
    width: 250px;
    padding-left: 0;
    list-style-type: none;
  }

  #drawer_menu > ul > li {
    padding: 20px 25px;
  }

  #drawer_btn,
  #drawer_btn span {
    position: fixed;
    top: 25px;
    right: 25px;
    transition: 0.3s;
  }

  #drawer_btn {
    width: 30px;
    height: 30px;
  }

  #drawer_btn span {
    position: absolute;
    left: 0;
    width: 100%;
    height: 4px;
    border-radius: 4px;
    background-color: #000000;
  }

  #drawer_btn span:nth-of-type(1) {top: 0;}
  #drawer_btn span:nth-of-type(2) {top: 12px;}
  #drawer_btn span:nth-of-type(3) {top: 24px;}

  @media screen and ( min-width: 768px ) {
    #wrap {
      margin-left: 250px;
    }

    #header > h1 {
      margin: 0;
    }

    #drawer_btn {
      display: none;
    }
  }
  </style>
</head>
<body>
<div id="drawer">
  <div id="drawer_btn">
    <span></span>
    <span></span>
    <span></span>
  </div>
  <div id="drawer_menu">
    <p id="drawer_header">Menu</p>
    <ul>
      <li><a href="#">Item 1</a></li>
      <li><a href="#">Item 2</a></li>
      <li><a href="#">Item 3</a></li>
      <li><a href="#">Item 4</a></li>
      <li><a href="#">Item 5</a></li>
    </ul>
  </div>
</div>

<div id="wrap">
  <header id="header">
    <h1>Header</h1>
  </header>
  <main id="main-contents">
    <h1>Main Contents</h1>
  </main>
  <footer>
  </footer>
</div>
</body>
</html>

右からスライド表示されるドロワーメニュー

右からスライド表示されるドロワーメニューです。

HTMLとJSは同じものですが、CSSを少しだけ変更しています。

CSS

body {
  margin: 0;
  padding: 0;
}

h1 {
  margin: 0;
  padding: 20px;
}

#header {
  height: 75px;
  border-bottom: 1px solid #000;
}

#header > h1 {
  margin: 0 0 0 60px;
}

#drawer_header {
  font-size: 20px;
  padding: 15px 25px;
  color: #fff;
  font-weight: bolder;
}

#drawer_menu {
  position: fixed;
  right: 0;
  display: none;
  width: 250px;
  height: 100%;
  background: #000;
  overflow: auto;
}

#drawer_menu > ul > li > a {
  text-decoration: none;
  color: #fff;
}

#drawer_menu > ul {
  width: 250px;
  padding-left: 0;
  list-style-type: none;
}

#drawer_menu > ul > li {
  padding: 20px 25px;
}

#drawer_btn,
#drawer_btn span {
  position: fixed;
  top: 25px;
  left: 25px;
  transition: 0.3s;
}

#drawer_btn {
  width: 30px;
  height: 30px;
}

#drawer_btn span {
  position: absolute;
  left: 0;
  width: 100%;
  height: 4px;
  border-radius: 4px;
  background-color: #000000;
}

#drawer_btn span:nth-of-type(1) {top: 0;}
#drawer_btn span:nth-of-type(2) {top: 12px;}
#drawer_btn span:nth-of-type(3) {top: 24px;}

@media screen and ( min-width: 768px ) {
  #wrap {
    margin-right: 250px;
  }

  #header > h1 {
    margin: 0;
  }

  #drawer_btn {
    display: none;
  }
}
この記事を書いた人

Ryohei

Webエンジニア / ブロガー

福岡のWeb制作会社に務めるWebエンジニアです。エンジニア歴は10年程で、好きな言語はPHPとJavaScriptです。本サイトは私がインプットしたWebに関する知識を整理し、共有することを目的に2015年から運営しています。Webに関するご相談があれば気軽にお問い合わせください。

JavaScriptを基礎からしっかりと学びたい方へ

下記の参考書がおすすめです。私がJavaScript入門時に購入した書籍で、基礎から応用まで多様なサンプルを用いて解説されています。ページ数は多いですが、内容が伴っているのですらすら読めます。腰を据えて学びたい方に最良の一冊となっています。