Làm cách nào để xác định hướng của sự kiện cuộn jQuery?


344

Tôi đang tìm kiếm một cái gì đó cho hiệu ứng này:

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

Có ý kiến ​​gì không?


Đối với những người gặp vấn đề với cuộn đàn hồi, vui lòng sử dụng câu trả lời stackoverflow.com/questions/7154967/jquery-detect-scrolldown
Timothy Dalton

1
Dễ dàng nhất để sử dụng wheelsự kiện trong những ngày này: stackoverflow.com/a/33334461/3168107 .
Shikkediel

Câu trả lời:


699

Kiểm tra hiện tại scrollTopso với trướcscrollTop

var lastScrollTop = 0;
$(window).scroll(function(event){
   var st = $(this).scrollTop();
   if (st > lastScrollTop){
       // downscroll code
   } else {
      // upscroll code
   }
   lastScrollTop = st;
});

16
Bất kỳ cách nào để thiết lập một sự nhạy cảm cho điều này?
coder ca cao

8
Tôi đã làm một ví dụ tại codepen này . Có lẽ tôi sẽ cập nhật cập nhật câu trả lời này bằng một plugin jQuery vì mức độ phổ biến.
Josiah Ruddell

3
Bạn đã thử điều này nếu bạn quay lại trang trước có mã này chưa? Nếu bạn cuộn xuống trang của mình, giả sử 500PX. Chuyển đến trang khác và sau đó quay lại trang ban đầu. Một số trình duyệt giữ vị trí cuộn và sẽ đưa bạn trở lại trang. Bạn sẽ bắt đầu từ lastScrollTop0 hay nó sẽ được khởi tạo đúng không ??
TCHvlp

7
@TCHdvlp - trường hợp xấu nhất trong trường hợp cuộn thứ nhất sẽ cập nhật biến và sự kiện thứ hai sẽ chính xác (.. nó chỉ quan trọng đối với một upscroll sau khi điều hướng trở lại). Điều này có thể được khắc phục bằng cách cài đặt var lastScrollTop = $(window).scrollTop()sau khi trình duyệt cập nhật vị trí cuộn khi tải trang.
Josiah Ruddell

2
Một bản cập nhật về điều này: Hãy cẩn thận rằng một số trình duyệt, đặc biệt là IE 11 trên Windows 8, có thể kích hoạt một sự kiện cuộn dựa trên pixel phụ (cuộn trơn tru). Nhưng vì nó báo cáo scrollTop là một số nguyên, giá trị cuộn trước đó của bạn có thể giống với giá trị hiện tại.
Renato

168

Bạn có thể làm điều đó mà không phải theo dõi đầu cuộn trước, vì tất cả các ví dụ khác yêu cầu:

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

Tôi không phải là một chuyên gia về vấn đề này vì vậy hãy thoải mái nghiên cứu thêm, nhưng có vẻ như khi bạn sử dụng $(element).scroll, sự kiện được lắng nghe là một sự kiện 'cuộn'.

Nhưng nếu bạn đặc biệt lắng nghe một mousewheelsự kiện bằng cách sử dụng liên kết, originalEventthuộc tính của tham số sự kiện cho cuộc gọi lại của bạn chứa thông tin khác. Một phần thông tin đó là wheelDelta. Nếu nó tích cực, bạn di chuyển con lăn chuột lên. Nếu nó âm tính, bạn di chuyển con lăn chuột xuống.

Tôi đoán là mousewheelcác sự kiện sẽ kích hoạt khi bánh xe chuột quay, ngay cả khi trang không cuộn; một trường hợp trong đó các sự kiện 'cuộn' có thể không được kích hoạt. Nếu bạn muốn, bạn có thể gọi event.preventDefault()ở cuối cuộc gọi lại để ngăn trang cuộn và để bạn có thể sử dụng sự kiện rê chuột cho một thứ khác ngoài cuộn trang, như một số loại chức năng thu phóng.


13
Thật tuyệt nhưng thật đáng buồn khi một và chỉ Firefox không hỗ trợ nó cho nhà phát triển.mozilla.org / en-US / docs / DOM / DOM_event_Vference / Lỗi (đã thử nghiệm trong FF v15). : C
nours

