ページ内リンクでハンバーガーメニューが閉じない原因と解決する方法

当ページのリンクには広告が含まれています。
  • URLをコピーしました!

スマホサイトでよく使われるハンバーガーメニューですが、ページ内リンクをクリックしてもメニューが閉じない、というトラブルに遭遇したことはありませんか?

この記事では、ページ内リンクをクリックした際にハンバーガーメニューを自動で閉じる方法について解説します。jQueryとバニラJavaScript(純粋なJS)の両方で実装方法を紹介します。


目次

この記事はこんな方におすすめ

  • ハンバーガーメニュー内のリンクをクリックしてもメニューが閉じない
  • 毎回ハンバーガーボタンでメニューを閉じなければならず面倒
  • UX(ユーザー体験)を向上させたい

完成デモ

まずは完成形の動作を確認したい方はこちらのCodePenをご覧ください。

See the Pen リンククリック時、メニューを閉じる by すずき (@k-suzuki3533) on CodePen.

なぜページ内リンクでメニューが閉じないのか?

通常、外部ページへのリンクをクリックすると、ページがリロードされるのでメニューも自然に消えます。

一方で、ページ内リンク(例:#about)はJavaScriptのイベントがなければ再読み込みされません。そのため、開いたメニューはそのまま残ってしまいます。

これを回避するには、リンククリック時にメニューを閉じる処理をJavaScriptで追加する必要があります。


実装ステップ

1. HTML構造を用意する

<!-- ハンバーガーボタン -->
<button class="hamburger" aria-label="メニューを開閉">☰</button>

<!-- ナビゲーションメニュー -->
<nav class="drawer">
  <ul>
    <li><a href="#about" class="drawer-link">About</a></li>
    <li><a href="#services" class="drawer-link">Services</a></li>
    <li><a href="#contact" class="drawer-link">Contact</a></li>
  </ul>
</nav>

2. CSSで開閉アニメーションを制御

.drawer {
  display: none;
  /* 他にもtransformなどでスライドインのUIにも可 */
}

.drawer.active {
  display: block;
}

.hamburger.active {
  /* ボタンがアクティブな状態の見た目(例:×に変化) */
}

3. JavaScriptで開閉動作を制御

【jQueryを使う場合】

<!-- jQuery CDN -->
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
$(function () {
  // ハンバーガー開閉
  $(".hamburger").on("click", function () {
    $(this).toggleClass("active");
    $(".drawer").toggleClass("active");
  });

  // ページ内リンククリックでメニューを閉じる
  $(".drawer-link").on("click", function () {
    $(".hamburger").removeClass("active");
    $(".drawer").removeClass("active");
  });
});

【バニラJavaScriptを使う場合】

document.addEventListener("DOMContentLoaded", () => {
  const hamburger = document.querySelector(".hamburger");
  const drawer = document.querySelector(".drawer");
  const links = document.querySelectorAll(".drawer-link");

  // 開閉切り替え
  hamburger.addEventListener("click", () => {
    hamburger.classList.toggle("active");
    drawer.classList.toggle("active");
  });

  // リンククリックで閉じる
  links.forEach(link => {
    link.addEventListener("click", () => {
      hamburger.classList.remove("active");
      drawer.classList.remove("active");
    });
  });
});

まとめ

ページ内リンクでハンバーガーメニューが閉じない問題は、JavaScriptのひと工夫で簡単に解決できます。

ポイントは以下の通り

  • ページ内リンクではページ遷移がないため、手動でメニューを閉じる必要がある
  • jQueryまたはバニラJSで、リンククリック時にクラスを外せばOK
  • スマホ閲覧時のUX改善にもつながる

ユーザーのストレスを軽減するこうした細かな配慮が、サイトの信頼性や使いやすさを大きく左右します。ぜひ実装してみてください。

Web制作に使えるおすすめの書籍

私が実際に購入して役に立った書籍を紹介します。
気になる本があればぜひ読んでみてください!

この記事が気に入ったら
いいね または フォローしてね!

  • URLをコピーしました!
  • URLをコピーしました!
目次