ZeroPlus Media > Web制作 > HTML/CSS > 【jQuery】ハンバーガーメニューの作り方

【jQuery】ハンバーガーメニューの作り方

HTML/CSS

2022/02/12

2022/09/07

jQuery ハンバーガーメニュー記事サムネイル

この記事ではHTML,CSS,jQueryを用いた「ハンバーガーメニュー」の作り方を解説します。

SP(モバイル)サイズではハンバーガーメニューを、PCではナビゲーションメニューが表示されるようにしていきます。

この記事で身につく内容
  • jQueryを使ったハンバーガーメニューの作り方
  • レスポンシブによるSPとPCの表示切替

 

なお関連記事として、下記の記事で「JavaScriptを使ったハンバーガーメニュー」について解説していますので合わせて一読ください。

\ 完全無料のプログラミングスクール /

30日間で学びきれる
プログラミングスクールZeroPlus Gate

完全無料のプログラミングスクール 30日間でWebサイトが作れるようになる 50本以上の動画教材をいつでも視聴可能 毎週専属メンターとの面談で悩みを解決 現役エンジニアに質問し放題
ZeroPlus Gate紹介画像

公式サイトはこちら

サンプルのダウンロード

下記のリンクからサンプルをダウンロードしましょう。

サンプルファイル

ファイルを開くと、下記2つのファイルが入っています。

  • 「code」→HTML・CSSファイル・画像ファイルが入っているファイル
  • 「mock」→モックアップ画像

下記からサンプルコードを確認することもできます。

See the Pen jQueryを使ったハンバーガーメニュー by ZeroPlus (@zeroplus-programming) on CodePen.

デザインの確認

エディタでファイルを開くと、mockフォルダの中にモックアップ画像ファイルが3つ入っています。全体のデザインを確認しましょう。

SP(モバイル)デザイン(sp-mock.png)

スマホ表示

ハンバーガーメニューをクリックしたときにナビゲーションメニューが出るようにしていきます。

PCのデザイン(pc-mock.png)

ハンバーガーメニューの作り方pcデザイン

PCデザインのときはハンバーガーメニューは非表示、ナビゲーションメニューが表示されるようにしていきます。

コーディングしてみよう

コーディングを行う際はいきなりコードを記述せず、サイトのデザインを確認します。

  • サイトのデザインを確認する
  • HTMLでサイトの構造を記述する
  • CSSでサイトの見た目を整えていく
  • jQueryで動きをつけていく

上記の流れを意識して、実際にコーディングを行っていきます。

全体のレイアウト

HTMLで構造を記述する

まずは大枠を作成します。

<body>
  <div class="container">
    <header class="header">
    </header>
    <main>
      <div class="main">
        メインコンテンツエリア
      </div>
    </main>
    <footer class="footer">
      <div>
        フッターエリア
      </div>
    </footer>
  </div>
</body>

containerクラスの中にheader、footer、main、を記述します。

CSSでサイトの見た目を整えていく

今回のサイトを制作するにあたってこちらのサイトを参考にreset.cssを作成し、linkタグでreset.cssを適用します。

reset.cssは各ブラウザで適用されているデフォルトスタイルを上書きして、各ブラウザのスタイルを揃える役割があります。

reset.cssはstyle.cssより先に記述しています。

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title> Document </title>
  <link rel="stylesheet" href="reset.css">
 <!--style.cssの前にreset.cssを読み込む -->
  <link rel="stylesheet" href="style.css">
</head>

ヘッダーとフッター、mainタグ内のスタイルを整える

style.cssにmainタグ、footerタグにスタイルをあてます。

/* 調整用スタイル */

a {
  text-decoration: none;
}
ul,
li {
  list-style: none;
}

main {
  background-color: #f1f1f1;
  height: 800px;
  display: flex;
}

.main {
  margin: auto;
}
.footer {
  background-color: #f6f6f6;
  height: 200px;
  display: flex;
}
.footer div {
  margin: auto;
}

aタグはデフォルトでアンダーラインが表示されるので、text-decoration: none;を用いてアンダーラインを非表示にします。

ulタグ、liタグも同様に「・」がデフォルトで文頭に表示されるので、list-style: none;を用いて非表示にします。

