質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

Q&A

解決済

2回答

2739閲覧

hover()で表示させた要素にカーソルを合わせようとすると、消えてしまいます

退会済みユーザー

退会済みユーザー

総合スコア0

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

0グッド

0クリップ

投稿2020/03/27 01:38

実現したいこと

以下のようなHTMLがあるとします。

HTML

1<ul> 2 <li>item</li> 3 <li> 4 item 5<ul class="sub-menu" style="display:none"> 6 <li>sub-item</li> 7</ul> 8 </li> 9</ul>

二つ目のitemにマウスカーソルを当てると、class"sub-menu"が現れるようにしました。しかしitemからホバーを外して、sub-itemにホバーをしようとすると、sub-menuが消えてしまいます。もちろん、表示するようにしていないからなのですが……どのようなコードを書いたらいいのですか?

以下は現在のコードです

JavaScript

1$('.セレクタ').hover( 2 function() { 3 $('.sub-menu').slideDown(); 4 }, 5 function() { 6 $('.sub-menu').slideUp(); 7 } 8);

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

下記でどうでしょうか。

html

1<ul class="menu"> 2 <li>item</li> 3 <li> 4 item 5 <ul class="sub-menu" style="display:none"> 6 <li>sub-item</li> 7 </ul> 8 </li> 9</ul>

js

1$('.menu li').hover( 2 function() { 3 $(this).children('.sub-menu').slideDown(); 4 }, 5 function() { 6 $(this).children('.sub-menu').slideUp(); 7 } 8);

投稿2020/03/27 01:59

hatena19

総合スコア34075

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/03/27 03:48

ありがとうございます。この方法で問題が解決できました。 因みに、この方法で問題が解決できた理由なのですが、 1.jqueryもcssのように(要素 要素)と指定すると子孫まで対象になる 2.menuの子孫である、.sub-menuのliも.hover()の対象になる という理由から。で合っていますか?
TatamiSteak

2020/03/27 07:19

①②ともご認識のとおりです! 動かしたい子要素を包括している親を指定してあげればホバーしたままで留めておくことができます。 hatena19さんのコードでは子孫の`li`にも対応するので、開いたアコーディオンの中へ更にアコーディオンを入れても動作できそうですね… 質問者さんの元のコードがわからないんでアレですが、 `li`の中に`div`と`ul`を同階層で入れて、`div`をホバー中に`ul`を開く…としていると同様の現象に遭遇したことがあります。
hatena19

2020/03/27 07:46

TatamiSteakさんからすでに解説がついていますので、補足を少し。 jQueryでは基本的にCSSのセレクタと同じ仕様で要素を指定できます。 $('.menu li') と指定すれば、menuの子孫全部を対象できます。$('.menu > li') とすれば子要素だけになります。質問では子要素だけでしたが、将来、孫要素を追加しても対応できるようにしてみました。 あと、ポイントは $(this).children('.sub-menu') とすることでホバーした要素の子要素を対象にするというところですね。$('.sub-menu') とするとsub-menuが複数あるとすべてのsub-menuが開いてしまいます。 これも質問ではsub-menuが一つだけでしたが、複数になる可能性が高いので汎用性のあるコードにしました。
退会済みユーザー

退会済みユーザー

2020/03/27 09:03

お二人ともありがとうございます。 今現在だけでなく、将来を見越したコーディングが大切なのですね。難しそうです……
guest

0

記載していただいているコードが$('.セレクタ').hover~となっているので現在どう指定しているかはわかりませんが、
sub-menuも含められている親のliを指定してあげれば動くかと思います。

JavaScript

1 $('body > ul > li:last-of-type').hover( 2 function() { 3 $('.sub-menu').slideDown(); 4 }, 5 function() { 6 $('.sub-menu').slideUp(); 7 } 8 );

投稿2020/03/27 01:47

編集2020/03/27 01:49
TatamiSteak

総合スコア354

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問