Wie kann ich die Richtung eines jQuery-Bildlaufereignisses bestimmen?

344

Ich suche etwas in diesem Sinne:

$(window).scroll(function(event){
   if (/* magic code*/ ){
       // upscroll code
   } else {
      // downscroll code
   }
});

Irgendwelche Ideen?

Zach
quelle
Für diejenigen, die Probleme mit elastischem Scrollen haben, verwenden Sie bitte diese Antwort stackoverflow.com/questions/7154967/jquery-detect-scrolldown
Timothy Dalton
1
Das wheelEreignis ist heutzutage am einfachsten zu nutzen : stackoverflow.com/a/33334461/3168107 .
Shikkediel

Antworten:

699

Überprüfen Sie den aktuellen scrollTopund den vorherigen WertscrollTop

var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st;
});
Josiah Ruddell
quelle
16
Gibt es eine Möglichkeit, eine Sensibilität dafür einzustellen?
Kakaocodierer
8
Ich habe an diesem Codepen ein Beispiel gemacht. Vielleicht aktualisiere ich diese Antwort wegen der Popularität mit einem jQuery-Plugin.
Josiah Ruddell
3
Haben Sie dies versucht, wenn Sie zu einer vorherigen Seite mit diesem Code zurückkehren? Wenn Sie auf Ihrer Seite nach unten scrollen, sagen wir 500PX. Gehen Sie zu einer anderen Seite und dann zurück zur ersten Seite. Einige Browser behalten die Bildlaufposition bei und bringen Sie wieder auf die Seite. Wirst du einen Start lastScrollTopbei 0 haben oder wird er richtig initialisiert?
TCHdvlp
7
@TCHdvlp - Nun, im schlimmsten Fall würde das erste Bildlaufereignis die Variable aktualisieren und das zweite Ereignis wäre genau (.. es wäre nur bei einem Upscroll nach der Rücknavigation von Bedeutung). Dies kann behoben werden, indem festgelegt wird, var lastScrollTop = $(window).scrollTop()nachdem der Browser die Bildlaufposition beim Laden der Seite aktualisiert hat.
Josiah Ruddell
2
Ein Update dazu: Achten Sie darauf, dass einige Browser, insbesondere IE 11 unter Windows 8, ein subpixelbasiertes Bildlaufereignis auslösen können (reibungsloses Scrollen). Da scrollTop jedoch als Ganzzahl gemeldet wird, kann Ihr vorheriger Bildlaufwert mit dem aktuellen Wert identisch sein.
Renato
168

Sie können dies tun, ohne den vorherigen Bildlauf nach oben verfolgen zu müssen, da alle anderen Beispiele Folgendes erfordern:

$(window).bind('mousewheel', function(event) {
    if (event.originalEvent.wheelDelta >= 0) {
        console.log('Scroll up');
    }
    else {
        console.log('Scroll down');
    }
});

Ich bin kein Experte auf diesem Gebiet, also zögern Sie nicht, es weiter zu erforschen, aber es scheint, dass, wenn Sie verwenden $(element).scroll das Ereignis, auf das Sie hören, ein "Scroll" -Ereignis ist .

Wenn Sie jedoch mousewheelmithilfe von bind gezielt auf ein Ereignis warten, enthält das originalEventAttribut des Ereignisparameters für Ihren Rückruf unterschiedliche Informationen. Ein Teil dieser Informationen istwheelDelta . Wenn es positiv ist, haben Sie das Mausrad nach oben bewegt. Wenn es negativ ist, haben Sie das Mausrad nach unten bewegt.

Ich vermute, dass mousewheelEreignisse ausgelöst werden, wenn sich das Mausrad dreht, auch wenn die Seite nicht scrollt. Ein Fall, in dem 'Scroll'-Ereignisse wahrscheinlich nicht ausgelöst werden. Wenn Sie möchten, können Sie event.preventDefault()am Ende Ihres Rückrufs aufrufen , um zu verhindern, dass die Seite gescrollt wird, und das Mausrad-Ereignis für etwas anderes als einen Bildlauf verwenden, z. B. für eine Art Zoomfunktion.

