連続のhover()でアニメーションが続いてしまう問題と解決方法について【jQuery】

最終更新日:

公開日:2024-10-23

ページ内に広告が含まれています。
連続のhover()でアニメーションが続いてしまう問題と解決方法について【jQuery】

マウスオーバーでアニメーションなどをするために、jQueryのhoverメソッドを使用する場合が多くあります。
その際に、連続でマウスオーバーをするとアニメーションがカーソルを外した後もホバーした分だけ続いてしまう、といった事がありませんか?そんな時の原因と対処法を解説していきます。

hoverメソッドについて

まずは、jQueryのhoverメソッドについての解説です。
このhoverメソッドは、指定した要素にカーソルが重なった時に発動するメソッドとなります。カーソルが重なった時、カーソルが離れた時の処理をまとめて記載する事が可能です。

よく使用される例として、ドロップダウンメニューやツールチップがあります。
そんなhoverメソッドの基本的は構文を以下にまとめます。

$('指定の要素').hover(
    function(){
        // カーソルが重なった時の処理
    },
    function(){
        // カーソルが離れた時の処理
    }
);

$('指定の要素').hover(
    function(){
        // カーソルが重なった時・離れた時の処理
    }
);

上記のように、指定の要素にカーソルが重なった時・離れた時の処理を別々に記述するか、一緒の動作の場合省略して記述する事も出来ます。

何度もアニメーション(イベント)が続いてしまう理由

続いて、タイトルにもあるように何度もアニメーション(イベント)が続いてしまう現象についてです。
まずは以下のコードと表示例をご覧ください。

<dl class="menu">
    <dt>開閉メニュー</dt>
    <dd>コンテンツ内容</dd>
</dl>
$('.menu').hover(
    function(){
        // カーソルが重なった時・離れた時に開閉
        $('dd',this).slideToggle();
    }
);

上記の表示例の「開閉メニュー」部分に何度か連続でカーソルを合わせてみてください。
カーソルを離した後も、カーソルを合わせた分だけ開閉のアニメーションを繰り返しているかと思います。

これは、カーソルを重ねた・離した分だけ、slideToggle()で開閉するといったイベントが発動し、蓄積している為です。次の項目で、その対処方法を詳しく解説していきます。

対処方法

先ほどの、カーソルを重ねた・離した分だけ発動するイベントを制御するには、カーソルが重なった際に「イベントを中断し、新たにイベントを発動する」といった処理が必要となります。

その為には、stopメソッドを使用します。これは、アニメーションを中断するというメソッドで、これを追加するだけで何度も繰り返してしまうといった現象を止める事が出来ます。

まずは、以下の例をご覧ください。

$('.menu').hover(
    function(){
        // カーソルが重なった時・離れた時に開閉
        $('dd',this).stop().slideToggle();
    }
);

上記の表示例にカーソルを合わせてみてください。
連続でカーソルを合わせてみても正常な動作になっているかと思います。

使用しているstopメソッドにはイベントの削除や完了に関するコールバック関数も用意されていますので、アニメーション(イベント)によっては必要になる場合もあります。その際はコールバック関数を使用してみてください。

さいごに

いかがでしたでしょうか。
今回は、hoverメソッドの連続発動によるアニメーション(イベント)の制御に関するstopメソッドを解説いたしました。

これは、ナビゲーションメニューや開閉メニューによく使用するものとなりますので、覚えておくとスムーズにコーディングが可能になるかと思います。たまに、対応方法を忘れてしまう場合もありますので、その際にはこちらの記事を思い出して参考にしてみてください。

おすすめ記事

当ブログ運営者 ヒデ

北海道札幌市在住のフリーランスでWeb制作を行っているヒデです。Webコーディング(HTML・CSS・JSなど)やWordpressのカスタマイズ等のテクニック、困った時に確認できる分かりやすい解説を目標にして情報を発信していければと思っています。プロフィールはこちら

当サイトに関するご意見・ご感想・ご要望または仕事のご依頼は以下のフォームよりお願い致します。

お問い合わせ お仕事のご依頼
PAGE TOP