- ベストアンサー
クリックで表示、非表示するメガメニュー
- jQueryを使用してクリックで表示して再度クリックすると非表示になるメガメニューを作成する方法について詳しく教えてください。
- 質問者はjQueryやJavaScriptの知識が少ないため、以下のサイトを参考にマウスオーバーによるメガメニューを作成しましたが、クリックで表示・非表示にする方法について質問しています。
- 参考サイトに沿って作成したコードを載せており、より効率的な方法があれば教えてほしいとのことです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
>もっと効率よく出来る方法はあるでしょうか? ご提示の記述法だと、メニューの数が増えていくとスクリプトもその分増えますし、メニューを変更すればスクリプトも変えなければならないので、効率のよい方法はないかというご質問と解釈しました。 例示のスクリプトは、ほぼ同じことを行なうのにid等を用いて個別に指定する形式となっているので、ご質問のようなことが起こります。 処理内容が同じなので、それをどの要素が対象でも成り立つような考え方に一般化して、コード化すればよろしいかと思います。 対象としているメニューの構成には決まりがあるでしょうから、その決まりを利用してクリックされた要素を基準に相対的な要素関係によって処理の内容を記述するようにすれば、メニューの構成が変わらない限り数の増減や項目の入れ替えがあっても、スクリプトは同じままで対応可能とすることができます。 ちょっと気になったのは、ご提示の処理だと個別のメニューをクリックするとそのサブメニューが開/閉するようになっていますが、あるメニューを開いたときに他の開いているメニューを閉じることはしなくても良いのでしょうか?(ご提示のメガメニューの参考サイトでは開いているメニューはいつも一つになるように制御されているようです) 以下、「開閉するのは子要素のみで、孫・ひ孫要素は関係ないものと限定して良い」場合、つまりメニューの階層が1階層に限定できる場合の具体例ですが… 1)イベントの設定 ご提示のソースではHTML内にonclickで記していますが、通常は $("#topnav > li > a").click(function(){ ~ のように設定もスクリプトで行なってしまっていると思います。 jQueryの場合、イベント処理の匿名関数から、クリックの対象要素が「this」で参照できるようになっています。 2)一度に開いている要素を一つとして考えて良いのであれば、全部のメニューを閉じるのは、 $("#topnav div.sub").hide(); で可能ですが、こうするとクリックされた時点の要素の状態がわからなくなってしまうので、先に開閉状態を取得しておいてから全部閉じ、その後、状態に応じて開くことにするなどの方法が考えられます。 例えば var elm = $("div.sub:hidden", $(this).parent()); //閉じていた場合のみ取得 $("#topnav div.sub:visible").hide(); //一旦全部非表示(:visibleは無くても可) elm.show(); //最初に閉じていたら表示する とか。 * ご提示のソースでは初期設定でstyle="opacity:0"を設定していますが、上記のhide/showではopacityを操作していませんので、初期設定のまま(見えないまま)になりますのでご注意。 また、style="opacity:0"はIE系のブラウザでは通じませんので、こちらもご注意。 3)参考サイトのようにhide/showではなくアニメーション(フェード)効果を付けて表示/非表示を切り替えるのであれば、opacityの設定も必要になります。 その場合は、hide()/show()を利用する代わりに、(参考サイトのように)fadeOut()やfadeTo("normal", 1)などをご利用なさるのがよろしいかと。
お礼
返事が遅れて申し訳ありません。 詳しい解説ありがとうございます。 jQueryがまだ分からない部分が多く、急いでいたため、長いコードになりましたが、なんとかメニューを作りました。 fujillinさんの解説を参考に、時間がある時に直したいと思います。 本当にありがとうございました。