このような UX 要素に関する私の経験では、ユーザーの不満につながります。そのため、要素の上にカーソルを置くことに依存しない 2 つのボタンを表示する別の方法があるように、アプローチを完全に再検討することをお勧めします。デザインのリファクタリングを支持するもう 1 つの議論は、「ホバー」の概念がないため、タブレットや電話などのタッチ デバイスでは機能しないということです。
ただし、どうしてもやりたい場合はタイマーを使うのが一番だと思います。アレックスの解決策は、ボタンとコンテナーの間のギャップを取り除くことで機能しますが、それも不満につながる可能性があります。たとえば、ユーザーのマウスがボタンの上にあり、現在表示されているコンテナーに向かって斜めに上に移動した場合、最初に背景を通過します。 、コンテナが消えます。また、2 つの要素間の視覚的なギャップをなくすことは、設計の観点から望ましくない場合があります。
を使用するだけでは簡単ではありませんがsetTimeout
、ボタンの上にカーソルを置いてからポップアップに移動すると、ボタンを押すのに十分な速さでないと消えてしまいます。したがって、ポップアップに入るときにも使用する必要がclearTimeout
あり、おそらく、ポップアップを離れるときにポップアップを非表示にする必要があります。だから、ここにあなたが必要とするものがあります:
まず、タイムアウト ID を保持する変数を宣言します (簡単にするためにグローバル変数を使用しましたが、代わりに要素の 1 つでプロパティを使用することもできます)。
var hidePopupTimeoutId;
次に、.choose
イベントを次のように変更します。
$(".choose").live("mouseover", function () {
// no need to check if hidePopupTimeoutId is undefined; clearTimeout
// will fail silently
clearTimeout( hidePopupTimeoutId );
$(".popup").show();
});
$(".choose").live("mouseout", function () {
// we don't hide the popup immediately, but give the user a reasonable
// amount of time to mouse over it
hidePopupTimeoutId = setTimeout( function() {
$(".popup").hide();
},500);
});
イベントのタイムアウトをクリアする必要があることに注意してくださいmouseover
。そうしないと、ボタンの上にマウスを置き、マウスを離してからマウスを戻すと、マウスがボタンの上にあるにもかかわらず、ボタンが消えてしまいます!
次に、マウスがポップアップの上にある場合にポップアップが表示されたままになるように、いくつかのロジックを追加します。
$(".popup").live("mouseenter", function() {
clearTimeout( hidePopupTimeoutId );
});
$(".popup").live("mouseleave", function() {
$(".popup").hide();
});
andの代わりにjQuery のmouseenter
andmouseleave
イベントを使用していることに注意してください。これは、ポップアップの子要素 (ボタンなど) の 1 つにカーソルを合わせると が呼び出され、ポップアップが消えるためです!mouseover
mouseout
mouseout
そして、あなたはそれを持っています。ここにjsFiddleのデモがあります:http://jsfiddle.net/z3PKm/15/