この記事では、jQueryを使って「メニューをホバーしたときにサブメニューがスライド表示されるドロップダウンメニューの作り方」をハンズオン形式で解説します。
jQueryでドロップダウンメニューをスライド表示する
見本はこちらです。
各メニューをホバーすると、対応のサブメニューがヌルッとスライド表示されるのがわかると思います。
見た目はHTMLとCSSで整え、「ホバーしたときにスライドする」の部分をjQueryで制御しています。
See the Pen ホバーで開閉するドロップダウンメニュー by たけち (@kwxteqls-the-scripter) on CodePen.
こちらの作り方を解説します。
【jQuery】ホバーでスライドするドロップダウンメニューの作り方
jQueryを使って、メニューをホバーしたときにサブメニューがスライド表示されるドロップダウンメニューを作ってみましょう。
まずは、全体の骨組みとなるHTMLとCSSからです。
HTML・CSS
コードはこちらです。
HTML
<nav>
<ul class="menu">
<li class="menu-item"><a href="#">MENU A</a>
<ul class="subMenu">
<li class="subMenu-item"><a href="#">A-1</a></li>
<li class="subMenu-item"><a href="#">A-2</a></li>
<li class="subMenu-item"><a href="#">A-3</a></li>
</ul>
</li>
<li class="menu-item"><a href="#">MENU B</a>
<ul class="subMenu">
<li class="subMenu-item"><a href="#">B-1</a></li>
<li class="subMenu-item"><a href="#">B-2</a></li>
<li class="subMenu-item"><a href="#">B-3</a></li>
</ul>
</li>
<li class="menu-item"><a href="#">MENU C</a>
<ul class="subMenu">
<li class="subMenu-item"><a href="#">C-1</a></li>
<li class="subMenu-item"><a href="#">C-2</a></li>
<li class="subMenu-item"><a href="#">C-3</a></li>
</ul>
</li>
<li class="menu-item"><a href="#">MENU D</a>
<ul class="subMenu">
<li class="subMenu-item"><a href="#">D-1</a></li>
<li class="subMenu-item"><a href="#">D-2</a></li>
<li class="subMenu-item"><a href="#">D-3</a></li>
</ul>
</li>
</ul>
</nav>
CSS
.menu {
display: grid;
grid-template-columns: repeat(4, 1fr);
}
.menu-item a,
.subMenu-item a{
display: inline-block;
width: 100%;
text-align: center;
padding: 1em 0;
background-color: #0082B2;
color: #fff;
font-size: 20px;
font-weight: bold;
cursor: pointer;
text-decoration: none;
}
.menu-item {
position: relative;
}
.menu-item:not(:first-of-type) {
border-left: 2px solid #fff;
}
.subMenu-item {
border-top: 2px solid #fff;
}
.subMenu {
position: absolute;
width: 100%;
display: none;
}
a:hover {
color: #ffc800;
}
ポイント解説
ドロップダウンメニューを作る上でのポイントは、親メニューの中にサブメニューを入れるという点です。
コードを見ると、親メニューの<li>(クラス名:menu-item)の中に、サブメニューの<ul>(クラス名:subMenu)が丸ごと入っているのがわかります。
なお、親メニューは必ずしも<a>タグで囲む必要はありません。遷移先がなければ<li>タグだけでOKです。この辺りはプロジェクトに合わせて変更してください。
HTML
<li class="menu-item"><a href="#">MENU A</a>
<ul class="subMenu">
<li class="subMenu-item"><a href="#">A-1</a></li>
<li class="subMenu-item"><a href="#">A-2</a></li>
<li class="subMenu-item"><a href="#">A-3</a></li>
</ul>
</li>
サブメニュー(subMenu)はposition:absolute;
で絶対配置します。
親メニュー(menu-item)をposition:relative;とし、サブメニュー(subMenu)の幅を100%とすることで、画面幅が変わっても親メニューとサブメニューの幅が同じになるようスタイリングしています。
なお、サブメニューは初期段階で非表示(display:none;
)にしましょう。こちらはjQueryで表示⇔非表示を切り替えます。
CSS
.menu-item {
position: relative;
}
.subMenu {
position: absolute;
width: 100%;
display: none;
}
jQuery
jQueryのコードはこちらです。
jQuery
$(function() {
$('.menu-item').hover(function() {
$(this).children('.subMenu').stop().slideToggle(500);
});
});
解説
まずは「ホバーした時に○○する」というトリガー部分を記述しましょう。
ホバーの対象は親メニューなので、主語は$('.menu-item')
ですね。これで「親メニュー(menu-item)をホバーしたら」の部分が出来上がります。
ちなみに、クラス名の場合は最初に「.(ピリオド)」を付けるのを忘れないようにしてください。
jQuery
$(function() {
$('.menu-item').hover(function() {
//処理内容
});
});
次に処理の対象です。
ホバーしたときに表示させる対象はサブメニューなので、主語は$('.subMenu')
だと思うかもしれません。
しかし、今回$('.subMenu')
と書くと全てのサブメニューが開いてしまうので、この書き方は適切ではありません。
そこで「ホバーした親メニューの子要素のサブメニュー」という書き方をします。
「ホバーした親メニュー」は$(this)と書き換えることができるので、コードは次のようになります。
$(function() {
$('.menu-item').hover(function() {
$(this).children('.subMenu') ~
});
});
最後に、処理の内容です。
現在display:none;
でsubMenuが非表示になっているので、jQueryでdisplay:block;にしてもよいのですが、下のように表示⇔非表示がパッ、パッと切り替わり、あまりお洒落ではありません。
See the Pen ホバーで開閉するドロップダウンメニュー(NG) by たけち (@kwxteqls-the-scripter) on CodePen.
そこでslideToggle( )というメソッドを使うと、滑らかにスライドするアニメーションを実現できて便利です。
ちなみに、( )内にはアニメーションの速度をミリ秒で自由に指定できます。
- slideToggle(ミリ秒)
- :セレクタで指定した要素がスライドしながら開閉する
今回は「500ミリ秒」にしてみました。
$(function() {
$('.menu-item').hover(function() {
$(this).children('.subMenu').slideToggle(500);
});
});
See the Pen ホバーで開閉するドロップダウンメニュー(stopメソッドなし) by たけち (@kwxteqls-the-scripter) on CodePen.
良い感じになったのですが、親メニューを連続でホバーすると同じ回数だけサブメニューが開閉を繰り返してしまう(アニメーションの重複)ので、このエラーを解決して終わりにしましょう。
アニメーションの重複を防ぐにはstop( )メソッドを使います。
- stop( )
- :アニメーションが実行中のときは、それを中止する
stop( )はslideToggle( )の前に付ければOKです。
$(function() {
$('.menu-item').hover(function() {
$(this).children('.subMenu').stop().slideToggle(500);
});
});
これでjQueryを使ったドロップダウンメニューが完成しました。
See the Pen ホバーで開閉するドロップダウンメニュー by たけち (@kwxteqls-the-scripter) on CodePen.
まとめ
親メニューに紐付いたサブメニューの実装は、実務でもかなりの頻度で登場します。
jQueryを使えば簡単にドロップダウンメニューを作成できるので、この機会にポイントを押さえておきましょう。