続いてヘッダーにスタイルをあてます。

/* ヘッダー */

.header {
  background-color: white;
  width: 100%;
  height: 50px;
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  z-index: 999;
}

スクロールしてもヘッダーを追従させたいので、position: fixed;を適用します。

また、ヘッダーは表示順を上にしたいのでz-index: 999;を指定します。

ZeroPlusgate50教材の動画

ヘッダーを作る

HTMLで構造を記述する

headerタグの中を作ります。

<header class="header">
      <div class="header__inner">
        <h1 class="header__title header-title">
          <a href="#">
            <img src="images/logo-black.png" alt="ロゴ画像">
          </a>
        </h1>

        <nav class="header__nav nav">
        </nav>

        <button class="header__hamburger hamburger">
        </button>
      </div>
</header>

ヘッダーの中の左右の余白を確保するため、header-innerクラスを入れています。h1タグの中にはimgタグでロゴ画像を適用しています。ロゴ画像をクリックしたらトップに戻りたいのでimgタグをaタグで囲います。

ナビゲーションメニュー用にnavタグを記述します。

ハンバーガーメニューはbuttonタグで作成します。buttonタグで作る理由はフォーカスを適用させるためです。divタグで作るとフォーカスが当たりません。

CSSでヘッダーの見た目を整えていく

2022年現在、モバイルファーストで記述することが推奨されているので、SP(モバイル)サイズから適用していきます。

style.cssに下記のように記述します。

.header__inner {
  padding: 0 20px; /*左右の余白確保*/
  display: flex; /*ロゴとハンバーガーメニューを横に並べる*/
  align-items: center;
  justify-content: space-between;
  height: inherit; /*親要素の高さを継承*/
  position: relative;
}

/* ヘッダーのロゴ部分 */
.header__title {
  width: 80px;
}

.header__title img {
  display: block;
  width: 100%;
  height: 100%;
}
/* ヘッダーのナビ部分 */
.header__nav {
  position: absolute;
  right: 0;
  left: 0;
  top: 0;
  width: 100%;
  height: 100vh;
  transform: translateX(100%); 
  background-color: #fff; /*ハンバーガーメニュークリック時のナビゲーションメニュー背景色*/
  transition: ease .4s; /*ハンバーガーメニュークリック時のナビゲーションメニュー出現を遅延*/
}
/* ハンバーガーメニュー */
.header__hamburger {
  width: 48px;
  height: 100%;
}

.hamburger {
  background-color: transparent; /*buttonタグデフォルトスタイルを打ち消し*/
  border-color: transparent; /*buttonタグデフォルトスタイルを打ち消し*/
  z-index: 9999;
}

header-innerクラスではロゴの左側とハンバーガーメニューの右側に余白をpaddingで確保しています。

ロゴとハンバーガーメニューを横並びにしたいのでflexboxを利用しています。

header__navクラスはtransform: translateX(100%);でコンテンツよりも右側に移動させておきます。

hamburgerクラスはフォーカスを当てたいのでbuttonタグを使用します。その際にbuttonタグにデフォルトで当たっている一部のスタイルを、別のスタイルで打ち消します。

ハンバーガーメニューを作る

HTMLで構造を記述する

ハンバーガーメニューを作ります。

<button class="header__hamburger hamburger">
    <span></span>
    <span></span>
    <span></span>
</button>

ハンバーガーメニューの三本線を表現するためにspanタグを使用します。

CSSでハンバーガーメニューの見た目を整えていく

/* ハンバーガーメニューの線 */
.hamburger span {
  width: 100%;
  height: 1px;
  background-color: #000;
  position: relative;
  transition: ease .4s; /*ハンバーガーメニュークリック時の三本線の動きを遅延*/
  display: block;
}

.hamburger span:nth-child(1) {
  top: 0;
}

.hamburger span:nth-child(2) {
  margin: 8px 0;
}

.hamburger span:nth-child(3) {
  top: 0;
}

ハンバーガーメニューの三本線をpositionで微調整します。線はwidthとheight、線の色をbackground-colorで表現しています。

ハンバーガーメニュークリック後の動きを作る

HTMLで構造を記述する

