ナビゲーションメニュー jQueryの実装方法
この記事では、jQueryを使用してナビゲーションメニューを実装する方法について解説しています。具体的なコード例や機能を紹介し、簡単にナビゲーションメニューを作成できるようにします。
【jQuery入門】実務でよく見る!実装サンプル集
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入門】実務でよく見る!実装サンプル集
1. ハンバーガーメニュー
<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>
.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;
}
$('.hamburger').on('click', function() {
$(this).parent('.nav').toggleClass('open');
});
ハンバーガーメニューをクリックすると、openクラスがハンバーガーメニュー自身とナビゲーションメニューに付与/削除されます。 openクラスが付与されると、CSSでハンバーガーメニューの形状が変化し、ナビゲーションメニューが表示されるように設定されています。
2. スムーススクロール
<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>
$('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;
});
$('a[href^="#"]')で、ページ内リンク(href属性値が#で始まる<a>要素)をすべて取得します。 クリックされたリンクのhref属性値から、スクロール先のセクション要素を取得し、その位置までanimate()メソッドで滑らかにスクロールします。 return false;を記述することで、ページ内リンクのデフォルト動作(ページの再読み込み)を無効化しています。
3. アコーディオン
<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>
.accordion-content {
display: none;
}
$('.accordion-title').on('click', function() {
$(this).next('.accordion-content').stop().slideToggle();
});
クリックされた要素の次の要素(コンテンツ部分)を取得し、slideToggle()メソッドで表示/非表示を切り替えます。 stop()メソッドをslideToggle()の前に挟むことで、連続クリック時にアニメーションが乱れるのを防ぎます。
4. トップへ戻るボタン
<button id="page-top">トップへ戻る</button>
#page-top {
display: none;
position: fixed;
bottom: 20px;
right: 20px;
}
$(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;
});
初期状態ではボタンを非表示にし、スクロール位置が300pxを超えたらfadeIn()で表示するようにします。 ボタンをクリックすると、animate()メソッドでページトップ(スクロール位置0)へスムーズにスクロールします。 return false;で、リンクのデフォルト動作を無効化しています。
5. ドロップダウンメニュー
<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>
.submenu {
display: none;
}
$('.menu > li').hover(
function() {
$(this).children('.submenu').stop().slideDown();
},
function() {
$(this).children('.submenu').stop().slideUp();
}
);
hover()メソッドを使って、マウスオーバー/マウスアウト時の動作を定義します。 マウスオーバー時にslideDown()、マウスアウト時にslideUp()を実行することで、サブメニューをスライド表示/非表示します。 stop()メソッドを挟むことで、アニメーションがスムーズに動作するようにします。
6. スクロールしたら系
<section id="target-section">
<h2>注目セクション</h2>
<!-- コンテンツ -->
</section>
#target-section {
opacity: 0;
transition: opacity 0.5s;
}
#target-section.show {
opacity: 1;
}
$(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');
}
});
scroll()イベントを使って、スクロールが発生するたびに処理を実行します。 スクロール位置、ウィンドウの高さ、要素の位置を取得し、要素が画面の半分以上表示されたらshowクラスを付与します。 showクラスが付与されると、CSSでopacityが1になり、要素がフェードイン表示されます。
7. CSSスプライト
<div class="sprite-container">
<img src="sprite.png" alt="" class="sprite">
</div>
.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; /* クリック時の表示位置 */
}
$('.sprite').on('click', function() {
$(this).toggleClass('active');
});
クリックイベントが発生すると、toggleClass()メソッドでactiveクラスを付与/削除します。 activeクラスが付与されると、CSSでスプライト画像のbackground-positionが変更され、表示位置が切り替わります。
8. タブメニュー
<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>
.content {
display: none;
}
.content.active {
display: block;
}
.tabs .tab.active a {
background-color: #ccc;
}
$('.tabs .tab a').on('click', function(e) {
e.preventDefault();
$('.tabs .tab').removeClass('active');
$(this).parent('.tab').addClass('active');
$('.content').hide();
$($(this).attr('href')).show();
});
タブをクリックすると、クリックされたタブにactiveクラスを付与し、他のタブからはactiveクラスを削除します。 クリックされたタブのhref属性値を元に、表示するコンテンツをshow()で表示し、他のコンテンツはhide()で非表示にします。 初期状態では、最初のタブにactiveクラスを付与し、最初のコンテンツを表示するように設定します。
9. カテゴリ選択
<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>
.categories .category.active {
background-color: #ccc;
}
.article {
display: none;
}
.article.show {
display: block;
}
$('.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');
}
});
カテゴリボタンをクリックすると、クリックされたボタンにactiveクラスを付与し、他のボタンからはactiveクラスを削除します。 data-category属性からカテゴリ名を取得し、allならすべての記事を表示、それ以外なら該当するカテゴリの記事のみを表示します。 初期状態では、「すべて」のカテゴリを表示するボタンにactiveクラスを付与しておきます。
10. ページのローディング画面
<div id="loading">
<p>Loading...</p>
</div>
<!-- コンテンツ -->
#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;
}
$(window).on('load', function() {
$('#loading').fadeOut();
});
window."" class="ng-star-inserted">イベントを使って、ページの読み込みが完了したタイミングでローディング画面をfadeOut()で非表示にします。
11. まとめ
Q&A
Q1: jQueryが必要ですか?
A1: jQueryは便利ですが、JavaScriptの基本だけでもナビゲーションメニューは実装可能です。
Q2: スクロールの速度を変更できますか?
A2: はい、`animate`メソッドの第2引数で速度を調整できます。
Q3: CSSのみでレスポンシブメニューは作れますか?
A3: はい、CSSのみでも作成可能ですが、jQueryを使用すると動的な効果が追加できます。
その他の参考記事:jquery dropdownplain