ナビゲーションメニュー jQuery

ナビゲーションメニュー jQueryの実装方法

この記事では、jQueryを使用してナビゲーションメニューを実装する方法について解説しています。具体的なコード例や機能を紹介し、簡単にナビゲーションメニューを作成できるようにします。

【jQuery入門】実務でよく見る!実装サンプル集

jQueryは、Webサイトに動きやインタラクティブ性を与えるためのJavaScriptライブラリです。実務では様々な場面で活用されており、多くのWebサイトで採用されています。

今回は、jQuery初心者の方に向けて、実務でよく見かける10個の実装サンプルをご紹介します。各サンプルはCodePenで実際に動作を確認できますので、ぜひご自身のWebサイトにも取り入れてみてください。

jQueryを使ったナビゲーションメニューの基本

jQueryは、簡単にJavaScriptの操作を行うためのライブラリです。このセクションでは、ナビゲーションメニューを作成するための基本的なHTML構造とjQueryの使い方について説明します。

要素 説明
ul ナビゲーションメニューのリストを作成します。
li 各ナビゲーションリンクを表します。
a リンクの実際の要素を作成します。

以下は、ナビゲーションメニューの基本的なHTMLとjQueryのコード例です。

<nav>
  <ul>
    <li><a href="#home">ホーム</a></li>
    <li><a href="#about">私たちについて</a></li>
    <li><a href="#services">サービス</a></li>
    <li><a href="#contact">お問い合わせ</a></li>
  </ul>
</nav>

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script>
  $(document).ready(function() {
    $("nav a").click(function(event) {
      event.preventDefault();
      var target = $(this).attr("href");
      $("html, body").animate({ scrollTop: $(target).offset().top }, 500);
    });
  });
</script>

アニメーション効果の追加

ナビゲーションメニューにアニメーション効果を追加することで、ユーザー体験を向上させることができます。クリック時のスムーズな遷移を実現するためのコツを以下に示します。

上記のコード例では、jQueryの`animate`メソッドを使用して、スクロールをスムーズに行います。この効果を追加することで、ユーザーはナビゲーションがより直感的だと感じるでしょう。

レスポンシブデザインの考慮

モバイルデバイスに対応したナビゲーションメニューを作成するためのポイントを解説します。レスポンシブデザインには、CSSメディアクエリやjQueryを活用する方法があります。

以下は、CSSメディアクエリの一例です。

@media (max-width: 768px) {
  nav ul {
    display: none;
    flex-direction: column;
  }
  nav.active ul {
    display: flex;
  }
}

このコードを使用して、ウィンドウの幅が768px以下の場合にナビゲーションメニューを非表示にし、クリック時に表示することができます。

参考とした記事: Creating A Responsive Navigation Menu

【jQuery入門】実務でよく見る!実装サンプル集

jQueryは、Webサイトに動きやインタラクティブ性を与えるためのJavaScriptライブラリです。実務では様々な場面で活用されており、多くのWebサイトで採用されています。

今回は、jQuery初心者の方に向けて、実務でよく見かける10個の実装サンプルをご紹介します。各サンプルはCodePenで実際に動作を確認でき、コードも合わせて掲載していますので、ぜひご自身のWebサイトにも取り入れてみてください。

1. ハンバーガーメニュー

レスポンシブデザインで必須とも言えるハンバーガーメニュー。クリックするとナビゲーションメニューがスライド表示される実装は、jQueryで簡単に実現できます。

HTML:

<nav class="nav">
  <div class="hamburger">
    <span></span>
    <span></span>
    <span></span>
  </div>
  <ul class="menu">
    <li><a href="#">Home</a></li>
    <li><a href="#">About</a></li>
    <li><a href="#">Service</a></li>
    <li><a href="#">Contact</a></li>
  </ul>
</nav>

CSS:

.nav {
  position: relative;
}

.hamburger {
  width: 30px;
  height: 20px;
  cursor: pointer;
}

