ドロップダウン付きのカスタムjQuery水平メニューを作成しました。最初は、リストアイテムにカーソルを合わせるとサブメニューがフェードインし、離れるとフェードアウトしました。
ただし、サブメニューからマウスを移動しても、すぐに消えない効果を作成したいと思います(たとえば、ピクセル単位でオーバーシュートした場合)。前の質問でhoverIntentプラグインに気づきましたが、兄弟のサブメニューを開くときに厄介な遅延があります。だから私は自分の機能を念頭に置いてゼロから始めました。
私のHTMLは標準のネストされたリストで、ul#menu> li>ul>liです。私のJavascriptは次のとおりです。
var menuVisible = false;
var cancelTimeout = false;
$(document).ready(function(){
$('ul#menu > li').hover(
function(){
menuMouseOver( $(this) );
},
function(){
menuMouseOut( $(this) );
}
);
});
function menuMouseOver( $li )
{
// if one of the menus is down, check which one we're hovering
if ( menuVisible ) {
cancelTimeout = true;
if ( $li.find('>ul').css('display') == 'block' ) {
// do nothing if we're hovering over current menu
}
else {
// turn off all menus
$li.parent().find('>li').each( function() {
menuOff( $li )
});
}
}
menuOn( $li );
menuVisible = true;
}
function menuMouseOut( $li )
{
setTimeout(
function(){
if ( !cancelTimeout ) {
menuOff( $li );
menuVisible = false;
}
cancelTimeout = false;
},
2000
);
}
function menuOn( $li )
{
$li.css('background-position', 'left bottom');
$li.find('>ul').fadeIn('fast');
}
function menuOff( $li )
{
$li.css('background-position', 'left top');
$li.find('>ul').fadeOut('fast');
}
次のことが機能します。
- トップレベルに移動
li
すると、サブメニューが開きます。 - サブメニューから離れると、2秒後にサブメニューが閉じます(テスト目的で、最終バージョンでは縮小されます)。
- サブメニューから離れて戻ると、タイムアウトがキャンセルされるため、メニューが消えなくなります。
ただし、これらは機能しません。
- あるトップレベルのリスト項目から次の項目に移動するとき、前のサブメニューは消えません。通常の遅延なしに、すぐにフェードアウトするようにします。
- 2つのトップレベルのリスト項目間を移動すると、
menuVisible
はに設定されfalse
、システムが台無しになります。これはcancelTimeout
、最初の兄弟の上に移動するとがtrueに設定され、2番目の兄弟に移動してもtrueに設定されているためです。
なぜこれが発生するのか、そしてもちろん、それを修正する方法についての洞察をいただければ幸いです。