【jQuery】ドロワーメニュー

Image

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

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

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

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

以下デモです。

デモ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;
  }
}