ハンバーガーメニューの作り方(JQuery版)

目次

ハンバーガーメニューとは

ハンバーガーメニューとはWebサイトやアプリでよく見かける三本線のボタンを指します。

ハンバーガーメニューをクリックするとメニューが表示されるのが一般的な使い方です。

PC版Webサイトの場合、画面が大きいのでナビゲーションメニューを全て表示させることもできますが、タブレット版やスマートフォン版Webサイトの場合、小さい画面の中にナビゲーションメニューを表示する余裕がありません。なので、ナビゲーションメニューは画面の外に配置して、ハンバーガーメニューをクリックすると表示するようにするわけです。

jQueryを使ったハンバーガーメニュー

今回はアクセシビリティを考慮してbuttonタグを使用して作成しています。

HTML

<!-- ハンバーガー(3本線)メニュー -->
<button class="menu">
  <!-- 1本目 -->
  <span class="menu-line"></span>
  <!-- 2本目 -->
  <span class="menu-line"></span>
  <!-- 3本目 -->
  <span class="menu-line"></span>
</button>

<!-- メニュー画面 -->
<nav class="nav">
  <ul class="nav-list">
    <li class="nav-item"><a href="" class="nav-link">Top</a></li>
    <li class="nav-item"><a href="" class="nav-link">Consept</a></li>
    <li class="nav-item"><a href="" class="nav-link">About</a></li>
    <li class="nav-item"><a href="" class="nav-link">Aceess</a></li>
    <li class="nav-item"><a href="" class="nav-link">Contact</a></li>
  </ul>
</nav>

<!-- 以下は</body>の直前に設置 -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<script>
  <!-- ここにJavaScriptの内容を設置 -->
</script>

CSS

/* メニューボタン【通常時】 */
.menu{
  /* 画面に固定 */
  position: fixed;
  /* 上から10px */
  top: 10px;
  /* 右から10px */
  right: 10px;
  /* 重なり順(優先順位)を変更 */
  /* 数値が大きいほど優先順位が高い */
  z-index: 3;
  /* 横幅 */
  width: 50px;
  /* 高さ */
  height: 50px;
  /* 背景色 */
  background-color: rgba(102, 102, 102, 0.5);
  /* 正円 */
  border-radius: 50%;
  /* ボタンの罫線を削除 */
  border: none;
  /* 余白込み */
  box-sizing: border-box;
}
/* マウスオーバーした場合 */
.menu:hover{
  /* マウスオーバーした時のアイコンを変更 */
  cursor: pointer;
  /* 背景色を変更 */
  background-color: rgba(102, 102, 102, 1);
}
/* フォーカス(タブ移動)した場合 */
.menu:focus{
  /* 背景色を変更 */
  background-color: rgba(102, 102, 102, 1);
  /* 罫線を削除 */
  outline: none;
  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
/* 3本線の基本設定 */
.menu-line{
  /* spanはinlineが初期値なのでblockに変更 */
  display: block;
  /* それぞれの位置を設定するためにabsoluteに変更 */
  position: absolute;
  /* 右から12px */
  right: 12px;
  /* 線の横幅 */
  width: 25px;
  /* 線の高さ */
  height: 2px;
  /* 線の色(背景色で設定) */
  background-color: #FFF;
  /* 四つ角の丸み */
  border-radius: 4px;
  /* 0.5秒で変化 */
  transition: all .5s;
}
/* 1本目の線 */
.menu-line:nth-child(1){
  /* 上から17px */
  top: 17px;
}
/* 2本目の線 */
.menu-line:nth-child(2){
  /* 上から25px */
  top: 25px;
}
/* 3本目の線 */
.menu-line:nth-child(3){
  /* 上から33px */
  top: 33px;
}

/* メニューボタン【クリック時】 */
/* 1本目の線 */
.active .menu-line:nth-child(1){
  /* 8px下にズラし-45度傾ける */
  transform: translateY(8px) rotate(-45deg);
}
/* 2本目の線 */
.active .menu-line:nth-child(2){
  /* 透明化して見えなくする */
  opacity: 0;
}
/* 3本目の線 */
.active .menu-line:nth-child(3){
  /* 8px上にズラし45度傾ける */
  transform: translateY(-8px) rotate(45deg);
}

/* メニュー画面【通常時】 */
.nav{
  /* 画面を固定 */
  position: fixed;
  /* 上にくっつける */
  top: 0;
  /* 横幅の分だけ画面の外にズラす */
  left: -200px;
  /* 重なり順(優先順位)を変更 */
  z-index: 2;
  /* 横幅 */
  width: 200px;
  /* 高さ */
  height: 100vh;
  /* 背景色 */
  background: #666;
  /* 0.5秒で変化 */
  transition: all .5s;
}
.nav-list{
  /* ul/liのマーカーを削除 */
  list-style: none;
}
.nav-link{
  /* リンクの文字色 */
  color: #FFF;
  /* リンクの下線を削除 */
  text-decoration: none;
}
.nav-link:hover{
  /* リンクがマウスオーバーした時に文字の透明度が70%に変化 */
  opacity: .7;
}
/* メニュー画面【クリック時】 */
.nav.active {
  /* ズラしていた分を戻して画面に表示させる */
  left: 0;
}

JavaScript

$(function(){
  //メニューボタンをクリックしたら
  $(".menu").click(function(){
    //「.menu」に「.active」を追加・削除
    $(this).toggleClass("active");
    //「.nav」に「.active」を追加・削除
    $(".nav").toggleClass("active");
  });
  //メニュー内のリンクをクリックしたら
  $(".nav-link").click(function(){
    //「.menu」から「.active」を削除
    $(".menu").removeClass("active");
    //「.nev」から「.active」を削除
    $(".nav").removeClass("active");
  });
});

実装

See the Pen hamburger-menu1 by DREAM NET WORKS (@dnw) on CodePen.