8
Điều này hữu ích cho tôi: Tôi cần phát hiện cuộn, mặc dù bản thân trang không thực sự cuộn, vì vậy scrollTopkhông cập nhật. Trên thực tế, $(window).scroll()không hề bắn.
Martti Laine

13
Thật tuyệt khi bạn không cần trạng thái cũ. Tuy nhiên, kỹ thuật này sẽ không hoạt động trên điện thoại di động hoặc máy tính bảng, vì chúng không có con lăn chuột!
joeytwiddle

13
Cách tiếp cận này sẽ không hoạt động nếu tôi cuộn bằng bàn phím. Đây chắc chắn là một cách tiếp cận thú vị cho những thứ như phóng to, nhưng tôi không nghĩ rằng nó giải quyết câu hỏi hướng cuộn.
chmac

6
$ ("html, body"). bind ({'mousewheel DOMMouseScroll onmousewheel touchmove scroll': function (e) {// ...}); hoạt động với tôi trong việc phát hiện tất cả dữ liệu cuộn của trình duyệt
GoreDefex 04/11/2016

31

Lưu trữ vị trí cuộn trước đó, sau đó xem liệu vị trí mới lớn hơn hoặc nhỏ hơn vị trí đó.

Đây là một cách để tránh mọi biến toàn cục ( fiddle có sẵn ở đây ):

(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

29

Giải pháp hiện có

Có thể có 3 giải pháp từ bài đăng này và câu trả lời khác .

Giải pháp 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;
    });

Giải pháp 2

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

Giải pháp 3

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

Kiểm tra đa trình duyệt

Tôi không thể thử nghiệm nó trên Safari

chrome 42 (Thắng 7)

  • Giải pháp 1
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: Không hoạt động
  • Giải pháp 3
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn

Firefox 37 (Thắng 7)

  • Giải pháp 1
    • Lên: 20 sự kiện trên 1 cuộn
    • Xuống: 20 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: 1 sự kiện trên 1 cuộn
  • Giải pháp 3
    • Lên: Không làm việc
    • Xuống: Không hoạt động

IE 11 (Thắng 8)

  • Giải pháp 1
    • Lên: 10 sự kiện trên 1 cuộn (hiệu ứng phụ: cuộn xuống cuối cùng xảy ra)
    • Xuống: 10 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: Không hoạt động
  • Giải pháp 3
    • Lên: Không làm việc
    • Xuống: 1 sự kiện trên 1 cuộn

IE 10 (Thắng 7)

  • Giải pháp 1
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: Không hoạt động
  • Giải pháp 3
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn

IE 9 (Thắng 7)

  • Giải pháp 1
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: Không hoạt động
  • Giải pháp 3
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn

IE 8 (Thắng 7)

  • Giải pháp 1
    • Lên: 2 sự kiện trên 1 cuộn (hiệu ứng phụ: cuộn xuống cuối cùng xảy ra)
    • Xuống: 2 ~ 4 sự kiện trên 1 cuộn
  • Giải 2
    • Lên: Không làm việc
    • Xuống: Không hoạt động
  • Giải pháp 3
    • Lên: 1 sự kiện trên 1 cuộn
    • Xuống: 1 sự kiện trên 1 cuộn

Giải pháp kết hợp

Tôi đã kiểm tra tác dụng phụ của IE 11 và IE 8 là từ if elsetuyên bố. Vì vậy, tôi đã thay thế nó bằng if else iftuyên bố như sau.

Từ thử nghiệm đa trình duyệt, tôi quyết định sử dụng Giải pháp 3 cho các trình duyệt phổ biến và Giải pháp 1 cho firefox và IE 11.

Tôi đã giới thiệu câu trả lời này để phát hiện 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');
            }
        });
    }

Nếu ai đó có thể thêm kết quả Safari browser, nó sẽ hữu ích để bổ sung giải pháp.
Lập trình viên hóa học

Giáo sư! Tôi thấy rằng trình duyệt mặc định của Chrome dành cho thiết bị di động và Android chỉ được bao phủ bởi Giải pháp 1. Vì vậy, sẽ tốt hơn nếu sử dụng cả Giải pháp 1 và 3 cùng nhau để bao quát các trình duyệt khác nhau.
Lập trình viên hóa học

