【jQuery】ドロップダウンメニューの作り方【クリックやhoverで開閉】

jQueryでドロップダウンメニューの作り方:クリックやhoverで開閉
SIM

こんにちは、SIMです。
今回はドロップダウンメニューの作り方を紹介します。

ドロップダウンメニューのコードは、メガメニューのCSSを少し変えるだけで、実装できます。

目次

クリック操作のドロップダウンメニュー

SIM

まずは、クリック操作で開閉するドロップダウンメニューから紹介します。

機能としては、メニューバー以外の場所をクリックしてもメニューが閉じるように作ってあります。

下に完成品のCodePenを置いておくので、動作とコードの参考にしてみて下さい。

See the Pen Untitled by Satoru Shimizu (@sat-simizu) on CodePen.

SIM

なお、HTMLとjQueryのコードは以前に紹介したメガメニューのものと共通です。

HTMLの書き方

SIM

HTMLの抜粋は下のとおり。

      <ul class="menu" id="mega_menu">
     
        <!-- メニュー(親) -->
        <!-- マウスをhoverすると下にメガメニューのコンテンツが現れる -->
        <li class="menu-parent">
      <!-- メニュー(兄) -->
          <a href="#" class="menu-parent_a">和食メニュー</a>    
          <!-- メガメニュー(弟) -->
          <!-- 通常は非表示/マウスhoverでメニュー(親)のメガメニュー(子)が現れる -->
          <div class="menu-child">
            <ul class="menu-child_ul">
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">サンマ定食</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">ホッケ定食</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">刺し身定食</a>
              </li>
            </ul>
          </div>
        </li>
       
        <li class="menu-parent">
          <a href="#" class="menu-parent_a blrn">洋食メニュー</a> 
          <div class="menu-child">
            <ul class="menu-child_ul">
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">豚生姜焼き定食</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">ロースカツ定食</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">ハンバーグ定食</a>
              </li>
            </ul>
          </div>
        </li>
       
        <li class="menu-parent">
          <a href="#" class="menu-parent_a">麺類メニュー</a> 
          <div class="menu-child">
            <ul class="menu-child_ul">
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">醤油ラーメン</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">味噌ラーメン</a>
              </li>
              <li class="menu-child_li">
                <a href="#" class="menu-child_li-a">豚骨ラーメン</a>
              </li>
            </ul>
          </div>
        </li>
       
      </ul>
HTMLの構造をザックリ解説
  • 全体的なHTML構造:メニューバーの料理分類リストの中に、さらに入れ子で料理名リストを作っています。
  • ドロップダウンメニューjQueryの動きの鍵となる料理分類リスト(.menu-parent_a)と料理名リスト全体を囲うタグ(.menu-child)は兄弟関係です。

CSSの書き方

SIM

CSSも以前に紹介したメガメニューとほぼ同じですが、「position: relative」の設定タグが違っています

「position: relative」はドロップダウンするメニューリストの親要素「.menu-parent」に設定する必要があります。

/* --------------------------- */
/* メニュー(兄)のスタイル */
/* --------------------------- */
.menu {
  display: flex;
  background-color: #370617;
  color: #fff;
}
.menu-parent {
  width: calc(100% /3);
  border-right: 1px solid #ccc;
  position: relative;
}
.menu-parent:last-child {
  border-right: 0;
}
.menu-parent_a {
  display: block;
  padding: 10px;
  text-align: center;
}
.menu-parent_a.blrn{
  border-left: none;
  border-right: none;
}
/* --------------------------- */
/* メニュー(兄)の動作に直接関係する箇所 */
/* --------------------------- */
/* メニュー(兄)hover時に色を変える */
@media (hover: hover) {
  .menu-parent_a:hover{
    background-color: #9d0208;
    transition: all .1s;
  }
}
/* メニュー(兄)にactive付与されたとき色を変える */
.menu-parent_a.active{
  background-color: #9d0208;
}
 /* --------------------------- */
/* メガメニュー(弟)のスタイル */
/* --------------------------- */
/* メニュー(弟)は普段は非表示 */
.menu-child {
  display: none;
  position: absolute;
  top: 100%;
  left: 0;
  width: 100%;
  padding: 20px 0;
  background-color: #ffbf69;
  color: #333;
}
.menu-child_ul{
  list-style-type: disc;
  padding-left: 1.5em;
}
.menu-child_li {
  line-height: 2;
}

「position: relative」のタグを変えた以外はほぼメガメニューと作りは同じですので、詳しい説明はメガメニューの記事を参照してください。

jQueryの書き方

SIM

jQueryは以前にメガメニューで紹介したものと全く同じです。

一応、コード全文は下に載せておきますが、説明はメガメニューの記事を参照してくださいね。

$(function () {
  // メニュー(兄)をクリックしたら  
  $('.menu-parent_a').click(function () {
    // メガメニュー(弟)をスライドダウンまたはアップ
    $(this).siblings('.menu-child').slideToggle(300);
    // メニュー(兄)にactiveクラスを付与     
    $(this).addClass('active');
    // 別の兄弟のメガメニュー(弟)をスライドアップで非表示  
    $('.menu-parent_a').not($(this)).siblings('.menu-child').slideUp(100);
    // 別の兄弟のメニュー(兄)からactiveクラスを取り去る 
    $('.menu-parent_a').not($(this)).removeClass('active');

  });
   // メガメニューのリンク以外の場所をクリックしたらメガメニュー(弟)がスライドアップ・メニュー(兄)からactiveクラスを剥奪
  $(document).on('click touchend', function (e) {
    if (!$(e.target).closest('.menu-parent_a').length) {
      $('.menu-parent_a').removeClass('active');
      $('.menu-child').slideUp(100);
    }
  });
});

マウスhover操作のドロップダウンメニュー

SIM

つぎにマウスホバーでドロップダウンするメニューの作り方解説です。

下にCodePenを置いておくので、動作ややコードの参考にしてみて下さい。

See the Pen Untitled by Satoru Shimizu (@sat-simizu) on CodePen.

「position: relative」のタグを変えた以外はほぼメガメニューと作りは同じですので、詳しい説明はメガメニューの記事を参照してください。

まとめ

SIM

以上、ドロップダウンメニューの作り方を紹介しましたが、ほぼメガメニューとコードが同じですので、あまり説明することもなかったですね。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

■清水WEB制作代表
■コーディング:WordPress(オリジナルテーマ制作等)・HTML・Sass・FLOCSS・JavaScript(jQuery)等
■集客力:YouTube/Instagram/ブログでそれぞれ登録者数16000人/フォロワー13000人/月間最大アクセス50000PVの集客実績があります
■文章作成:博士号所有、会社員時代は科学雑誌に寄稿していたので文章作成も得意です
■写真技術:Amazon Kindle出版で、写真集・撮影編集解説書を5冊好評発売中です

目次