Kaydırma yönünü algılama


120

Bu yüzden on scrollbir işlevi çağırmak için JavaScript'i kullanmaya çalışıyorum . Ama jQuery kullanmadan kaydırmanın yönünü tespit edip edemeyeceğimi bilmek istedim. Değilse, herhangi bir geçici çözüm var mı?

Sadece bir "yukarı" düğmesi koymayı düşünüyordum, ancak yapabilseydim bundan kaçınmak isterdim.

Şimdi bu kodu kullanmayı denedim ama işe yaramadı:

if document.body.scrollTop <= 0 {
    alert ("scrolling down")
} else {
    alert ("scrolling up")
}

Bu wheelDelta, olayın. Tarayıcılar arası pek değil. See phrogz.net/js/wheeldelta.html
marekful

1
hmmm tam olarak aradığım şey değildi ama yardımınız için minnettarım: P Başka bir öneriniz var mı?
dwinnbrown

Yanıtlar:


177

Önceki scrollTopdeğeri saklayarak ve mevcut scrollTop değerini onunla karşılaştırarak tespit edilebilir .

JavaScript:

var lastScrollTop = 0;

// element should be replaced with the actual target element on which you have applied scroll, use window in case of no target element.
element.addEventListener("scroll", function(){ // or window.addEventListener("scroll"....
   var st = window.pageYOffset || document.documentElement.scrollTop; // Credits: "https://github.com/qeremy/so/blob/master/so.dom.js#L426"
   if (st > lastScrollTop){
      // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st <= 0 ? 0 : st; // For Mobile or negative scrolling
}, false);

20
lastScrollTopSayfayı hazırlamak daha güvenli olacaktırYOffset || 0 varsaymak yerine top
Ed Ballot

Tamamen katılıyorum !! Teşekkürler @EdBallot. Aynı şeyi window.onload olayında başlatmalıyız.
Prateek

@Prateek Cevabınız için teşekkürler ama benim için çalışmıyor ... Tumult Hype kullanılarak oluşturulan web uygulamamda 'sahne değiştirmeye' çalışıyorum.
dwinnbrown

Cevabıma birkaç yorum ekledim, lütfen kontrol edin. Sanırım "element.addEventListener" kullanıyorsunuz.
Prateek

@Prateek hala korkmuyorum. Sayfayı yüklerken çalıştırıyorum gerçeğiyle bir ilgisi olabilir mi? İşte bir ekran görüntüsü: i.imgur.com/Q0H0T4s.png
dwinnbrown

53

Tüm kaydırma olaylarını yakalamanın basit yolu (dokunma ve tekerlek)

window.onscroll = function(e) {
  // print "false" if direction is down and "true" if up
  console.log(this.oldScroll > this.scrollY);
  this.oldScroll = this.scrollY;
}

10
SO'ya hoş geldiniz, cevabınıza bir açıklama eklerseniz, bu OP ve diğerleri için daha yararlı olabilir.
Alejandro Montilla

32

Kaydırma yönünü bulmak için bunu kullanın. Bu sadece Dikey Kaydırmanın yönünü bulmak içindir. Tüm çapraz tarayıcıları destekler.

var scrollableElement = document.body; //document.getElementById('scrollableElement');

scrollableElement.addEventListener('wheel', checkScrollDirection);

function checkScrollDirection(event) {
  if (checkScrollDirectionIsUp(event)) {
    console.log('UP');
  } else {
    console.log('Down');
  }
}

function checkScrollDirectionIsUp(event) {
  if (event.wheelDelta) {
    return event.wheelDelta > 0;
  }
  return event.deltaY < 0;
}

Misal


2
Bu iyi, ancak yalnızca kaydırma tekerleğini kullanmak için işe yarıyor gibi görünüyor
Jonathan.Brink

1
MDN webdocs'tan: Not: Wheel olayını scroll olayıyla karıştırmayın. Bir tekerlek olayının varsayılan eylemi uygulamaya özgüdür ve mutlaka bir kaydırma olayı göndermez. Olsa bile, tekerlek olayındaki delta * değerleri içeriğin kaydırma yönünü mutlaka yansıtmaz. Bu nedenle, kaydırma yönünü elde etmek için tekerlek olayının delta * özelliklerine güvenmeyin. Bunun yerine, kaydırma olayında hedefin scrollLeft ve scrollTop'taki değer değişikliklerini algılayın. developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
battaboombattabaam

10

Bunu yapmayı deneyebilirsin.

function scrollDetect(){
  var lastScroll = 0;

  window.onscroll = function() {
      let currentScroll = document.documentElement.scrollTop || document.body.scrollTop; // Get Current Scroll Value

      if (currentScroll > 0 && lastScroll <= currentScroll){
        lastScroll = currentScroll;
        document.getElementById("scrollLoc").innerHTML = "Scrolling DOWN";
      }else{
        lastScroll = currentScroll;
        document.getElementById("scrollLoc").innerHTML = "Scrolling UP";
      }
  };
}


scrollDetect();
html,body{
  height:100%;
  width:100%;
  margin:0;
  padding:0;
}

.cont{
  height:100%;
  width:100%;
}

.item{
  margin:0;
  padding:0;
  height:100%;
  width:100%;
  background: #ffad33;
}

.red{
  background: red;
}

p{
  position:fixed;
  font-size:25px;
  top:5%;
  left:5%;
}
<div class="cont">
  <div class="item"></div>
  <div class="item red"></div>
  <p id="scrollLoc">0</p>
</div>


bu benim için iyi çalışmıyor. Belirli bir yüksekliğe kadar yukarı kaydırdığımda bile aşağı çıkıyor
Geliştirici

8

Bu, prateek'in yanıtladığına bir ek. IE'de kodda bir aksaklık var gibi görünüyor, bu yüzden onu biraz değiştirmeye karar verdim (sadece başka bir koşul)

$('document').ready(function() {
var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       console.log("down")
   }
   else if(st == lastScrollTop)
   {
     //do nothing 
     //In IE this is an important condition because there seems to be some instances where the last scrollTop is equal to the new one
   }
   else {
      console.log("up")
   }
   lastScrollTop = st;
});});

