Phát hiện hướng cuộn


120

Vì vậy, tôi đang cố gắng sử dụng JavaScript on scrollđể gọi một hàm. Nhưng tôi muốn biết liệu tôi có thể phát hiện hướng của cuộn mà không sử dụng jQuery hay không. Nếu không thì có cách giải quyết nào không?

Tôi đã nghĩ đến việc chỉ đặt một nút 'lên đầu' nhưng tôi muốn tránh điều đó nếu có thể.

Bây giờ tôi vừa thử sử dụng mã này nhưng nó không hoạt động:

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

Đó là wheelDeltasự kiện. Khá không trình duyệt chéo. Xem phrogz.net/js/wheeldelta.html
marekful

1
hmmm không hoàn toàn là những gì tôi đang tìm kiếm nhưng tôi đánh giá cao sự giúp đỡ của bạn: P Có bất kỳ đề xuất nào khác không?
dwinnbrown

Câu trả lời:


177

Nó có thể được phát hiện bằng cách lưu trữ scrollTopgiá trị trước đó và so sánh giá trị scrollTop hiện tại với nó.

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
Sẽ an toàn hơn nếu khởi tạo lastScrollToptrangYOffset || scrollTop thay vì giả định là 0
Ed Ballot,

Hoàn toàn đồng ý !! Cảm ơn @EdBallot. Chúng ta nên khởi tạo tương tự trên sự kiện window.onload.
Prateek

@Prateek Cảm ơn câu trả lời của bạn nhưng nó không hoạt động với tôi ... Tôi đang cố gắng 'thay đổi cảnh' trong ứng dụng web của mình được tạo bằng cách sử dụng Tumult Hype.
dwinnbrown 07-07-15

Tôi đã thêm một vài nhận xét trong câu trả lời của mình, vui lòng kiểm tra nó. Tôi đoán bạn đang sử dụng "element.addEventListener".
Prateek

@Prateek vẫn không có gì tôi sợ. Nó có thể là do thực tế là tôi đang chạy nó khi tải trang? Đây là một ảnh chụp màn hình: i.imgur.com/Q0H0T4s.png
dwinnbrown

53

Cách đơn giản để bắt tất cả các sự kiện cuộn (chạm và bánh xe)

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
Chào mừng bạn đến với SO, nếu bạn thêm mô tả vào câu trả lời của mình, điều này có thể hữu ích hơn cho OP và những người khác.
Alejandro Montilla

32

Sử dụng điều này để tìm hướng cuộn. Điều này chỉ để tìm hướng của Cuộn dọc. Hỗ trợ tất cả các trình duyệt chéo.

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

Thí dụ


2
Đây là tốt, nhưng dường như chỉ làm việc cho sử dụng bánh xe di chuyển
Jonathan.Brink

1
Từ MDN webdocs: Lưu ý: Đừng nhầm lẫn sự kiện bánh xe với sự kiện cuộn. Hành động mặc định của sự kiện bánh xe là triển khai cụ thể và không nhất thiết phải gửi sự kiện cuộn. Ngay cả khi nó xảy ra, các giá trị delta * trong sự kiện bánh xe không nhất thiết phản ánh hướng cuộn của nội dung. Do đó, không dựa vào các thuộc tính delta * của sự kiện bánh xe để lấy hướng cuộn. Thay vào đó, hãy phát hiện các thay đổi giá trị của scrollLeft và scrollTop của mục tiêu trong sự kiện cuộn. developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
battaboombattabaam

10

Bạn có thể thử làm điều này.

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>


điều này không làm việc tốt cho tôi. Khi tôi di chuyển lên thậm chí lên đến một độ cao nào nhất định nó cho thấy xuống
Nhà phát triển

8

Đây là một bổ sung cho những gì prateek đã trả lời. Có vẻ như có một trục trặc trong mã trong IE vì vậy tôi quyết định sửa đổi nó một chút không có gì lạ (chỉ là một điều kiện khác)

$('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
Cám ơn gợi ý của bạn ... điều này dường như được kết nối với IE "Smooth cuộn" tùy chọn
Kristo

5
  1. Khởi tạo oldValue
  2. Nhận Giá trị mới bằng cách lắng nghe sự kiện
  3. Trừ hai
  4. Kết luận từ kết quả
  5. Cập nhật oldValue bằng newValue

// Khởi tạo

let oldValue = 0;

// Đang nghe về sự kiện

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

Bạn có thể lấy vị trí thanh cuộn bằng cách sử dụng document.documentElement.scrollTop. Và sau đó nó chỉ đơn giản là vấn đề so sánh nó với vị trí trước đó.


Được rồi và tôi vẫn có thể sử dụng cái này trên một trang web theo truyền thống sẽ không cho phép cuộn (tức là nó phù hợp với 100% chiều rộng và chiều cao của trình duyệt. Cảm ơn
dwinnbrown

2

Mã đơn giản này sẽ hoạt động: Kiểm tra bảng điều khiển để biết kết quả.

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

Cá nhân tôi sử dụng mã này để phát hiện hướng cuộn trong javascript ... Chỉ cần bạn phải xác định một biến để lưu trữ giá trị kéo dài và sau đó sử dụng điều này nếu & khác

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

Mã đơn giản

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

Mặc dù mã này có thể trả lời câu hỏi, nhưng việc cung cấp thêm ngữ cảnh về cách thức và / hoặc lý do tại sao nó giải quyết vấn đề sẽ cải thiện giá trị lâu dài của câu trả lời.
Vịt Donald
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.