jQueryでアコーディオンメニュー

css/コーディング

ワードプレスのスマホメニュー実装時、クリックでぱかっと上下に開くアコーディオンメニューについて色々悩んだのでメモ。

ワードプレスのアコーディオンメニュー

  • 子メニューがある親要素のみ、”>”マークを付ける。
  • メニューをクリックすると子メニューが出てきて、”>”が下を向く。
  • クリックでまた閉じる。マークも元に戻る。

という実装になります。

ワードプレスのカスタムメニュー呼び出し

ワードプレスなので、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)の親要素、子要素、隣接要素を指定する
クリックした要素を取得して属性値を画面に表示するコードと実装手順

タイトルとURLをコピーしました