- ベストアンサー
jQueryで2段式アコーディオンメニューを作成する方法
- jQueryを使用して、2段式のアコーディオンメニューを作成する方法について教えてください。
- 参考にしたサイトでは、ポンプ型のアコーディオンメニューを使用していますが、このデモの下側にある2段アコーディオンを実装したいです。
- 現在作成中のHTMLでは、ul要素のclassを指定して階層を設定していますが、うまく動作しません。解決方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ANo1です。 HTMLの構造が明確になりました。補足に記載の構造であれば一段目と二段目は同じ構造になっているはずですので、リンク要素をクリックしたらその次の兄弟要素のulの開閉をトグルで行なうように記述すれば、親用、子用とスクリプトを分ける必要は無いように思います。 以下は上記の説明とは逆の方法で設定していますが、こんな感じでは? (ul側から見て、前の兄弟要素のクリックにイベントを設定していますが、結果的には同じことです。これだとulが無いリンク要素にまでイベントを設定しなくてすみます。) (全角空白は半角に) $(function(){ $("ul", $("ul.ac_parent")).each(function(){ var $ul = $(this).hide(); $(this).prev("a").click(function(){ $ul.slideToggle("fast"); return false; }); }); });
その他の回答 (1)
- fujillin
- ベストアンサー率61% (1594/2576)
スクリプトをいろいろ試す前に、マークアップを調整したほうがよろしいかと。 ulの直下にul要素があるみたいですし。
補足
fujillin様 ご指摘ありがとうございます! きちんとした入れ子になっていなかったようです・・・ ul、liを入れ子にして良いのかどうか知らないのですが一応修正してみました。 [修正後のHTML] <div> <ul class="ac_parent"> <li><a href="">1</a> <ul class="ac_child"> <li><a href="">11</a> <ul class="ac_gchild"> <li><a href="">111</a></li> <li><a href="">112</a></li> <li><a href="">113</a></li> </ul> </li> <li><a href="#">12</a> <ul class="ac_gchild"> <li><a href="">121</a></li> <li><a href="">122</a></li> <li><a href="">123</a></li> </ul> </li> </ul> </li> </ul> </div> この状態で親用と子用のスクリプトを並べて書いておくと孫もスライドするようになりました! が、孫のみ開いてもすぐに閉じてしまいます・・・ スクリプトも入れ子にしておかなければダメなのでしょうか。 お手を煩わせますが今一度アドバイス頂ければ非常に助かります。 よろしくお願いします。 [親用のスクリプト] <script type="text/javascript"> var j$ = jQuery; j$(function(){ j$(".ac_parent").each(function(){ j$("li > a", this).each(function(index){ var $this = j$(this); if(index > 0) $this.next().hide(); $this.click(function(){ var params = {height:"toggle", opacity:"toggle"}; j$(this).next().animate(params).parent().siblings() .children("ul:visible").animate(params); return false; }); }); }); }); </script> [子用のスクリプト] <script type="text/javascript"> var j$ = jQuery; j$(function(){ j$(".ac_child").each(function(){ j$("li > a", this).each(function(index){ var $this = j$(this); if(index > 0) $this.next().hide(); $this.click(function(){ var params = {height:"toggle", opacity:"toggle"}; j$(this).next().animate(params).parent().siblings() .children("ul:visible").animate(params); return false; }); }); }); }); </script>
お礼
fujillin様 この度は本当にありがとうございました。 実のところSQLやVBAを趣味程度ですが触っているものの、HTMLやCSS、JavaScriptは数日前に始めたばかりで何がなんだかさっぱりの状態でしたが、fujillinさんのアドバイスで希望通りの動作までもっていけたことに加え、おもしろさを色々と感じることができました。 まだまだ素人レベルですが頑張っていく元気が沸きました! また質問することもあるかと思いますが、お手隙の際には相手して頂ければと思います。 本当にありがとうございました。
補足
fujillin様 何度もありがとうございます! 頂いたコードを元に、『アニメーションの追加』と『クリックイベント時に既に開いているメニューを閉じる』処理を試行錯誤しながら自分なりに組み込み、ようやく希望の動作にもっていくことができました!(こんな時間になってしまいましたが・・・笑) [最終のコード] <script type="text/javascript"> $(function(){ $("ul", $("ul.ac_parent")).each(function(){ var $ul = $(this).hide(); $(this).prev("a").click(function(){ var params = {height:"toggle", opacity:"toggle"}; $(this).next().animate(params).parent().siblings() .children("ul:visible").animate(params).siblings(); return false; }); }); }); </script> これが良い書き方なのかどうか、実用性があるのかどうかはともかくとして後に参考になるかもしれませんので補足として最終形のコードを記載させて頂きます。