<nav class="header__nav nav" id="js-nav">
  <ul class="nav__items nav-items">
  </ul>
</nav>


<button class="header__hamburger hamburger active" id="js-hamburger">
  <span></span>
  <span></span>
  <span></span>
</button>

ハンバーガーメニューをクリックしたらactiveクラスを付与するようにしていきます。activeクラスが付いた状態のレイアウトを画面で確認しながらスタイルを整えたいので、hamburgerクラスにactiveクラスを併記しておきます。

「ハンバーガーメニューをクリックしたらactiveクラスを付与する」というのを、jQueryで制御したいのでidでjs-hamburgerを付けておきます。js-〇〇 というid名は、JavaScript(jQuery含む)で制御するという意味になります。基本的にjs-〇〇はCSSでスタイルを付けません。

navタグもjQueryで動きを制御したいのでidを付与します。

CSSでハンバーガーメニューの見た目を整えていく

* ハンバーガーメニュークリック後のスタイル */
.header__nav.active {
  transform: translateX(0);
}

.hamburger.active span:nth-child(1) {
  top: 5px;
  transform: rotate(45deg);
}

.hamburger.active span:nth-child(2) {
  opacity: 0;
}

.hamburger.active span:nth-child(3) {
  top: -13px;
  transform: rotate(-45deg);
}

hamburgerクラスにactiveクラスが付いた状態のスタイルを記述していきます。

アクティブクラスがついたら三本線の真ん中はopacityで透明にします。
他の線はtransform: rotate(○○deg);で回線させ「×」になるように調整します。

ハンバーガーメニュークリック後activeクラスが付いたら、transform: translateX(0);にして元の位置に戻るように設定しておきます。

activeクラスが付いた状態のスタイルを確認したら、HTMLからactiveクラスを削除します。

このように、jQueryやJavaScriptを使って特定のクラス(今回の場合はactiveクラス)が付与された後のレイアウトを整えたい場合は、「HTML側にそのクラスを付けた状態でCSSで適用していく」やり方がおすすめです!

ZeroPlusgate50教材の動画

ハンバーガーメニュークリック時の動きを制御する

ここからjQueryを使ってハンバーガーメニューの動きを制御していきます。

jQueryJavaScriptでできることをより簡単な記述で実現できる便利なライブラリです。JavaScriptでは数十行の記述も、jQueryでは数行で済むというメリットがあります。

jQueryの導入

jQueryを使用する際は下記の2つの方法があります。

  • ファイルをローカルで読み込む
  • CDNで読み込む

 

CDNで読み込む方法が簡単なので、この記事ではCDNを使っていきます。CDNとは「Content Delivery Network」の略で外部ファイルをリンク1つで使用することができる仕組みです。

jQueryのCDNはこちらの公式サイトから利用することができます。

jQueryのCDNはHTMLのbodyタグの直前で、かつ、main.jsの直前に読み込みたいので下記のように記述します。

    <footer class="footer">
      <div>
        フッターエリア
      </div>
    </footer>
  </div>
  <!-- jQueryのCDNをmain.jsの直前の記述 -->
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
  <script src="main.js"></script>
</body>

これでjQueryを使用する環境が整いました。なお、main.jsの後にCDNを読み込ませてしまうとjQueryが動作しません。CDNを読み込ませる場合は、必ずメインの処理を記述するファイルの直前に読み込みましょう。

ハンバーガーメニュークリック時の動作

jQueryを使う準備ができたら、main.jsファイルに下記の記述をします。

const ham = $('#js-hamburger'); //js-hamburgerの要素を取得し、変数hamに格納
const nav = $('#js-nav'); //js-navの要素を取得し、変数navに格納
ham.on('click', function () { //ハンバーガーメニューをクリックしたら
  console.log("ok!"); //コンソール画面でokというメッセージが出る
 
});

$(ドルマーク)」はjQueryにおいて関数や変数を定義する際に使用されます。

上記で記述した$は全てjQueryに置き換えたとしても同じように動作します。しかしjQueryと記述するとコードが長くなるので$で代用している形になっています。

 

ナビゲーションメニューを変数navに、ハンバーガーメニューを変数hamに格納します。

