• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:jqueryアコーディオンのマウスオーバー、マウスアウトでの開閉)

jQueryアコーディオンのマウスオーバー、マウスアウトで開閉する方法

このQ&Aのポイント
  • この質問では、jQueryのアコーディオンメニューをマウスオーバーで開き、マウスアウトで閉じる方法について尋ねています。
  • 現在のコードではクリックでの開閉が行われているため、マウスオーバー、マウスアウトに変更したいとのことです。
  • さらに、初期段階ではすべての項目が閉じた状態になっているようにしたいとの要望もあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.2

#1です。 >jqueryのアコーディオンメニューを設置したいのですが、親<li>への >マウスオーバーで開く、子<li><ul><li>からのマウスアウトで閉 >じるという動作がうまくいきません 確かに、ご質問の最初に書いてありましたね。 でも、下のほうに、 >マウスオーバーのみでの開閉は$this.click(function()をmouseover >に書き換えればできるのですが。 とあったので、それで解決しているのかと、誤読してしまいました。 メニューの階層が2に限定なら比較的簡単ですが、階層が深くても対応可能にしようとすると、少々面倒ですね。 CSSの機能を併用すればやりやすくなると思いますが、改変してよいのか不明でしたので、スクリプトのみでやってみました。 イベント処理のタイミングを遅らせることで、対応していますので、フラグとして"_active"というクラス名をul要素に付与しています。 #1にも書きましたが、jqueryはよくわかってないので、要領が悪いかも知れません。 まぁ、あくまでもご参考までに… また、この仕様だと、メニューが伸縮するのでマウスの位置が相対的に変わってしまうため、かなりユーザビリティが悪いように思いますが…? サブメニューがposition absoluteで表示されるような、一般的なタイプのほうが使いやすいのではないでしょうか? メニュー関連のスクリプトは、数多くライブラリ化されていますので、それらを参考になさるのもよろしいかと思います。 (設置だけが目的なら、ライブラリを利用なさるほうがよろしいかと。) $(function(){ var active = '_active'; //←仮のクラス名 $('.acc ul').hide(); $('.acc a').hover( function() { $(this).parents('ul').addClass(active); var tmp = $(this).next('ul:first'); var h = tmp.height() + 'px'; tmp.addClass(active).animate({height:'show'}); }, function() { $(this).parents('ul').removeClass(active); $(this).next('ul:first').removeClass(active); }); $('.acc li').mouseout(function() { setTimeout((function(elm){return function(){close(elm);};})($(this)) , 200); }); function close(elm) { var tmp = elm.children('ul:first'); if (!tmp.hasClass(active)) tmp.animate({height:'hide'}); } });

hirore
質問者

お礼

ありがとうございます!!お礼が遅くなりましてすいません。 いろんなスクリプトを探してみたんですが、希望のものが見つかりませんでした。 確かにロールオーバー、アウトでの挙動はマウスの位置の問題でユーザビリティーは良いとは言えませんよね。 一応設置して様子をみるような感じになると思います。 ありがとうございました。 今年は本格的にjavascriptを勉強するつもりです。

その他の回答 (1)

  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

jqueryはよく知りませんが… 動作はご提示のままでよくって、最初の状態が全て閉じていればよいという意味でしょうか?  if(index > 0) $this.next().hide(); の部分で最初の項目(index=0)だけ除外しているから閉じないので、無条件でhideするようにすれば全部閉じますけど…? 意味が違っていたら失礼。

hirore
質問者

補足

質問の中に質問があってわかりにくくなりました。 すいません。 メインは 「jqueryのアコーディオンメニューを設置したいのですが、親<li>へのマウスオーバーで開く、子<li><ul><li>からのマウスアウトで閉じるという動作がうまくいきません。」 というところです。 よろしくお願いします。

関連するQ&A

専門家に質問してみよう