Sẽ không hoạt động nếu thiết kế là một thiết kế bố trí cố định. Nếu bạn muốn phát hiện hướng cuộn trên trang web không cuộn tĩnh, Firefox và IE11 sẽ không hoạt động
Shannon Hochkins

Tôi thấy rằng khi tôi sử dụng nó, nó sử dụng "Các trình duyệt khác" trong chrome, điều này thực sự không được sử dụng nhiều khi bạn muốn phát hiện cuộn bằng cả bánh xe chuột và thanh cuộn. .scroll sẽ phát hiện cả hai loại cuộn trong chrome.
Sam

12

Tôi hiểu rằng đã có một câu trả lời được chấp nhận, nhưng muốn đăng những gì tôi đang sử dụng trong trường hợp nó có thể giúp bất cứ ai. Tôi nhận được hướng như cliphexvới sự kiện mousewheel nhưng với sự hỗ trợ cho Firefox. Thật hữu ích khi làm theo cách này trong trường hợp bạn đang làm một việc gì đó như khóa cuộn và không thể có được cuộn hiện tại.

Xem phiên bản trực tiếp tại đây .

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

@EtienneMartin đoạn mã trên phụ thuộc vào jQuery nếu đó là nguyên nhân gây ra lỗi của bạn. Xin vui lòng xem các fiddle đính kèm để xem nó hoạt động.
ăn tối

8

Sự kiện cuộn

Sự kiện cuộn hoạt động kỳ quặc trong FF (nó được bắn rất nhiều lần vì cuộn mượt mà) nhưng nó hoạt động.

Lưu ý: Sự kiện cuộn thực sự được kích hoạt khi kéo thanh cuộn, sử dụng phím con trỏ hoặc con lăn chuột.

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

Sự kiện bánh xe

Bạn cũng có thể xem MDN, nó tiết lộ một thông tin tuyệt vời về Sự kiện Bánh xe .

Lưu ý: Sự kiện bánh xe chỉ được kích hoạt khi sử dụng con lăn chuột ; các phím con trỏ và kéo thanh cuộn không kích hoạt sự kiện.

Tôi đã đọc tài liệu và ví dụ: Nghe sự kiện này trên trình duyệt
và sau một số thử nghiệm với FF, IE, chrome, safari, tôi đã kết thúc với đoạn trích này:

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

2
Tôi có chế độ xem bảng cố định sẽ vô hiệu hóa thanh cuộn thực tế, vì vậy tôi cần phát hiện hướng từ bánh xe chuột. Giải pháp mousewheel của bạn hoạt động hoàn hảo trên trình duyệt, vì vậy, cảm ơn bạn vì điều đó!
Shannon Hochkins

8

Trong trường hợp bạn chỉ muốn biết nếu bạn cuộn lên hoặc xuống bằng thiết bị con trỏ (chuột hoặc bảng theo dõi), bạn có thể sử dụng thuộc tính deltaY của wheelsự kiện.

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


Liên kết này nói không dựa vào 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; 
} 

hoặc sử dụng phần mở rộng mousewheel , xem tại đây .


3

Tôi đã thấy nhiều phiên bản của câu trả lời hay ở đây nhưng có vẻ như một số người đang gặp vấn đề về trình duyệt chéo nên đây là cách khắc phục của tôi.

Tôi đã sử dụng thành công để phát hiện hướng trong FF, IE và Chrome ... Tôi chưa thử nghiệm nó trong safari vì tôi thường sử dụng 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");
        }
    }
});

Hãy nhớ rằng tôi cũng sử dụng điều này để dừng mọi thao tác cuộn vì vậy nếu bạn muốn cuộn vẫn xảy ra, bạn phải xóa e.preventDefault(); e.stopPropagation();


1
luôn quay trở lại trên Android GS5
SISYN

Điều này đã làm việc tuyệt vời! Tôi đã có một vấn đề với câu trả lời được bình chọn hàng đầu trên IE. Điều này không có vấn đề đó! +1 từ tôi.
Phóng xạ

3

Để bỏ qua bất kỳ snap / đà / bật lại ở đầu và cuối trang, đây là phiên bản sửa đổi của câu trả lời được chấp nhận của Josiah :

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

