การตรวจจับทิศทางการเลื่อน


120

ดังนั้นฉันจึงพยายามใช้ JavaScript on scrollเพื่อเรียกใช้ฟังก์ชัน แต่ฉันอยากรู้ว่าฉันสามารถตรวจจับทิศทางของการเลื่อนโดยไม่ใช้ jQuery ได้หรือไม่ ถ้าไม่เช่นนั้นมีวิธีแก้ปัญหาใด ๆ หรือไม่?

ฉันคิดว่าจะแค่ใส่ปุ่ม "ไปด้านบน" แต่อยากจะหลีกเลี่ยงสิ่งนั้นถ้าทำได้

ตอนนี้ฉันเพิ่งลองใช้รหัสนี้ แต่ไม่ได้ผล:

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

มันเป็นwheelDeltaของเหตุการณ์ ค่อนข้างไม่ข้ามเบราว์เซอร์ ดูphrogz.net/js/wheeldelta.html
marekful

1
อืมไม่ใช่สิ่งที่ฉันกำลังมองหา แต่ฉันขอขอบคุณสำหรับความช่วยเหลือของคุณ: P คำแนะนำอื่น ๆ ?
dwinnbrown

คำตอบ:


177

สามารถตรวจพบได้โดยการจัดเก็บscrollTopค่าก่อนหน้าและเปรียบเทียบค่า scrollTop ปัจจุบันกับค่านั้น

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
การเริ่มต้นlastScrollTopไปที่ pageYOffset || จะปลอดภัยกว่า scrollTop แทนที่จะสมมติว่า 0
Ed Ballot

เห็นด้วยอย่างสิ้นเชิง !! ขอบคุณ @EdBallot เราควรเริ่มต้นเหตุการณ์เดียวกันใน window.onload
Prateek

@Prateek ขอบคุณสำหรับคำตอบของคุณ แต่มันไม่ได้ผลสำหรับฉัน ... ฉันกำลังพยายาม 'เปลี่ยนฉาก' ในเว็บแอพของฉันซึ่งสร้างโดยใช้ Tumult Hype
dwinnbrown

ฉันได้เพิ่มความคิดเห็นเล็กน้อยในคำตอบของฉันโปรดตรวจสอบ ฉันเดาว่าคุณกำลังใช้ "element.addEventListener"
Prateek

@Prateek ยังไม่มีอะไรฉันกลัว เป็นไปได้ไหมว่าฉันกำลังเรียกใช้มันในการโหลดหน้าเว็บ นี่คือภาพหน้าจอ: i.imgur.com/Q0H0T4s.png
dwinnbrown

53

วิธีง่ายๆในการจับเหตุการณ์การเลื่อนทั้งหมด (สัมผัสและล้อ)

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 หากคุณเพิ่มคำอธิบายลงในคำตอบของคุณสิ่งนี้จะเป็นประโยชน์มากขึ้นสำหรับ OP และผู้อื่น
Alejandro Montilla

32

ใช้สิ่งนี้เพื่อค้นหาทิศทางการเลื่อน นี่เป็นเพียงการค้นหาทิศทางของ Vertical Scroll รองรับเบราว์เซอร์ข้ามทั้งหมด

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

ตัวอย่าง


2
นี่เป็นสิ่งที่ดี แต่ดูเหมือนว่าจะใช้ได้กับการใช้ล้อเลื่อนเท่านั้น
โจนาธานดื่ม

1
จาก MDN webdocs: หมายเหตุ: อย่าสับสนเหตุการณ์ล้อกับเหตุการณ์เลื่อน การดำเนินการตามค่าเริ่มต้นของเหตุการณ์ล้อจะเป็นการดำเนินการเฉพาะและไม่จำเป็นต้องส่งเหตุการณ์เลื่อน แม้ว่าจะเป็นเช่นนั้นค่าเดลต้า * ในเหตุการณ์วงล้อไม่จำเป็นต้องสะท้อนถึงทิศทางการเลื่อนของเนื้อหา ดังนั้นอย่าพึ่งพาคุณสมบัติเดลต้า * ของเหตุการณ์ล้อเพื่อรับทิศทางการเลื่อน ให้ตรวจจับการเปลี่ยนแปลงค่าของ scrollLeft และ scrollTop ของเป้าหมายในเหตุการณ์เลื่อนแทน developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
Battaboombattabaam

10

คุณสามารถลองทำสิ่งนี้

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>


มันใช้งานไม่ได้สำหรับฉัน เมื่อฉันเลื่อนขึ้นไปจนถึงระดับความสูงที่กำหนดก็จะแสดงลง
พัฒนา

8

นี่เป็นส่วนเพิ่มเติมของสิ่งที่ prateek ตอบดูเหมือนว่าจะมีข้อผิดพลาดในโค้ดใน IE ดังนั้นฉันจึงตัดสินใจที่จะแก้ไขอะไรเล็กน้อย (เป็นเพียงเงื่อนไขอื่น)

$('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
ขอบคุณสำหรับคำแนะนำ ... ดูเหมือนว่าจะเชื่อมต่อกับตัวเลือก "Smooth Scrolling" ของ IE
Kristo

5
  1. เริ่มต้น oldValue
  2. รับค่าใหม่โดยการฟังเหตุการณ์
  3. ลบทั้งสอง
  4. สรุปจากผล
  5. อัปเดต oldValue ด้วย newValue

// การเริ่มต้น

let oldValue = 0;

// ฟังในงาน

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

document.documentElement.scrollTopคุณจะได้รับตำแหน่งโดยใช้แถบเลื่อน แล้วก็เป็นเพียงเรื่องของการเปรียบเทียบกับตำแหน่งก่อนหน้า


โอเคและฉันจะยังใช้สิ่งนี้บนเว็บไซต์ที่ไม่อนุญาตให้เลื่อนได้หรือไม่ (เช่นเหมาะกับเบราว์เซอร์ 100% ทั้งความกว้างและความสูงขอบคุณ
dwinnbrown

2

รหัสง่ายๆนี้จะใช้ได้: ตรวจสอบคอนโซลเพื่อดูผลลัพธ์

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

ฉันใช้รหัสนี้เพื่อตรวจจับทิศทางการเลื่อนใน javascript เป็นการส่วนตัว ... เพียงแค่คุณกำหนดตัวแปรเพื่อจัดเก็บ lastscrollvalue จากนั้นใช้สิ่งนี้ if & else

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

รหัสง่ายๆ

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

แม้ว่ารหัสนี้อาจตอบคำถามได้ แต่การให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือเหตุผลในการแก้ปัญหาจะช่วยเพิ่มมูลค่าในระยะยาวของคำตอบ
Donald Duck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.