Szukam czegoś do tego efektu:
$(window).scroll(function(event){
if (/* magic code*/ ){
// upscroll code
} else {
// downscroll code
}
});
Jakieś pomysły?
wheeldzisiejszych czasach: stackoverflow.com/a/33334461/3168107 .
Szukam czegoś do tego efektu:
$(window).scroll(function(event){
if (/* magic code*/ ){
// upscroll code
} else {
// downscroll code
}
});
Jakieś pomysły?
wheeldzisiejszych czasach: stackoverflow.com/a/33334461/3168107 .
Odpowiedzi:
Sprawdź aktualny scrollTopvs poprzedniscrollTop
var lastScrollTop = 0;
$(window).scroll(function(event){
var st = $(this).scrollTop();
if (st > lastScrollTop){
// downscroll code
} else {
// upscroll code
}
lastScrollTop = st;
});
lastScrollTopod 0, czy będzie ona poprawnie zainicjowana?
var lastScrollTop = $(window).scrollTop()po tym, jak przeglądarka zaktualizuje pozycję przewijania przy ładowaniu strony.
Możesz to zrobić bez konieczności śledzenia poprzedniego przewijania u góry, ponieważ wszystkie pozostałe przykłady wymagają:
$(window).bind('mousewheel', function(event) {
if (event.originalEvent.wheelDelta >= 0) {
console.log('Scroll up');
}
else {
console.log('Scroll down');
}
});
Nie jestem ekspertem w tej dziedzinie, więc zachęcamy do dalszych badań, ale wygląda na to, że kiedy używasz $(element).scroll, słuchane zdarzenie jest wydarzeniem „przewijanym”.
Ale jeśli konkretnie nasłuchujesz mousewheelzdarzenia za pomocą powiązania, originalEventatrybut parametru zdarzenia wywołania zwrotnego zawiera inne informacje. Część tych informacji to wheelDelta. Jeśli jest dodatni, przesunąłeś kółko myszy w górę. Jeśli jest ujemny, przesunąłeś kółko myszy w dół.
Domyślam się, że mousewheelzdarzenia będą się uruchamiać, gdy kółko myszy się obraca, nawet jeśli strona się nie przewija; przypadek, w którym zdarzenia „przewijania” prawdopodobnie nie są uruchamiane. Jeśli chcesz, możesz zadzwonić event.preventDefault()w dolnej części oddzwaniania, aby zapobiec przewijaniu strony, a także użyć zdarzenia kółka myszy do przewijania strony innego niż przewijanie strony, na przykład funkcji powiększania.
scrollTopnie zaktualizowałem. Tak naprawdę $(window).scroll()wcale nie strzelał.
Zapisz poprzednią lokalizację przewijania, a następnie sprawdź, czy nowa jest większa czy mniejsza.
Oto sposób na uniknięcie zmiennych globalnych ( skrzypce dostępne tutaj ):
(function () {
var previousScroll = 0;
$(window).scroll(function(){
var currentScroll = $(this).scrollTop();
if (currentScroll > previousScroll){
alert('down');
} else {
alert('up');
}
previousScroll = currentScroll;
});
}()); //run this anonymous function immediately
Mogą być 3 rozwiązania z tego postu i innej odpowiedzi .
Rozwiązanie 1
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('up 1');
}
else {
console.log('down 1');
}
lastScrollTop = st;
});
Rozwiązanie 2
$('body').on('DOMMouseScroll', function(e){
if(e.originalEvent.detail < 0) {
console.log('up 2');
}
else {
console.log('down 2');
}
});
Rozwiązanie 3
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('up 3');
}
else {
console.log('down 3');
}
});
Nie mogłem przetestować tego na Safari
chrom 42 (Win 7)
Firefox 37 (Win 7)
IE 11 (Win 8)
IE 10 (Win 7)
IE 9 (Win 7)
IE 8 (Win 7)
Sprawdziłem, czy efekt uboczny z IE 11 i IE 8 pochodzi z
if elseinstrukcji. Tak więc zastąpiłem goif else ifnastępującym stwierdzeniem.
W teście z wieloma przeglądarkami zdecydowałem się użyć rozwiązania 3 dla popularnych przeglądarek i rozwiązania 1 dla Firefoxa i IE 11.
Odniosłem się do tej odpowiedzi, aby wykryć IE 11.
// Detect IE version
var iev=0;
var ieold = (/MSIE (\d+\.\d+);/.test(navigator.userAgent));
var trident = !!navigator.userAgent.match(/Trident\/7.0/);
var rv=navigator.userAgent.indexOf("rv:11.0");
if (ieold) iev=new Number(RegExp.$1);
if (navigator.appVersion.indexOf("MSIE 10") != -1) iev=10;
if (trident&&rv!=-1) iev=11;
// Firefox or IE 11
if(typeof InstallTrigger !== 'undefined' || iev == 11) {
var lastScrollTop = 0;
$(window).on('scroll', function() {
st = $(this).scrollTop();
if(st < lastScrollTop) {
console.log('Up');
}
else if(st > lastScrollTop) {
console.log('Down');
}
lastScrollTop = st;
});
}
// Other browsers
else {
$('body').on('mousewheel', function(e){
if(e.originalEvent.wheelDelta > 0) {
console.log('Up');
}
else if(e.originalEvent.wheelDelta < 0) {
console.log('Down');
}
});
}
Safari browser, pomocne byłoby uzupełnienie rozwiązania.
Rozumiem, że odpowiedź została już zaakceptowana, ale chciałem opublikować informacje o tym, z czego korzystam, na wypadek, gdyby mogło to pomóc każdemu. Otrzymuję kierunek jak cliphexw przypadku kółka myszy, ale z obsługą Firefoksa. Przydatne jest robienie tego w ten sposób, jeśli robisz coś takiego jak blokowanie przewijania i nie możesz uzyskać bieżącego przewijania na górze.
Zobacz wersję na żywo tutaj .
$(window).on('mousewheel DOMMouseScroll', function (e) {
var direction = (function () {
var delta = (e.type === 'DOMMouseScroll' ?
e.originalEvent.detail * -40 :
e.originalEvent.wheelDelta);
return delta > 0 ? 0 : 1;
}());
if(direction === 1) {
// scroll down
}
if(direction === 0) {
// scroll up
}
});
Do zdarzenia scroll zachowuje się dziwnie w FF (jest on zwolniony wiele razy ze względu na gładkość przewijania), ale to działa.
Uwaga: przewijania zdarzenie rzeczywiście jest zwolniony podczas przeciągania paska przewijania, za pomocą klawiszy strzałek lub kółka myszy.
//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
padding: "5px 7px",
background: "#e9e9e9",
position: "fixed",
bottom: "15px",
left: "35px"
});
//binds the "scroll" event
$(window).scroll(function (e) {
var target = e.currentTarget,
self = $(target),
scrollTop = window.pageYOffset || target.scrollTop,
lastScrollTop = self.data("lastScrollTop") || 0,
scrollHeight = target.scrollHeight || document.body.scrollHeight,
scrollText = "";
if (scrollTop > lastScrollTop) {
scrollText = "<b>scroll down</b>";
} else {
scrollText = "<b>scroll up</b>";
}
$("#test").html(scrollText +
"<br>innerHeight: " + self.innerHeight() +
"<br>scrollHeight: " + scrollHeight +
"<br>scrollTop: " + scrollTop +
"<br>lastScrollTop: " + lastScrollTop);
if (scrollHeight - scrollTop === self.innerHeight()) {
console.log("► End of scroll");
}
//saves the current scrollTop
self.data("lastScrollTop", scrollTop);
});
Możesz także rzucić okiem na MDN, który zawiera świetne informacje o zdarzeniu Wheel .
Uwaga: Zdarzenie koła jest uruchamiane tylko przy użyciu kółka myszy ; Klawisze kursora i przeciąganie paska przewijania nie wywołują zdarzenia.
Przeczytałem dokument i przykład: Słuchając tego wydarzenia w przeglądarce
i po kilku testach z FF, IE, chrome, safari, skończyłem z tym fragmentem:
//creates an element to print the scroll position
$("<p id='test'>").appendTo("body").css({
padding: "5px 7px",
background: "#e9e9e9",
position: "fixed",
bottom: "15px",
left: "15px"
});
//attach the "wheel" event if it is supported, otherwise "mousewheel" event is used
$("html").on(("onwheel" in document.createElement("div") ? "wheel" : "mousewheel"), function (e) {
var evt = e.originalEvent || e;
//this is what really matters
var deltaY = evt.deltaY || (-1 / 40 * evt.wheelDelta), //wheel || mousewheel
scrollTop = $(this).scrollTop() || $("body").scrollTop(), //fix safari
scrollText = "";
if (deltaY > 0) {
scrollText = "<b>scroll down</b>";
} else {
scrollText = "<b>scroll up</b>";
}
//console.log("Event: ", evt);
$("#test").html(scrollText +
"<br>clientHeight: " + this.clientHeight +
"<br>scrollHeight: " + this.scrollHeight +
"<br>scrollTop: " + scrollTop +
"<br>deltaY: " + deltaY);
});
Jeśli chcesz tylko wiedzieć, czy przewijasz w górę lub w dół za pomocą wskaźnika (myszy lub panelu dotykowego ), możesz użyć właściwości deltaYwheel zdarzenia.
$('.container').on('wheel', function(event) {
if (event.originalEvent.deltaY > 0) {
$('.result').append('Scrolled down!<br>');
} else {
$('.result').append('Scrolled up!<br>');
}
});
.container {
height: 200px;
width: 400px;
margin: 20px;
border: 1px solid black;
overflow-y: auto;
}
.content {
height: 300px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="container">
<div class="content">
Scroll me!
</div>
</div>
<div class="result">
<p>Action:</p>
</div>
var tempScrollTop, currentScrollTop = 0;
$(window).scroll(function(){
currentScrollTop = $("#div").scrollTop();
if (tempScrollTop > currentScrollTop ) {
// upscroll code
}
else if (tempScrollTop < currentScrollTop ){
// downscroll code
}
tempScrollTop = currentScrollTop;
}
lub użyj rozszerzenia kółka myszy , patrz tutaj .
Widziałem tutaj wiele dobrych odpowiedzi, ale wygląda na to, że niektórzy ludzie mają problemy z przeglądarkami, więc to moja naprawa.
Z powodzeniem wykorzystałem to do wykrycia kierunku w FF, IE i Chrome ... Nie testowałem tego podczas safari, ponieważ zwykle używam systemu Windows.
$("html, body").bind({'mousewheel DOMMouseScroll onmousewheel touchmove scroll':
function(e) {
if (e.target.id == 'el') return;
e.preventDefault();
e.stopPropagation();
//Determine Direction
if (e.originalEvent.wheelDelta && e.originalEvent.wheelDelta >= 0) {
//Up
alert("up");
} else if (e.originalEvent.detail && e.originalEvent.detail <= 0) {
//Up
alert("up");
} else {
//Down
alert("down");
}
}
});
Pamiętaj, że używam tego również, aby zatrzymać przewijanie, więc jeśli chcesz, aby przewijanie nadal występowało, musisz je usunąć e.preventDefault(); e.stopPropagation();
Aby zignorować jakiekolwiek przyciąganie / pęd / odbicie na górze i na dole strony, oto zmodyfikowana wersja zaakceptowanej odpowiedzi Josiaha :
var prevScrollTop = 0;
$(window).scroll(function(event){
var scrollTop = $(this).scrollTop();
if ( scrollTop < 0 ) {
scrollTop = 0;
}
if ( scrollTop > $('body').height() - $(window).height() ) {
scrollTop = $('body').height() - $(window).height();
}
if (scrollTop >= prevScrollTop && scrollTop) {
// scrolling down
} else {
// scrolling up
}
prevScrollTop = scrollTop;
});
Możesz określić kierunek przewijania myszy.
$(window).on('mousewheel DOMMouseScroll', function (e) {
var delta = e.originalEvent.wheelDelta ?
e.originalEvent.wheelDelta : -e.originalEvent.detail;
if (delta >= 0) {
console.log('scroll up');
} else {
console.log('scroll down');
}
});
Użyj tego, aby znaleźć kierunek przewijania. Służy to wyłącznie znalezieniu kierunku zwoju pionowego. Obsługuje wszystkie przeglądarki.
var scrollableElement = document.getElementById('scrollableElement');
scrollableElement.addEventListener('wheel', findScrollDirectionOtherBrowsers);
function findScrollDirectionOtherBrowsers(event){
var delta;
if (event.wheelDelta){
delta = event.wheelDelta;
}else{
delta = -1 * event.deltaY;
}
if (delta < 0){
console.log("DOWN");
}else if (delta > 0){
console.log("UP");
}
}
ten kod działa poprawnie w IE, Firefox, Opera i Chrome:
$(window).bind('wheel mousewheel', function(event) {
if (event.originalEvent.deltaY >= 0) {
console.log('Scroll down');
}
else {
console.log('Scroll up');
}
});
„kółko myszy” i właściwość deltaY muszą być użyte w funkcji bind () .
Pamiętaj: ze względów bezpieczeństwa użytkownik musi zaktualizować swój system i przeglądarki. W 2018 r. Wymówki „Mam IE 7” to nonsens. Musimy edukować użytkowników.
Miłego dnia :)
Zachowaj to bardzo proste:
Sposób nasłuchiwania zdarzeń jQuery:
$(window).on('wheel', function(){
whichDirection(event);
});
Sposób Vanilla JavaScript Event Listener Way:
if(window.addEventListener){
addEventListener('wheel', whichDirection, false);
} else if (window.attachEvent) {
attachEvent('wheel', whichDirection, false);
}
Funkcja pozostaje taka sama:
function whichDirection(event){
console.log(event + ' WheelEvent has all kinds of good stuff to work with');
var scrollDirection = event.deltaY;
if(scrollDirection === 1){
console.log('meet me at the club, going down', scrollDirection);
} else if(scrollDirection === -1) {
console.log('Going up, on a tuesday', scrollDirection);
}
}
Napisałem bardziej dogłębnego post na niego tutaj
Możesz użyć opcji przewijania i kółka myszy, aby jednocześnie śledzić ruch w górę i w dół.
$('body').bind('scroll mousewheel', function(event) {
if (event.originalEvent.wheelDelta >= 0) {
console.log('moving down');
}
else {
console.log('moving up');
}
});
Możesz również zastąpić „body” (Window).
Dlaczego nikt nie używa eventobiektu zwróconego przez jQueryprzewijanie?
$window.on('scroll', function (event) {
console.group('Scroll');
console.info('Scroll event:', event);
console.info('Position:', this.pageYOffset);
console.info('Direction:', event.originalEvent.dir); // Here is the direction
console.groupEnd();
});
Używam chromiumi nie sprawdzałem w innych przeglądarkach, czy mają tę dirwłaściwość.
Ponieważ bindzostał wycofany z wersji v3 („zastąpiony przez on”) i wheeljest teraz obsługiwany , zapomnij wheelDelta:
$(window).on('wheel', function(e) {
if (e.originalEvent.deltaY > 0) {
console.log('down');
} else {
console.log('up');
}
if (e.originalEvent.deltaX > 0) {
console.log('right');
} else {
console.log('left');
}
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<h1 style="white-space:nowrap;overflow:scroll">
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
🚂🚃🚃🚂🚃🚃🚃🚂🚃🚃🚂🚃🚃🚃🚂🚃<br/>
🚎🚌🚌🚌🚎🚌🚌🚎🚌🚌🚌🚎🚌🚌🚎🚌<br/>
</h1>
wheelZgodność wydarzenia z przeglądarką w MDN (18.03.2019) :
if(e.originalEvent.deltaY > 0) { console.log('down'); } else if(e.originalEvent.deltaY < 0) { console.log('up'); } else if(e.originalEvent.deltaX > 0) { console.log('right'); } else if(e.originalEvent.deltaX < 0) { console.log('left'); }
Możesz również tego użyć
$(document).ready(function(){
var currentscroll_position = $(window).scrollTop();
$(window).on('scroll', function(){
Get_page_scroll_direction();
});
function Get_page_scroll_direction(){
var running_scroll_position = $(window).scrollTop();
if(running_scroll_position > currentscroll_position) {
$('.direction_value').text('Scrolling Down Scripts');
} else {
$('.direction_value').text('Scrolling Up Scripts');
}
currentscroll_position = running_scroll_position;
}
});
.direction_value{
position: fixed;
height: 30px;
background-color: #333;
color: #fff;
text-align: center;
z-index: 99;
left: 0;
top: 0;
width: 100%;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="direction_value">
</div>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Nisi ducimus expedita facilis architecto fugiat veniam natus suscipit amet beatae atque, enim recusandae quos, magnam, perferendis accusamus cumque nemo modi unde!</p>
w .data()elemencie możesz zapisać JSON i przetestować wartości, aby uruchomić zdarzenia
{ top : 1,
first_top_event: function(){ ...},
second_top_event: function(){ ...},
third_top_event: function(){ ...},
scroll_down_event1: function(){ ...},
scroll_down_event2: function(){ ...}
}
Jest to optymalne rozwiązanie do wykrywania kierunku właśnie w momencie przewijania przez użytkownika.
var currentScrollTop = 0 ;
$(window).bind('scroll', function () {
scrollTop = $(this).scrollTop();
clearTimeout($.data(this, 'scrollTimer'));
$.data(this, 'scrollTimer', setTimeout(function() {
if(scrollTop > currentScrollTop){
// downscroll code
$('.mfb-component--bl').addClass('mfbHide');
}else{
// upscroll code
$('.mfb-component--bl').removeClass('mfbHide');
}
currentScrollTop = scrollTop;
}, 250));
});
Powinieneś tego spróbować
var scrl
$(window).scroll(function(){
if($(window).scrollTop() < scrl){
//some code while previous scroll
}else{
if($(window).scrollTop() > 200){
//scroll while downward
}else{//scroll while downward after some specific height
}
}
scrl = $(window).scrollTop();
});
Miałem problemy z elastycznym przewijaniem (podskakiwanie, gumowanie). Ignorowanie zdarzenia przewijania w dół, jeśli znajdowało się blisko góry strony, działało dla mnie.
var position = $(window).scrollTop();
$(window).scroll(function () {
var scroll = $(window).scrollTop();
var downScroll = scroll > position;
var closeToTop = -120 < scroll && scroll < 120;
if (downScroll && !closeToTop) {
// scrolled down and not to close to top (to avoid Ipad elastic scroll-problems)
$('.top-container').slideUp('fast');
$('.main-header').addClass('padding-top');
} else {
// scrolled up
$('.top-container').slideDown('fast');
$('.main-header').removeClass('padding-top');
}
position = scroll;
});
Działa to we wszystkich przeglądarkach na komputery i telefony, rozwijając najlepsze odpowiedzi. Można zbudować bardziej złożone okno obiektu zdarzenia [„scroll_evt”], a następnie wywołać je w funkcji handleScroll (). Ten wyzwala dla 2 współbieżnych warunków, jeśli upłynęło określone opóźnienie lub minęła się pewna delta w celu wyeliminowania niektórych niepożądanych wyzwalaczy.
window["scroll_evt"]={"delta":0,"delay":0,"direction":0,"time":Date.now(),"pos":$(window).scrollTop(),"min_delta":120,"min_delay":10};
$(window).scroll(function() {
var currentScroll = $(this).scrollTop();
var currentTime = Date.now();
var boolRun=(window["scroll_evt"]["min_delay"]>0)?(Math.abs(currentTime - window["scroll_evt"]["time"])>window["scroll_evt"]["min_delay"]):false;
boolRun = boolRun && ((window["scroll_evt"]["min_delta"]>0)?(Math.abs(currentScroll - window["scroll_evt"]["pos"])>window["scroll_evt"]["min_delta"]):false);
if(boolRun){
window["scroll_evt"]["delta"] = currentScroll - window["scroll_evt"]["pos"];
window["scroll_evt"]["direction"] = window["scroll_evt"]["delta"]>0?'down':'up';
window["scroll_evt"]["delay"] =currentTime - window["scroll_evt"]["time"];//in milisecs!!!
window["scroll_evt"]["pos"] = currentScroll;
window["scroll_evt"]["time"] = currentTime;
handleScroll();
}
});
function handleScroll(){
event.stopPropagation();
//alert(window["scroll_evt"]["direction"]);
console.log(window["scroll_evt"]);
}