onメソッドのクリックイベントを用いてクリックされたかどうかの判定をします。今回はハンバーガーメニューをクリックしたらクリックイベントを発動させたいので、先ほど作成した変数hamを使用していきます。

「ハンバーガーメニューをクリックしたら」クリックイベントが発動するか確認するため、console.logを使って確認していきます。

コンソール画面

コンソール画面で「ok!」のメッセージが表示されればOKです。もしこの時点で表示されなければ、下記の理由が考えられます。

  • 要素が取得できていない(スペルミスなど)
  • functionなどの記述ミス
  • HTML側でidを付けていない(js-〇〇)
  • HTML側のid名のスペルミス
  • HTML側のid名とdocument.querySeletorで取得するid名が一致していない

「ok!」のメッセージが表示されたらクリックイベントの確認が取れましたので、クリックイベントの中を作っていきます。

ハンバーガーメニューをクリック時の実装

console.logは不要なので削除します。

const ham = $('#js-hamburger');
const nav = $('#js-nav');
ham.on('click', function () { //ハンバーガーメニューをクリックしたら
  ham.toggleClass('active'); // ハンバーガーメニューにactiveクラスを付け外し
  nav.toggleClass('active'); // ナビゲーションメニューにactiveクラスを付け外し
});

 

toggleClassメソッドはjQueryのメソッドの1つで、クラスのつけ外しを行うことができます。その他によく使われるメソッドでは以下のものがあります。

  • addClassメソッド:クラスを付与する
  • removeClassメソッド:クラスを外す

toggleClassメソッドは、addClassメソッドとremoveClassメソッドの切り替えを行っています。

 

この状態でクリックするとハンバーガーメニューの三本線が「×」に代わるようになります。そしてナビゲーションの白背景(header__navクラス)が右側から出現します。

ナビゲーションメニューを作る

HTMLで構造を記述する

ナビゲーションメニューを作ります。

<nav class="header__nav nav" id="js-nav">
  <ul class="nav__items nav-items">
    <li class="nav-items__item"><a href="">メニュー</a></li>
    <li class="nav-items__item"><a href="">メニュー</a></li>
    <li class="nav-items__item"><a href="">メニュー</a></li>
    <li class="nav-items__item"><a href="">メニュー</a></li>
  </ul>
</nav>

ナビゲーションメニューはulタグ、liタグで作っていきます。メニューをクリックしたらリンク先に遷移するようにaタグも記述します。

CSSでナビゲーションメニューのスタイルを整える

.nav-items {
  padding: 0;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}

/* ナビのリンク */
.nav-items__item a {
  color: black;
  width: 100%;
  display: block;
  text-align: center;
  font-size: 20px;
  margin-bottom: 24px;
}

.nav-items__item:last-child a {
  margin-bottom: 0;
}

メニュー間の余白を調整するため、margin-bottomで余白を設けます。最後のメニューに関しては、下余白は不要なのでlast-childでmargin-bottomを0にして余白を打ち消します。

これでSP(モバイル)サイズは完成しました。次にレスポンシブ対応するためにPCサイズを作ります!

レスポンシブでPCサイズを作る

レスポンシブではメディアクエリを使用します。
モバイルファーストかPCファーストかで書き方が異なります。

  • @medeia screen and (min-width: ○○px) { }・・・モバイルファースト
  • @medeia screen and (max-width: ○○px) { }・・・PCファースト

今回は960pxからPCサイズに設定したいので、@medeia screen and (min-width: 960px) とします。

CSSでPCサイズのスタイルを整える

書き方はいろいろありますが、ここではSP時のスタイルの直下にPC時のスタイルを記述する形にします。ブロックごとに分けることで、あとでスタイルが変更になった場合でも修正しやすくなります。

なお@media screen and (min-width: 960px)の中でまとめて適用しても大丈夫です。

/* ヘッダーのロゴ部分 */
.header__title {
  width: 80px;
}
@media screen and (min-width: 960px) {
  .header__title {
    width: 120px;
  }
}

