WEB系キャンパス

slideToggleを使って簡易的なメガメニューを作成(レスポンシブ対応)

mega-menu-ttl

PC版のサイトでコンテンツ量(ページ数)の多いナビゲーションメニューを作成時、ボタンにカーソルを合わせるとニュッと出てくるメガメニューをjQueryのslideToggleメソッドを使って、数行でいい感じに表示させる方法を備忘録代わりにまとめておきます。

※メガメニューはメガナビゲーションメニュー・メガドロップダウンとも呼ばれています。
テキストだけのリンクだけでなく、広いスペースでアイキャッチ画像を入れるなどして、多層構造のリンクをわかりやすく表示させることができます。

よくわからない人は完成DEMOを先に見たほうがわかりやすいかと。
DEMO

やってる事の流れをサクッと解説するとこんな感じ

  • 多層構造のナビゲーションのHTMLを書く
  • ホバーだけのリンクはa タグの画面遷移を無効化する
  • スライドするようのjQueryを書く
  • メガメニューを表示中はコンテンツ部分が黒くなってオーバーレイ表示
  • スマホはホバーできないので、通常のアコーディオンメニューに差し替える

多層構造のナビゲーションのHTMLを準備

今回は、ナビゲーションの「メニュー01」と「メニュー03」だけ、メガメニューを表示する想定で作成します。

    <nav class="main_menu">
      <ul class="main_nav">
        <li class="mega_btn">
          <a href="javascript:void(0)">メニュー01</a>
            <div class="mega_menu">
              <p class="ttl">メガメニューの中身</p>
              <ul class="child">
                <li>
                  <a href="">
                    <img src="img/sample.jpg" alt="">
                    <span>メニュー01-01</span>
                  </a>
                </li>
                <li>
                  <a href="">
                    <img src="img/sample.jpg" alt="">
                    <span>メニュー01-02</span>
                  </a>
                </li>
                <li>
                  <a href="">
                    <img src="img/sample.jpg" alt="">
                    <span>メニュー01-03</span>
                  </a>
                </li>
              </ul>
          </div>
          <!-- /.mega_menu -->
        </li>
        <li><a href="">メニュー02</a></li>
        <li class="mega_btn">
          <a href="javascript:void(0)">メニュー03</a>
          <div class="mega_menu">
            <p class="ttl">メガメニューの中身</p>
            <ul class="child">
              <li>
                <a href="">
                  <img src="img/sample.jpg" alt="">
                  <span>メニュー03-01</span>
                </a>
              </li>
              <li>
                <a href="">
                  <img src="img/sample.jpg" alt="">
                  <span>メニュー03-02</span>
                </a>
              </li>
              <li>
                <a href="">
                  <img src="img/sample.jpg" alt="">
                  <span>メニュー03-03</span>
                </a>
              </li>
            </ul>
          </div>
          <!-- /.mega_menu -->
        </li>
        <li><a href="">メニュー04</a></li>
      </ul>
    </nav>
    <!-- /.main_menu -->

メガメニュー内はulから書いてもいいですが、メガメニュー内でタイトルとかテキストとか使う可能性もあるので<div>〜</div>で囲うにしています。

CSSは適正調整してください。
しいていえば、ホバー時以外は非表示にさせるためにdisplay:noneを入れておきます。

.main_menu .main_nav .mega_menu {
    display: none;
}

今回親階層には、リンクがなしという事なので、aタグを無効化しておく必要があります。

<a href="javascript:void(0)">メニュー01</a>

メガメニュー用のjQueryを書く

jQueryの記述はシンプルにこんな感じ

    $(function () {
      $('.main_nav > .mega_btn').hover(function(){
          $(this).children('.mega_menu').stop().slideToggle();
          $('body').toggleClass('overlay');
      });
    });

メガメニュー表示中はコンテンツ部分を黒くして、メニューが開いている感じを出す

最後の行の「$(‘body’).toggleClass(‘overlay’);」でbodyにメガメニュー表示中の時だけclassを付与することによってオーバーレイ表示がされるようにしています。
各コンテンツのz-indexの前後関係に注意が必要です。

body {
    position: relative;
    -webkit-transition: all 0.6s;
    transition: all 0.6s;
}
body:after {
    width: 100%;
    height: 100%;
    position: absolute;
    background-color: rgba(0,0,0,0.4);
    content: '';
    left: 0;
    top: 0;
    z-index: -1;
    opacity: 0;
    -webkit-transition: all 0.6s;
    transition: all 0.6s;
}
body.overlay:after {
    z-index: 1;
    opacity: 1;
}

疑似要素で全面に半透明の黒のバックグラウンドカラーがあたっているイメージですね。

スマホでは、メガメニューでなくシンプルなアコーディオンメニューにする

スマホでは、ホバーが効かないので同じHTMLを使う場合はクリックで反応するメニューに変える必要があるので、PCとスマホ(今回は正確にはWindow幅)でjQueryのタイプを変更する必要があります。
スマホの方はシンプルなアコーディオンメニューにしました。

$(window).on('load resize', function(){
  var winW = $(window).width();
  var devW = 767;
  if (winW <= devW) {
    $(function(){
        $(".main_nav > .mega_btn").on("click", function() {
            $(this).children('.mega_menu').slideToggle();
        });
    });
  } else {
    $(function () {
      $('.main_nav > .mega_btn').hover(function(){
          $(this).children('.mega_menu').stop().slideToggle();
          $('body').toggleClass('overlay');
      });
    });
  }
});

スマホの表示領域を考えると、メガメニューよりテキストリンクにしておいたほうがいい場合もありますので、今回はPC版で表示させていたタイトルや画像はdisplay:noneで非表示にしておきます。

    .main_menu .main_nav .mega_menu {
        position: static;
        display: none;
        padding: 20px;
    }
    .main_menu .main_nav .mega_menu .ttl {
        display: none;
    }
    .main_menu .main_nav .child {
        display: block;
    }
    .main_menu .main_nav .child li {
        margin-right: 0;
        text-align: left;
    }
    .main_menu .main_nav .child li img {
        display: none;
    }
    .main_menu .main_nav .child li:last-child {
        margin-right: 0;
    }
    .main_menu .main_nav .child li a {
        display: block;
        padding-left: 1em;
    }

ハンバーガーメニューとかの表示は今回省いています。
必要な場合は、追っかけ設置してみて下さい。

こちらが全部の完成版のDEMOになります。
DEMO

まとめ

それなりの規模のサイトを作る場合は、メガメニューはPCの場合は特に利用頻度が高いので、覚えておいて損はないかと思います。ただ、PCとスマホでの表示部分をうまく調整する必要があります。
今回は以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です