1
İpucunuz için teşekkürler ... bu IE "Düzgün Kaydırma" seçeneğine bağlı gibi görünüyor
Kristo

5
  1. Eski bir değeri başlatın
  2. Etkinliği dinleyerek newValue'u alın
  3. İkisini çıkar
  4. Sonuçtan sonuca varın
  5. OldValue'yu newValue ile güncelleyin

// Başlatma

let oldValue = 0;

// Olayı dinleme

window.addEventListener('scroll', function(e){

    // Get the new Value
    newValue = window.pageYOffset;

    //Subtract the two and conclude
    if(oldValue - newValue < 0){
        console.log("Up");
    } else if(oldValue - newValue > 0){
        console.log("Down");
    }

    // Update the old value
    oldValue = newValue;
});

3

Kaydırma çubuğu konumunu kullanarak alabilirsiniz document.documentElement.scrollTop. Ve sonra mesele onu önceki pozisyonla karşılaştırmaktır.


Tamam ve bunu geleneksel olarak kaydırmaya izin vermeyen bir web sitesinde kullanabilir miyim (yani tarayıcıya% 100 genişlik ve yüksekliğe uyuyor. Teşekkürler
dwinnbrown

2

Bu basit kod işe yarardı: Sonuçlar için konsolu kontrol edin.

let scroll_position = 0;
let scroll_direction;

window.addEventListener('scroll', function(e){
    scroll_direction = (document.body.getBoundingClientRect()).top > scroll_position ? 'up' : 'down';
    scroll_position = (document.body.getBoundingClientRect()).top;
    console.log(scroll_direction);
});

1

Ben şahsen bu kodu javascript'te kaydırma yönünü tespit etmek için kullanıyorum ... Sadece lastscrollvalue'yu depolamak için bir değişken tanımlamanız ve sonra bunu if & else kullanmalısınız

let lastscrollvalue;

function headeronscroll() {

    // document on which scroll event will occur
    var a = document.querySelector('.refcontainer'); 

    if (lastscrollvalue == undefined) {

        lastscrollvalue = a.scrollTop;

        // sets lastscrollvalue
    } else if (a.scrollTop > lastscrollvalue) {

        // downscroll rules will be here
        lastscrollvalue = a.scrollTop;

    } else if (a.scrollTop < lastscrollvalue) {

        // upscroll rules will be here
        lastscrollvalue = a.scrollTop;

    }
}

0

Basit kod

// Events
$(document).on('mousewheel DOMMouseScroll', "element", function(e) {
    let delta = e.originalEvent.wheelDelta;
    
    if (delta > 0 || e.originalEvent.detail < 0) upScrollFunction();
    if (delta < 0 || e.originalEvent.detail > 0) donwScrollFunction();
}

Bu kod soruyu yanıtlayabilirken, sorunun nasıl ve / veya neden çözüldüğüne ilişkin ek bağlam sağlamak, yanıtlayanın uzun vadeli değerini artıracaktır.
Ördek Donald
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.