3

Bạn có thể xác định hướng mousewhell.

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

3

Sử dụng để 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.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");
        }

    }

Thí dụ


3

mã này hoạt động tốt với IE, Firefox, Opera và Chrome:

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

'bánh xe chuột'deltaY thuộc tính phải được sử dụng trong hàm bind () .

Hãy nhớ rằng: Người dùng của bạn phải cập nhật hệ thống và trình duyệt của họ vì lý do bảo mật. Năm 2018, những lời bào chữa của "Tôi có IE 7" là một điều vô nghĩa. Chúng ta phải giáo dục người dùng.

Chúc bạn ngày mới tốt lành :)


1
Tôi đã thử mã của bạn và nó theo cách khác. Cái đầu tiên được kích hoạt khi cuộn xuống và cái thứ hai khi cuộn lên.
AlexioVay

Xin chào :) Cảm ơn AlexioVay. Tôi đã chỉnh sửa mã của mình (Khoảng thời gian quá!) ^^. Tất nhiên "console.log ('.......')" nó chỉ là một ví dụ về những gì chúng ta có thể làm.
Cyril Morales

2

Giữ cho nó siêu đơn giản:

Cách nghe sự kiện của jQuery:

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

Cách nghe sự kiện JavaScript của Vanilla:

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

Chức năng vẫn giữ nguyên:

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

Tôi đã viết một bài sâu sắc thêm về nó ở đây


Là jquery-wheel để sử dụng phiên bản jquery?
Hastig Zusammenstellen

1
jquery-wheel không cần thiết cho @HastigZusammenstellen này
CR Rollyson

2

Bạn có thể sử dụng cả tùy chọn cuộn và cuộn chuột để theo dõi chuyển động lên xuống cùng một lúc.

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

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

Bạn cũng có thể thay thế 'cơ thể' bằng (cửa sổ).


Có vẻ hoạt động tốt trong Chrome nhưng không hoạt động trong FF (55.0.2, Ubuntu)
Hastig Zusammenstellen

1

dự trữ một mức tăng trong .data ()phần tử được cuộn, sau đó bạn sẽ có thể kiểm tra số lần cuộn đạt đến đỉnh.


1

Tại sao không ai sử dụng eventđối tượng được trả về bởi jQuerycuộn?

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

Tôi đang sử dụng chromiumvà tôi đã không kiểm tra trên các trình duyệt khác nếu chúng có dirtài sản.


1

bindđã bị phản đối trên v3 ("thay thế bởi on") và wheelhiện được hỗ trợ , hãy quên 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>

wheelTương thích trình duyệt của sự kiện trên MDN (2019-03-18) :

Khả năng tương thích của sự kiện bánh xe


Mã ở trên tạo ra hai nhật ký giao diện điều khiển, sử dụng cách sau để tách hoàn toàn lên / xuống / trái / phải: 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

Đối với touchmovesự kiện sử dụng điện thoại di động thay thế.
CPHPython

1

Bạn cũng có thể sử dụng nó

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


0

trong .data()phần tử, bạn có thể lưu trữ JSON và các giá trị thử nghiệm để khởi chạy các sự kiện

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

0

Đây là phát hiện đơn giản và dễ dàng khi người dùng cuộn từ đầu trang và khi họ quay lại đầu trang.

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

0

Đây là một giải pháp tối ưu để phát hiện hướng chỉ khi người dùng cuộn cuối.

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

});

0

Bạn nên thử cái này

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

0

Tôi gặp vấn đề với cuộn đàn hồi (cuộn nảy, dải cao su). Bỏ qua sự kiện cuộn xuống nếu gần với đầu trang làm việc cho tôi.

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

0

Điều này hoạt động trong tất cả các trình duyệt máy tính hoặc điện thoại, mở rộng trên các câu trả lời hàng đầu. Người ta có thể xây dựng một cửa sổ đối tượng sự kiện phức tạp hơn ["scroll_evt"] sau đó gọi nó trong hàm handleScroll (). Điều này kích hoạt cho 2 điều kiện đồng thời, nếu độ trễ nhất định đã trôi qua hoặc delta nhất định được thông qua để loại bỏ một số kích hoạt không mong muốn.

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