Cilphex
quelle
13
Schön, aber leider unterstützt der einzige Firefox es nicht. Developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/… (getestet in FF v15). : C
nuala
8
Dies war nützlich für mich: Ich musste das Scrollen erkennen, obwohl die Seite selbst nicht wirklich gescrollt und daher scrollTopnicht aktualisiert wurde. In der Tat $(window).scroll()überhaupt nicht geschossen.
Martti Laine
13
Es ist schön, dass Sie den alten Staat nicht brauchen. Diese Technik funktioniert jedoch nicht auf Handys oder Tablets, da sie kein Mausrad haben!
Joeytwiddle
13
Dieser Ansatz funktioniert nicht, wenn ich mit der Tastatur scrolle. Es ist definitiv ein interessanter Ansatz für Dinge wie Zoom, aber ich denke nicht, dass er die Frage nach der Bildlaufrichtung anspricht.
Chmac
6
$ ("html, body"). bind ({'Mausrad DOMMouseScroll onmousewheel touchmove scroll': function (e) {// ...}); funktioniert für mich bei der Erkennung aller Browser-Scroll-Daten
GoreDefex
31

Speichern Sie die vorherige Bildlaufposition und prüfen Sie, ob die neue größer oder kleiner ist.

Hier ist eine Möglichkeit, globale Variablen zu vermeiden ( Geige hier verfügbar ):

(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
Skilldrick
quelle
29

Bestehende Lösung

Es könnte 3 Lösungen aus diesem Beitrag und anderen Antworten geben .

Lösung 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;
    });

Lösung 2

    $('body').on('DOMMouseScroll', function(e){
        if(e.originalEvent.detail < 0) {
            console.log('up 2');
        }
        else {
            console.log('down 2');
        }
    });

Lösung 3

    $('body').on('mousewheel', function(e){
        if(e.originalEvent.wheelDelta > 0) {
            console.log('up 3');
        }
        else {
            console.log('down 3');
        }
    });

Multi Browser Test

Ich konnte es nicht auf Safari testen

Chrom 42 (Win 7)

  • Lösung 1
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht
  • Lösung 3
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle

Firefox 37 (Win 7)

  • Lösung 1
    • Up: 20 Ereignisse pro 1 Schriftrolle
    • Unten: 20 Ereignisse pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Nach unten: 1 Ereignis pro 1 Schriftrolle
  • Lösung 3
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht

IE 11 (Win 8)

  • Lösung 1
    • Nach oben: 10 Ereignisse pro 1 Schriftrolle (Nebeneffekt: Endlich nach unten gescrollt)
    • Nach unten: 10 Ereignisse pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht
  • Lösung 3
    • Up: Funktioniert nicht
    • Nach unten: 1 Ereignis pro 1 Schriftrolle

IE 10 (Win 7)

  • Lösung 1
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht
  • Lösung 3
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle

IE 9 (Win 7)

  • Lösung 1
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht
  • Lösung 3
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle

IE 8 (Win 7)

  • Lösung 1
    • Nach oben: 2 Ereignisse pro 1 Schriftrolle (Nebeneffekt: Endlich nach unten gescrollt)
    • Nach unten: 2 ~ 4 Ereignisse pro 1 Schriftrolle
  • Lösung 2
    • Up: Funktioniert nicht
    • Unten: Funktioniert nicht
  • Lösung 3
    • Nach oben: 1 Ereignis pro 1 Schriftrolle
    • Nach unten: 1 Ereignis pro 1 Schriftrolle

Kombinierte Lösung

Ich habe überprüft, ob die Nebenwirkung von IE 11 und IE 8 von der if elseAnweisung stammt. Also habe ich es durch if else iffolgende Aussage ersetzt.

Aus dem Multi-Browser-Test habe ich beschlossen, Lösung 3 für gängige Browser und Lösung 1 für Firefox und IE 11 zu verwenden.

Ich habe diese Antwort weitergeleitet , um IE 11 zu erkennen.

    // 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');
            }
        });
    }
Chemischer Programmierer
quelle
Wenn jemand das Ergebnis von hinzufügen könnte Safari browser, wäre es hilfreich, die Lösung zu ergänzen.
Chemischer Programmierer
Hoppla! Ich habe festgestellt, dass der Standardbrowser von Mobile Chrome und Android nur von Lösung 1 abgedeckt wird. Daher ist es besser, Lösung 1 und 3 zusammen zu verwenden, um verschiedene Browser abzudecken.
Chemischer Programmierer
Funktioniert nicht, wenn das Design ein Design mit festem Layout ist. Wenn Sie die Bildlaufrichtung auf einer statischen No-Scroll-Website erkennen möchten, funktionieren Firefox und IE11 nicht
Shannon Hochkins
Ich finde, wenn ich dies benutze, werden die "anderen Browser" in Chrom verwendet. Dies ist nicht wirklich nützlich, wenn Sie das Scrollen sowohl mit dem Mausrad als auch mit der Bildlaufleiste erkennen möchten. .scroll erkennt beide Arten des Bildlaufs in Chrom.
Sam
12

