【jQuery】ホバーでスライドするドロップダウンメニューの作り方

jQuery
記事内に商品プロモーションを含む場合があります。

この記事では、jQueryを使って「メニューをホバーしたときにサブメニューがスライド表示されるドロップダウンメニューの作り方」をハンズオン形式で解説します。

スポンサーリンク

jQueryでドロップダウンメニューをスライド表示する

見本はこちらです。

各メニューをホバーすると、対応のサブメニューがヌルッとスライド表示されるのがわかると思います。

見た目はHTMLとCSSで整え、「ホバーしたときにスライドする」の部分をjQueryで制御しています。

こちらの作り方を解説します。

スポンサーリンク

【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;にしてもよいのですが、下のように表示⇔非表示がパッ、パッと切り替わり、あまりお洒落ではありません。

そこでslideToggle( )というメソッドを使うと、滑らかにスライドするアニメーションを実現できて便利です。

ちなみに、( )内にはアニメーションの速度をミリ秒で自由に指定できます。

slideToggle(ミリ秒)
:セレクタで指定した要素がスライドしながら開閉する

今回は「500ミリ秒」にしてみました。

$(function() {
  $('.menu-item').hover(function() {
    $(this).children('.subMenu').slideToggle(500);
  });
});

良い感じになったのですが、親メニューを連続でホバーすると同じ回数だけサブメニューが開閉を繰り返してしまう(アニメーションの重複)ので、このエラーを解決して終わりにしましょう。

アニメーションの重複を防ぐにはstop( )メソッドを使います。

stop( )
:アニメーションが実行中のときは、それを中止する

stop( )はslideToggle( )の前に付ければOKです。

$(function() {
  $('.menu-item').hover(function() {
    $(this).children('.subMenu').stop().slideToggle(500);
  });
});

これでjQueryを使ったドロップダウンメニューが完成しました。

スポンサーリンク

まとめ

親メニューに紐付いたサブメニューの実装は、実務でもかなりの頻度で登場します。

jQueryを使えば簡単にドロップダウンメニューを作成できるので、この機会にポイントを押さえておきましょう。