/* ヘッダーのナビ部分 */
.header__nav {
  position: absolute;
  right: 0;
  left: 0;
  top: 0;
  width: 100%;
  height: 100vh;
  transform: translateX(100%);
  background-color: #fff;
  transition: ease .4s;
}
@media screen and (min-width: 960px) {
  .header__nav {
    position: static;
    transform: initial;
    background-color: inherit;
    height: inherit;
    display: flex;
    justify-content: end;
    width: 50%;
  }
}


/*PC時のナビゲーションメニュー、横並びにする*/
@media screen and (min-width: 960px) {
  .nav__items {
    width: 100%;
    display: flex;
    align-items: center;
    height: initial;
    justify-content: space-between;
  }
}

.nav-items {
  padding: 0;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%,-50%);
}
@media screen and (min-width: 960px) {
.nav-items {
   position: inherit;
   top: 0;
   left: 0;
   transform: translate(0, 0);
  }
}


/* ナビのリンク */
.nav-items__item a {
  color: black;
  width: 100%;
  display: block;
  text-align: center;
  font-size: 20px;
  margin-bottom: 24px;
}
@media screen and (min-width: 960px) {
.nav-items__item a {
   margin-bottom: 0;
  }
}

/*ハンバーガーメニュー*/
.hamburger {
  background-color: transparent;
  border-color: transparent;
  z-index: 9999;
}
@media screen and (min-width: 960px) {
  /*PC時非表示にする*/
  .hamburger {
    display: none;
  }
}

ハンバーガーメニューはPC時非表示にしたいのでdisplay: none;を適用します。

ナビゲーションメニューはSP時縦並びになっていましたが、PC時では横並びに変更したいのでflexboxを適用していきます。

これでPC時のレイアウトが完成しました!

まとめ

この記事で紹介したハンバーガーメニューの作り方は一つの例です。JavaScriptでもjQueryでもハンバーガーメニューを作成することができます。

ハンバーガーメニューは多くのWebサイトで取り入れられているパーツの1つです。

デザインによって、さまざまな実装が求められるので自分の手でカスタマイズできるようになりましょう。

\ 完全無料のプログラミンスクール /

30日間で学びきれる
プログラミングスクールZeroPlus Gate

完全無料のプログラミングスクール 30日間でWebサイトが作れるようになる 50本以上の動画教材をいつでも視聴可能 毎週専属メンターとの面談で悩みを解決 現役エンジニアに質問し放題
ZeroPlus Gate紹介画像

公式サイトはこちら

ZeroPlus Media読者限定! 無料質問対応!

毎月、先着20名限定で現役エンジニアによる質問対応を行なっています。

以下の手順に沿って質問対応を行うことができます。

  1. 下記リストから質問日時を選択
  2. メールを受け取る
  3. メールからmtgに参加

※質問日程が合わない場合はZeroPlus Media管理者のTwitterアカウントのDMまでご連絡ください。

\ 学んだことをSNSでシェアしよう /

おすすめのタグ

この記事を書いた人

ZeroPlusMedia変種部

ZeroPlusMedia編集部

ZeroPlusは、「フリーランス特化型プログラミングスクール」です。ZeroPlusMediaでは、フリーランスとして活躍する際に役立つ有益なプログラミングやWeb制作に関する情報を発信しています。

質問について

ZeroPlus Media読者限定で質問対応をおこなっています。以下の2つの方法で質問を受け付けています。

選べる2つの質問方法

1

Google Foam(テキスト)で質問

フォーム送信

メールで解答

formで質問
2

Google meet(オンラインmtg)で質問

日時選択

メールを受け取る

メールからmtgに参加

meetで質問
ZeroPlus Gateバナー

あなたの目的に合わせた2つのサービス

あなたの目的に合わせたZeroPlusの2つのサービス
基礎からフリーランスレベルまで本質的な学びを提供しています

完全無料!30日間で学びきれる
プログラミンスクールZeroPlus Gate

  • お金をかけずに、学習を進めたい
  • Webサイトを作れるようになりたい
  • メンターや講師に質問しながら学習したい

詳しくはこちらから

フリーランス特化型
プログラミングスクール ZeroPlus

  • プログラミング学習で悩んでいる
  • 仲間と一緒に学習したい
  • フリーランスとしての総合的な力を養いたい

詳しくはこちらから