2014-06-14 28 views
15

Koduję stronę, na której użytkownik przewija się po raz pierwszy, w rzeczywistości nie przewija strony, zamiast tego dodaje klasę z przejściem. Chciałbym wykryć, kiedy użytkownik przewija w dół, ponieważ jeśli przewija w górę, chcę, aby zrobił coś innego. Wszystkie znalezione przeze mnie metody opierają się na zdefiniowaniu bieżącego ciała ScrollTop, a następnie porównaniu z treścią scrollTop po przewinięciu strony, definiując kierunek, ale ponieważ strona faktycznie nie jest przewijana, ciało scrollTop() doesn się nie zmieni.Jak określić kierunek przewijania bez rzeczywistego przewijania

animationIsDone = false; 

function preventScroll(e) { 

    e.preventDefault(); 
    e.stopPropagation(); 
} 

$('body').on('mousewheel', function(e) { 

    if (animationIsDone === false) { 
     $("#main-header").removeClass("yellow-overlay").addClass("yellow-overlay-darker"); 
     $(".site-info").first().addClass("is-description-visible"); 
     preventScroll(e); 

     setTimeout(function() { 
      animationIsDone = true; 
     }, 1000); 

    } 


}); 

To jest to, co ja przyszedłem z, ale w ten sposób nie ma znaczenia kierunek przewijać wyzwala zdarzenie

+0

uwaga, że ​​'mousewheel' jest przestarzała i niestandardowe. Chociaż tylko FireFox go nie obsługuje. Aby obsługiwać FireFox, możesz spróbować obsługi 'DOMMouseScroll', odpowiednik' e.wheelDelta' w module obsługi zdarzenia 'mousewheel' ma około' -40 * e.detail' w procedurze obsługi zdarzenia "DOMMouseScroll". Wygląda również na to, że jQuery usuwa właściwość, musisz uzyskać dostęp do 'originalEvent'. –

+0

możesz użyć ** [zdarzenia koła] (https://developer.mozilla.org/en-US/docs/Web/Events/wheel) **. Tutaj możesz sprawdzić przykład z obsługą wielu przeglądarek, posługując się przewijaniem: ** [stackoverflowflow.com/questions/4989632 ...] (http://stackoverflow.com/questions/4989632/differentiate-between-scroll-up -down-in-jquery/24792018 # 24792018) ** – jherax

Odpowiedz

18

Zdarzenie mousewheel szybko staje się przestarzałe. Zamiast tego należy użyć wartości wheel.

Umożliwia to również łatwy dostęp do pionowego i/lub poziomego kierunku przewijania bez pasków przewijania.

To wydarzenie ma wsparcie we wszystkich obecnych głównych przeglądarkach i powinno pozostać standardem daleko w przyszłości.

Oto demo:

window.addEventListener('wheel', function(e) { 
 
    if (e.deltaY < 0) { 
 
    console.log('scrolling up'); 
 
    document.getElementById('status').innerHTML = 'scrolling up'; 
 
    } 
 
    if (e.deltaY > 0) { 
 
    console.log('scrolling down'); 
 
    document.getElementById('status').innerHTML = 'scrolling down'; 
 
    } 
 
});
<div id="status"></div>

3

Spróbuj użyć e.wheelDelta

var animationIsDone = false, scrollDirection = 0; 

function preventScroll(e) { 

    e.preventDefault(); 
    e.stopPropagation(); 
} 

$('body').on('mousewheel', function(e) { 

    if (e.wheelDelta >= 0) { 
     console.log('Scroll up'); //your scroll data here 
    } 
    else { 
     console.log('Scroll down'); //your scroll data here 
    } 
    if (animationIsDone === false) { 
     $("#main-header").removeClass("yellow-overlay").addClass("yellow-overlay-darker"); 
     $(".site-info").first().addClass("is-description-visible"); 
     preventScroll(e); 

     setTimeout(function() { 
      animationIsDone = true; 
     }, 1000); 

    } 


}); 

Uwaga: Pamiętaj, że kółka myszy jest przestarzałe i nie jest obsługiwane w FireFox

+0

Bardzo dziękuję .. Będę zwracać uwagę na problem kółka myszy =) –

17

Wypróbuj za pomocą addEventListener.

window.addEventListener('mousewheel', function(e){ 
    wDelta = e.wheelDelta < 0 ? 'down' : 'up'; 
    console.log(wDelta); 
}); 

Demo

Aktualizacja:

Jak wspomniano w jednym z udzielonych odpowiedzi mouseWheel zdarzenie jest amortyzowane. Zamiast tego powinieneś użyć zdarzenia koła.

+1

Dziękuję bardzo, pracował jak urok. Oto skrócona wersja na wypadek, gdyby ktoś jej potrzebował (w ten sposób trudno jest ją przeczytać dla początkujących). –

+2

Jak wspomniano w odpowiedzi na www139, zdarzenie 'mousewheel' jest [zdekauzo-wane] (https://developer.mozilla.org/en-US/docs/Web/Events/mousewheel). Zamiast tego powinieneś użyć zdarzenia '' wheel' "(https://developer.mozilla.org/en-US/docs/Web/Events/wheel) (ponownie, zobacz odpowiedź www139). – JoeRocc

Powiązane problemy