检测滚动方向


119

因此,我正在尝试使用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 2015年

Answers:


176

可以通过存储先前的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构建的Web应用程序中“更改场景”。
dwinnbrown 2015年

我在回答中添加了一些评论,请检查一下。我猜您正在使用“ element.addEventListener”。
Prateek

恐怕@Prateek还是一无所有。这与我在页面加载中运行它有关吗?这是屏幕截图:i.imgur.com/Q0H0T4s.png
dwinnbrown 2015年

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和其他人可能会更有帮助。
亚历杭德罗·蒙蒂利亚

32

使用它来查找滚动方向。这仅是找到垂直滚动的方向。支持所有跨浏览器。

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
这很好,但似乎仅适用于使用滚轮
Jonathan.Brink,

1
来自MDN Webdocs:注意:请勿将wheel事件与scroll事件混淆。wheel事件的默认操作是特定于实现的,不一定派发滚动事件。即使发生这种情况,wheel事件中的delta *值也不一定反映内容的滚动方向。因此,不要依靠wheel事件的delta *属性来获取滚动方向。而是在滚动事件中检测目标的scrollLeft和scrollTop的值更改。developer.mozilla.org/zh-CN/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
感谢您的提示...这似乎与IE“平滑滚动”选项相关联
Kristo

5
  1. 初始化oldValue
  2. 通过监听事件获取newValue
  3. 减去两个
  4. 从结果中得出结论
  5. 用newValue更新oldValue

//初始化

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 2015年

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

尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
唐老鸭
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.