Ich verstehe, dass es bereits eine akzeptierte Antwort gegeben hat, wollte aber posten, was ich verwende, falls es jemandem helfen kann. Ich verstehe die Richtung wiecliphex beim Mausrad-Event, aber mit Unterstützung für Firefox. Es ist nützlich, dies auf diese Weise zu tun, wenn Sie so etwas wie das Sperren des Bildlaufs ausführen und den aktuellen Bildlauf oben nicht erhalten können.

Hier finden Sie eine Live - Version hier .

$(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
    }
});
suppig
quelle
@EtienneMartin Der obige Code basiert auf jQuery, wenn dies Ihren Fehler verursacht hat. Bitte beachten Sie die beigefügte Geige, um zu sehen, wie es funktioniert.
suppige
8

Bildlaufereignis

Die Scroll - Ereignis verhält sich seltsam in FF (es wird gebrannt , um eine Menge Zeit wegen der Glätte Scrollen) , aber es funktioniert.

Hinweis: Das Scroll - Ereignis tatsächlich gebrannt wird, wenn die Bildlaufleiste ziehen, die Cursortasten oder Mausrad verwenden.

//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);
});

Rad Ereignis

Sie können sich auch MDN ansehen, es enthält großartige Informationen zum Wheel Event .

Hinweis: Das Radereignis wird nur bei Verwendung des Mausrads ausgelöst . Cursortasten und Ziehen der Bildlaufleiste lösen das Ereignis nicht aus.

Ich habe das Dokument und das Beispiel gelesen: Als ich dieses Ereignis über den Browser hinweg abhörte
und nach einigen Tests mit FF, IE, Chrome, Safari, kam ich zu diesem Ausschnitt:

//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);
});
Jherax
quelle
2
Ich habe eine feste Bedienfeldansicht, die die eigentliche Bildlaufleiste deaktiviert, sodass ich die Richtung vom Mausrad aus erkennen musste. Ihre Mausradlösung funktionierte perfekt browserübergreifend. Vielen Dank dafür!
Shannon Hochkins
8

Wenn Sie nur wissen möchten, ob Sie mit einem Zeigergerät (Maus oder Trackpad ) nach oben oder unten scrollen, können Sie die Eigenschaft deltaY des wheelEreignisses verwenden.

$('.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>

Yuri
quelle
Dieser Link sagt, nicht auf deltaY developer.mozilla.org/en-US/docs/Web/Events/wheel
Charlie Martin
3
var tempScrollTop, currentScrollTop = 0; 

$(window).scroll(function(){ 

   currentScrollTop = $("#div").scrollTop(); 

   if (tempScrollTop > currentScrollTop ) {
       // upscroll code
   }
  else if (tempScrollTop < currentScrollTop ){
      // downscroll code
  }

  tempScrollTop = currentScrollTop; 
} 

oder verwenden Sie die Mausradverlängerung , siehe hier .

Adam
quelle
3

Ich habe hier viele Versionen guter Antworten gesehen, aber es scheint, dass einige Leute browserübergreifende Probleme haben, also ist dies meine Lösung.

Ich habe dies erfolgreich verwendet, um die Richtung in FF, IE und Chrome zu erkennen. Ich habe es nicht in Safari getestet, da ich normalerweise Windows verwende.

$("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");
        }
    }
});

Denken Sie daran, dass ich dies auch verwende, um das Scrollen zu stoppen. Wenn Sie also weiterhin scrollen möchten, müssen Sie das entfernen e.preventDefault(); e.stopPropagation();

GoreDefex
quelle
1
kehrt immer auf Android GS5 zurück
SISYN
Das hat super geklappt! Ich hatte ein Problem mit der am besten bewerteten Antwort auf IE. Dies hat dieses Problem nicht! +1 von mir.
Radmation
3

Hier ist eine modifizierte Version von Josiahs akzeptierter Antwort :

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;
});
Andrew Tibbetts
quelle
3

Sie können die Mausrichtung bestimmen.

$(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');
    }
});
J. Kovacevic
quelle
3

Verwenden Sie diese Option, um die Bildlaufrichtung zu ermitteln. Dies dient nur zum Ermitteln der Richtung der vertikalen Schriftrolle. Unterstützt alle Cross-Browser.

    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");
        }

    }

Beispiel

Vasi
quelle
3

Dieser Code funktioniert gut mit IE, Firefox, Opera und Chrome:

$(window).bind('wheel mousewheel', function(event) {
      if (event.originalEvent.deltaY >= 0) {
          console.log('Scroll down');
      }
      else {
          console.log('Scroll up');
      }
  });

'Radmausrad' und die Eigenschaft deltaY müssen in der Funktion bind () verwendet werden.

Denken Sie daran: Ihr Benutzer muss aus Sicherheitsgründen sein System und seine Browser aktualisieren. Im Jahr 2018 sind die Ausreden von "Ich habe IE 7" ein Unsinn. Wir müssen die Benutzer aufklären.