.hamburger span {
  display: block;
  width: 100%;
  height: 2px;
  background-color: #333;
  margin-bottom: 5px;
  transition: 0.3s;
}

.menu {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  background-color: #fff;
}

.nav.open .hamburger span:nth-child(1) {
  transform: rotate(45deg) translate(5px, 5px);
}

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

.nav.open .hamburger span:nth-child(3) {
  transform: rotate(-45deg) translate(5px, -5px);
}

.nav.open .menu {
  display: block;
}

jQuery:

$('.hamburger').on('click', function() {
  $(this).parent('.nav').toggleClass('open');
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • ハンバーガーメニューをクリックすると、openクラスがハンバーガーメニュー自身とナビゲーションメニューに付与/削除されます。

  • openクラスが付与されると、CSSでハンバーガーメニューの形状が変化し、ナビゲーションメニューが表示されるように設定されています。

2. スムーススクロール

ページ内リンクをクリックした際に、該当セクションへ滑らかにスクロールするスムーススクロール。ユーザー体験を向上させるための定番機能です。

HTML:

<ul class="menu">
  <li><a href="#section1">Section 1</a></li>
  <li><a href="#section2">Section 2</a></li>
  <li><a href="#section3">Section 3</a></li>
</ul>

<section id="section1">
  <h2>Section 1</h2>
  <!-- コンテンツ -->
</section>

<section id="section2">
  <h2>Section 2</h2>
  <!-- コンテンツ -->
</section>

<section id="section3">
  <h2>Section 3</h2>
  <!-- コンテンツ -->
</section>

jQuery:

$('a[href^="#"]').on('click', function() {
  var href= $(this).attr("href");
  var target = $(href == "#" || href == "" ? 'html' : href);
  var position = target.offset().top;
  $("html, body").animate({scrollTop:position}, 600, "swing");
  return false;
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • $('a[href^="#"]')で、ページ内リンク(href属性値が#で始まる<a>要素)をすべて取得します。

  • クリックされたリンクのhref属性値から、スクロール先のセクション要素を取得し、その位置までanimate()メソッドで滑らかにスクロールします。

  • return false;を記述することで、ページ内リンクのデフォルト動作(ページの再読み込み)を無効化しています。

3. アコーディオン

クリックすると隠れているコンテンツが表示されるアコーディオンUI。情報をコンパクトにまとめ、必要な時に展開できるため、FAQページなどでよく使われています。

HTML:

<ul class="accordion">
  <li>
    <h3 class="accordion-title">質問1</h3>
    <div class="accordion-content">
      <p>回答1</p>
    </div>
  </li>
  <li>
    <h3 class="accordion-title">質問2</h3>
    <div class="accordion-content">
      <p>回答2</p>
    </div>
  </li>
</ul>

CSS:

.accordion-content {
  display: none;
}

jQuery:

$('.accordion-title').on('click', function() {
  $(this).next('.accordion-content').stop().slideToggle();
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • クリックされた要素の次の要素(コンテンツ部分)を取得し、slideToggle()メソッドで表示/非表示を切り替えます。

  • stop()メソッドをslideToggle()の前に挟むことで、連続クリック時にアニメーションが乱れるのを防ぎます。

4. トップへ戻るボタン

ページ下部までスクロールしたら表示される「トップへ戻る」ボタン。ページ上部へスムーズに移動できるため、長いページで特に便利です。

HTML:

<button id="page-top">トップへ戻る</button>

CSS:

#page-top {
  display: none;
  position: fixed;
  bottom: 20px;
  right: 20px;
}

jQuery:

$(window).scroll(function() {
  if ($(this).scrollTop() > 300) {
    $('#page-top').fadeIn();
  } else {
    $('#page-top').fadeOut();
  }
});

$('#page-top').on('click', function() {
  $('html, body').animate({scrollTop: 0}, 600, 'swing');
  return false;
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • 初期状態ではボタンを非表示にし、スクロール位置が300pxを超えたらfadeIn()で表示するようにします。

  • ボタンをクリックすると、animate()メソッドでページトップ(スクロール位置0)へスムーズにスクロールします。

  • return false;で、リンクのデフォルト動作を無効化しています。

5. ドロップダウンメニュー

マウスオーバーでサブメニューが表示されるドロップダウンメニュー。階層構造を持ったナビゲーションメニューの実装に最適です。

HTML:

<ul class="menu">
  <li><a href="#">メニュー1</a>
    <ul class="submenu">
      <li><a href="#">サブメニュー1-1</a></li>
      <li><a href="#">サブメニュー1-2</a></li>
    </ul>
  </li>
  <li><a href="#">メニュー2</a>
    <ul class="submenu">
      <li><a href="#">サブメニュー2-1</a></li>
      <li><a href="#">サブメニュー2-2</a></li>
    </ul>
  </li>
</ul>

CSS:

.submenu {
  display: none;
}

jQuery:

$('.menu > li').hover(
  function() {
    $(this).children('.submenu').stop().slideDown();
  },
  function() {
    $(this).children('.submenu').stop().slideUp();
  }
);

サンプルコード: (※ CodePenへのリンク)

解説:

  • hover()メソッドを使って、マウスオーバー/マウスアウト時の動作を定義します。

  • マウスオーバー時にslideDown()、マウスアウト時にslideUp()を実行することで、サブメニューをスライド表示/非表示します。

  • stop()メソッドを挟むことで、アニメーションがスムーズに動作するようにします。

6. スクロールしたら系

スクロール位置に応じて要素をフェードイン表示したり、ハイライト効果を加えるなど、スクロールに連動した動的な表現は、ユーザーの注目を集める効果があります。

HTML:

<section id="target-section">
  <h2>注目セクション</h2>
  <!-- コンテンツ -->
</section>

CSS:

#target-section {
  opacity: 0;
  transition: opacity 0.5s;
}

#target-section.show {
  opacity: 1;
}

jQuery:

$(window).scroll(function() {
  var targetElement = $('#target-section');
  var scrollPosition = $(window).scrollTop();
  var windowHeight = $(window).height();
  var elementPosition = targetElement.offset().top;

  if (scrollPosition > elementPosition - windowHeight / 2) {
    targetElement.addClass('show');
  }
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • scroll()イベントを使って、スクロールが発生するたびに処理を実行します。

  • スクロール位置、ウィンドウの高さ、要素の位置を取得し、要素が画面の半分以上表示されたらshowクラスを付与します。

  • showクラスが付与されると、CSSでopacityが1になり、要素がフェードイン表示されます。

7. CSSスプライト

複数の画像を1つの画像ファイルにまとめて読み込みを高速化するCSSスプライト。jQueryを使うことで、クリックイベントで表示する画像を切り替えることができます。

HTML:

<div class="sprite-container">
  <img src="sprite.png" alt="" class="sprite">
</div>

CSS:

.sprite-container {
  width: 100px;
  height: 100px;
  overflow: hidden;
}

.sprite {
  display: block;
  width: 200px; /* スプライト画像の幅 */
  height: 100px;
  background-position: 0 0; /* 初期状態の表示位置 */
  transition: background-position 0.3s;
}

.sprite.active {
  background-position: -100px 0; /* クリック時の表示位置 */
}

jQuery:

$('.sprite').on('click', function() {
  $(this).toggleClass('active');
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • クリックイベントが発生すると、toggleClass()メソッドでactiveクラスを付与/削除します。

  • activeクラスが付与されると、CSSでスプライト画像のbackground-positionが変更され、表示位置が切り替わります。

8. タブメニュー

複数のコンテンツをタブで切り替えるタブメニュー。情報整理に役立ち、限られたスペースで多くのコンテンツを表示できます。

HTML:

<ul class="tabs">
  <li class="tab active"><a href="#tab1">タブ1</a></li>
  <li class="tab"><a href="#tab2">タブ2</a></li>
  <li class="tab"><a href="#tab3">タブ3</a></li>
</ul>

<div id="tab1" class="content active">
  <!-- コンテンツ1 -->
</div>

<div id="tab2" class="content">
  <!-- コンテンツ2 -->
</div>

<div id="tab3" class="content">
  <!-- コンテンツ3 -->
</div>

CSS:

.content {
  display: none;
}

.content.active {
  display: block;
}

.tabs .tab.active a {
  background-color: #ccc;
}

jQuery:

$('.tabs .tab a').on('click', function(e) {
  e.preventDefault();
  $('.tabs .tab').removeClass('active');
  $(this).parent('.tab').addClass('active');
  $('.content').hide();
  $($(this).attr('href')).show();
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • タブをクリックすると、クリックされたタブにactiveクラスを付与し、他のタブからはactiveクラスを削除します。

  • クリックされたタブのhref属性値を元に、表示するコンテンツをshow()で表示し、他のコンテンツはhide()で非表示にします。

  • 初期状態では、最初のタブにactiveクラスを付与し、最初のコンテンツを表示するように設定します。

9. カテゴリ選択

ブログ記事などでよく見られるカテゴリ選択機能。クリックされたカテゴリに属する記事だけを表示する、フィルタリング処理を実装できます。

HTML:

<ul class="categories">
  <li class="category active" data-category="all">すべて</li>
  <li class="category" data-category="news">ニュース</li>
  <li class="category" data-category="blog">ブログ</li>
</ul>

<div class="articles">
  <article class="article" data-category="news">ニュース記事1</article>
  <article class="article" data-category="blog">ブログ記事1</article>
  <article class="article" data-category="news">ニュース記事2</article>
  <article class="article" data-category="blog">ブログ記事2</article>
</div>

CSS:

.categories .category.active {
  background-color: #ccc;
}

.article {
  display: none;
}

.article.show {
  display: block;
}

jQuery:

$('.categories .category').on('click', function() {
  var category = $(this).data('category');
  $('.categories .category').removeClass('active');
  $(this).addClass('active');

  if (category == 'all') {
    $('.article').addClass('show');
  } else {
    $('.article').removeClass('show');
    $('.article[data-category="' + category + '"]').addClass('show');
  }
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • カテゴリボタンをクリックすると、クリックされたボタンにactiveクラスを付与し、他のボタンからはactiveクラスを削除します。

  • data-category属性からカテゴリ名を取得し、allならすべての記事を表示、それ以外なら該当するカテゴリの記事のみを表示します。

  • 初期状態では、「すべて」のカテゴリを表示するボタンにactiveクラスを付与しておきます。

10. ページのローディング画面

ページ読み込み中にローディング画面を表示することで、ユーザーに読み込み状況を分かりやすく伝えることができます。

HTML:

<div id="loading">
  <p>Loading...</p>
</div>

<!-- コンテンツ -->

CSS:

#loading {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: #fff;
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 100;
}

jQuery:

$(window).on('load', function() {
  $('#loading').fadeOut();
});

サンプルコード: (※ CodePenへのリンク)

解説:

  • window."" class="ng-star-inserted">イベントを使って、ページの読み込みが完了したタイミングでローディング画面をfadeOut()で非表示にします。

11. まとめ

今回は、実務でよく見かけるjQueryの実装サンプルを10個ご紹介しました。これらのサンプルコードを参考に、ぜひご自身のWebサイトにもjQueryを取り入れて、より使いやすく、魅力的なサイトを作成してみてください。

Q&A

Q1: jQueryが必要ですか?

A1: jQueryは便利ですが、JavaScriptの基本だけでもナビゲーションメニューは実装可能です。

Q2: スクロールの速度を変更できますか?

A2: はい、`animate`メソッドの第2引数で速度を調整できます。

Q3: CSSのみでレスポンシブメニューは作れますか?

A3: はい、CSSのみでも作成可能ですが、jQueryを使用すると動的な効果が追加できます。

その他の参考記事:jquery dropdownplain