ワードプレスのスマホメニュー実装時、クリックでぱかっと上下に開くアコーディオンメニューについて色々悩んだのでメモ。
ワードプレスのアコーディオンメニュー
- 子メニューがある親要素のみ、”>”マークを付ける。
- メニューをクリックすると子メニューが出てきて、”>”が下を向く。
- クリックでまた閉じる。マークも元に戻る。
という実装になります。
ワードプレスのカスタムメニュー呼び出し
ワードプレスなので、htmlでのメニューの呼び出しはシンプルです。
モバイル時のみのメニューなので、.js-mobile-menuというクラスで囲ってみました。
iタグは閉じるボタンなのでこの記事では触れません。
<nav class="js-mobile-menu"> <div class="js-close-btn"><i class="fas fa-times"></i></div> <?php wp_nav_menu( array( 'theme_location' => 'mobile', 'container' => false ) ); ?> </nav><!-- /header-nav -->
ワードプレスのカスタムメニューに自動で付与されるCSSを使う
cssには独自のクラスよりも、デフォルトで付与されるクラスを使いました。
こちらのサイト様で丁寧に解説されています。(クラスに関しては中盤から)
カスタムメニュー機能の設定と設置と書き出されるソースコードを分かりやすく紹介します
そんなデフォルトのcssを使って書いた最低限のcssがこちら。
.js-mobile-menu ul.menu li { font-size: 1.6rem; padding: 18px 20px; } .js-mobile-menu ul.menu li a { display: block; } /*.menu-item-has-childrenは子メニューを持つ親メニューにつくクラス*/ .js-mobile-menu li.menu-item-has-children a{ position: relative; } /*メニューが閉じてる時のアイコン設定*/ .js-mobile-menu li.menu-item-has-children > a:after { font-family: "Font Awesome 5 Free"; content: '\f105'; font-weight: 900; position: absolute; top: 0; right: 50px; } /*メニューが開いてる時のアイコン設定*/ .js-mobile-menu li.menu-item-has-children.visible > a:after { font-family: "Font Awesome 5 Free"; content: '\f107'; font-weight: 900; position: absolute; top: 0; right: 50px; }
ほんとんどがアイコンに関する記述ですね^^;
/*メニューが開いてる時のアイコン設定*/に書かれている.visibleというクラス。こちらをjqueryで付け外しすることでアイコンを切り替えます。
jQuery
今回はワードプレスなので、’jQuery’から始まっていますが、適時書き換えていただければ。
jQuery(document).ready(function(){ //最初は.sub-menu(子メニューを囲むul)を隠す jQuery(".js-mobile-menu .sub-menu").hide(); //.sub-menuを持つli(親メニュー)をクリックでイベント発火 jQuery(".js-mobile-menu li.menu-item-has-children").on('click', function () { //クリックした親メニューそのものを変数へ代入 let $parentMenu = jQuery(this); //クリックした要素の子メニューのみをトグル jQuery(".sub-menu", this).slideToggle(); //親メニューに.visibleクラスをつけはずししてアイコンを変化させる jQuery($parentMenu).toggleClass('visible'); }); });
jQuery(“.sub-menu”, this).slideToggle();
という書き方で、thisの.sub-menu、という指定ができるようです。
そうでないとクリックしてない子メニューまで開いてしまうので、子要素の指定は必須!
おわり
参考サイト様。ありがとうございます^^
【jQuery】 $(this)の親要素、子要素、隣接要素を指定する
クリックした要素を取得して属性値を画面に表示するコードと実装手順