2011-08-24 14 views
5

Mam prostą siatkę galerii z zagnieżdżoną rozpiętością, która pokazuje tytuł, który chcę przesunąć myszką i ukryć na myszy.Efekt błędu myszki jquery, efekt myszy zawsze uruchamia się kilka razy na mouseout

Wszystko działa dobrze, z wyjątkiem sytuacji, gdy mysz przesuwa się w dół do miejsca, w którym znajduje się tytuł i/lub unosi się z kafelka od spodu płytki, a efekt unoszący się powtarza kilka razy w sposób niekontrolowany.

Początkowo pomyślałem, że może to być spowodowane tym, że rozpiętość jest zawarta w kotwicy, która jest spustem aktywującym, ale jej przeniesienie również nie działa.

Wszelkie pomysły?

Demo jest tutaj: http://www.winterealm.com/gallery/

Markup:

<div class="gallery_container"> 
    <ul> 
     <li><a href=""><img src="assets/img/artistisch.jpg" alt="aaa"/><span class="title">Category A</span></a></li> 
     <li><a href=""><img src="assets/img/attraktiv.jpg" alt="bbb"/><span class="title">Category B</span></a></li> 
     <li><a href=""><img src="assets/img/historisch.jpg" alt="ccc"/><span class="title">Category C</span></a></li> 
     <li><a href=""><img src="assets/img/popart.jpg" alt="ddd"/><span class="title">Category D</span></a></li> 
     <li><a href=""><img src="assets/img/portrait.jpg" alt="eee"/><span class="title">Category E</span></a></li> 
     <li><a href=""><img src="assets/img/sketch.jpg" alt="fff"/><span class="title">Category F</span></a></li> 
    </ul> 
</div> 

Oto jquery

$(document).ready(function(){ 
    $('.gallery_container a').mouseover(function(){ 
     $(this).children('.title').animate({ 
      opacity: 100, 
      bottom: 0 
     },200); 
    }); 

    $('.gallery_container a').mouseout(function(){ 
     $(this).children('.title').animate({ 
      opacity: 0, 
      bottom: -30 
     },200); 
    }); 
}); 

Odpowiedz

8

Problem polega na tym, że ruch myszy jest uruchamiany za każdym razem, gdy mysz porusza się nad elementem lub elementami potomnymi. Zamiast tego spróbuj użyć zdarzeń mouseenter i mouseleave.

+0

Tak, najkrótsze rozwiązanie = najlepiej! to wydaje się być sposobem na zrobienie tego! Wielkie dzięki! – Winterain

0

Więc może warto wdrożyć bardzo prosty mechanizm blokujący, tak jak w:

var fCurrentlyMoving = false;  
$('.gallery_container a').mouseover(function(){ 
    if (!fCurrentlyMoving) { 
     fCurrentlyMoving = true; 
     $(this).children('.title').animate({ 
      opacity: 100, 
      bottom: 0 
     },200, function() { 
      fCurrentlyMoving = false; 
     }); 
    } 
}); 

to nie jest hermetyczny wyścig, ale nie musi tak być.

3

Spróbuj tego.

$(document).ready(function() { 
$('.gallery_container a').hover(function() { 
    $(this).children('.title').stop().animate({ 
     opacity: 100, 
     bottom: 0 
    }, 200); 
}, function() { 
    $(this).children('.title').stop().animate({ 
     opacity: 0, 
     bottom: -30 
    }, 200); 
}); 
}); 

Możesz zobaczyć demo na żywo tutaj. - http://jsfiddle.net/8Hd7s/

+0

To również działa, ale istnieje niewielkie podsuwanie, które uniemożliwia animację slajdów podczas szybkiego przesuwania myszy po całym rzędzie. Dobre, gdy nie chcesz, aby wszystko ożywiło się za każdym razem, gdy miniesz ... dzięki za rozwiązanie! – Winterain

+0

W oparciu o pierwotny problem, myślałem, że to właśnie próbujesz uniknąć. Możesz to zmienić, usuwając .stop() przed funkcjami animate. –

+0

Witam @AustinBrunkhorst, możesz pomóc w tym: http://stackoverflow.com/questions/31835128/jquery-onmouseover-selection-attribute/31835344#31835344 –