Haben Sie einen guten Tag :)

Cyril Morales
quelle
1
Ich habe deinen Code ausprobiert und es ist umgekehrt. Der erste wird beim Scrollen nach unten und der zweite beim Scrollen nach oben ausgelöst.
AlexioVay
Hallo :) Danke AlexioVay. Ich habe meinen Code bearbeitet (auch über die Zeit!) ^^. Natürlich ist "console.log ('.......')" nur ein Beispiel dafür, was wir tun können.
Cyril Morales
2

Halte es super einfach:

jQuery Event Listener Way:

$(window).on('wheel', function(){
  whichDirection(event);
});

Vanilla JavaScript Event Listener Way:

if(window.addEventListener){
  addEventListener('wheel', whichDirection, false);
} else if (window.attachEvent) {
  attachEvent('wheel', whichDirection, false);
}

Funktion bleibt gleich:

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);
  }
}

Ich schrieb eine vertiefende Post auf sie hier

CR Rollyson
quelle
Ist ein jquery-Rad erforderlich, um die jquery-Version zu verwenden?
Hastig Zusammenstellen
1
jquery-Rad ist für diese @HastigZusammenstellungs
CR Rollyson
2

Sie können sowohl die Scroll- als auch die Mausradoption verwenden, um die Auf- und Abbewegung gleichzeitig zu verfolgen.

 $('body').bind('scroll mousewheel', function(event) {

if (event.originalEvent.wheelDelta >= 0) {
      console.log('moving down');   
    }
    else {
      console.log('moving up'); 
    }
});

Sie können 'body' auch durch (window) ersetzen.

Zeeshan Rasool
quelle
Scheint gut in Chrome zu funktionieren, aber nicht in FF (55.0.2, Ubuntu)
Hastig Zusammenstellen
1

Wenn Sie ein Inkrement .data ()des gescrollten Elements auf Lager haben, können Sie testen, wie oft der Bildlauf oben angekommen ist.

Raumfrosch
quelle
1

Warum benutzt niemand das eventObjekt, das jQuerybeim Scrollen zurückgegeben wurde?

$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();
});

Ich verwende chromiumund habe in anderen Browsern nicht überprüft, ob sie die dirEigenschaft haben.

Jiab77
quelle
1

Da bindin Version 3 veraltet ist ("ersetzt durch on") und wheeljetzt unterstützt wird , vergessen Sie 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>

wheelBrowserkompatibilität des Ereignisses auf MDNs (18.03.2019) :

Kompatibilität des Radereignisses

CPHPython
quelle
Der obige Code erzeugt zwei Konsolenprotokolle. Verwenden Sie Folgendes, um das Auf / Ab / Links / Rechts vollständig zu trennen: 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'); }
Don Wilson
touchmoveStattdessen für den mobilen Einsatz .
CPHPython
1

Sie können dies auch verwenden

$(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>

Arvinda Kumar
quelle
0

Im .data()Element können Sie einen JSON speichern und Werte testen, um Ereignisse zu starten

{ top : 1,
   first_top_event: function(){ ...},
   second_top_event: function(){ ...},
   third_top_event: function(){ ...},
   scroll_down_event1: function(){ ...},
   scroll_down_event2: function(){ ...}
}
Raumfrosch
quelle
0

Dies ist eine einfache und einfache Erkennung, wenn der Benutzer vom oberen Rand der Seite wegblättert und wenn er zum oberen Rand zurückkehrt.

$(window).scroll(function() {
    if($(window).scrollTop() > 0) {
        // User has scrolled
    } else {
        // User at top of page
    }
});
Kbam7
quelle
0

Dies ist eine optimale Lösung, um die Richtung zu erkennen, wenn der Benutzer das Scrollen beendet.

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));

});
Mahmoud
quelle
0

Sie sollten dies versuchen

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();
    });
thakurdev
quelle
0

Ich hatte Probleme mit elastischem Scrollen (Scroll Bouncing, Gummiband). Das Ignorieren des Down-Scroll-Ereignisses in der Nähe des oberen Seitenbereichs hat bei mir funktioniert.

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;
});
uggeh
quelle
0

Dies funktioniert in allen PC- oder Telefonbrowsern und erweitert die Top-Antworten. Man kann ein komplexeres Ereignisobjektfenster ["scroll_evt"] erstellen und es dann in der Funktion handleScroll () aufrufen. Dieser wird für 2 gleichzeitige Bedingungen ausgelöst, wenn eine bestimmte Verzögerung verstrichen ist oder ein bestimmtes Delta überschritten wird, um einige unerwünschte Auslöser zu beseitigen.

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"]);
}
Dexterial
quelle