2012-03-02 7 views
2

マウスが画像上にあるとき、2秒後にスパンコンテンツが下にスライドします。それはうまくいく。2秒後にマウスの上/外にjQueryスライドアップ/アウトコンテンツ - バグ

私は誰かがあまりにもそのスパンの上にマウスを移動した場合に表示されるスパンにしたい、と私の問題が始まる...

私は十分に明らかになった場合、私は知らないが、私はコードがあなたよりも多くを教えてくれますだと思います言葉:)

リンク:http://jsfiddle.net/zDd5T/3/

HTML:

<img id="image" src="button_green.png" /> 
<span id="content"> 
    <a href="http://www.google.com">Link</a> 
    Some content here 
</span> 

CSS:

#image{ 
    left:0px; 
    position:absolute; 
    z-index: 10; 
} 
#content{ 
    top:48px; 
    left:0px; 
    position:absolute; 
    height: 100px; 
    border: 1px solid #f00; 
    display: block; 
    z-index: 0; 
    width: 100px; 
} 

のJavaScript:事前に

$(document).ready(function() { 
    $('#content').hide(); 
    var over_img = false; 
    var over_span = false; 
    $('#image').live('mouseover', function() { 
     over_img = true; 
     setTimeout(function() { 
      $('#content').show('slide', { 
       direction: 'up' 
      }, 1000); 
     }, 2000); 
    }); 
    $('#content').live('mouseover', function() { 
     over_span = true; 
     setTimeout(function() { 
      $('#content').show('slide', { 
       direction: 'up' 
      }, 1000); 
     }, 2000); 
    }); 
    $('#image').live('mouseout', function() { 
     over_img = false; 
     if (!over_img && !over_span) { 
      setTimeout(function() { 
       $('#content').hide("slide", { 
        direction: "up" 
       }, 1000); 
      }, 2000); 
     } 
    }); 
    $('#content').live('mouseout', function() { 
     over_span = false; 
     if (!over_img && !over_span) { 
      setTimeout(function() { 
       $('#content').hide("slide", { 
        direction: "up" 
       }, 1000); 
      }, 2000); 
     } 
    }); 
}); 

ありがとう!

答えて

0

jQuery 1.7以降では、廃止予定の.live()の代わりにon()を使用します。

私はこれがあなたの問題を解決しなければならないと考えている:

$(document).ready(function() { 
    var T1, T2; 
    $('#content').hide(); 
    $('body').on({ 
     mouseenter: function() { 
      clearTimeout(T2); 
      T1 = setTimeout(function() { 
       $('#content').slideDown(1000); 
      }, 2000); 
     }, 
     mouseleave: function() { 
      clearTimeout(T1); 
      T2 = setTimeout(function() { 
       $('#content').slideUp(1000); 
      }, 2000);  
     } 
    }, '#image, #content'); 
});​ 

はここで答えをFIDDLE

+0

このコードは単語以上を教えてくれます:) ありがとうございます! – luka

+0

@luka - 答えが実際にあなたの問題を解決するなら、それを受け入れるべきです。 – adeneo

+0

また、mouseoutハンドラで 'clearTimeout(T1)'を実行すると、潜在的なslideDownを排除するのに役立ちます。特に、ユーザがマウスオーバー/マウスオーバーを素早く行う場合に便利です。 http://jsfiddle.net/zDd5T/10/ –

0

私が正しくあなたの問題を理解していた場合は、次のように、私はあなたのマークアップを再構築します:

<div class="container"> 
    <img ... > 
    <div class="content"> 
    ..... 
    </div> 
</div> 

をその後、代わりに画像にあなたのホバーイベントを結合の代わりに、親コンテナにバインドします。このようにして、コンテンツdivが表示されたら、まだホバーイベントがバインドされているコンテナの親要素の中にあるので、マウスが画像またはコンテンツdiv(または他の要素コンテナ内)

+0

おかげだが、私の実際のプロジェクトで、私はと画像40ピクセルを持っているし、約ので、それはそのように行うことができません200pxの幅のコンテンツなので、他の160pxの上にマウスがあるとコンテンツが表示され、正しく表示されない場合... – luka