检测滚动方向

dwi*_*own 99 javascript scroll onscroll

所以我试图用JavaScript on scroll来调用一个函数.但我想知道我是否可以在不使用jQuery的情况下检测滚动的方向.如果没有,那么有任何解决方法吗?

我想的只是放一个"顶部"按钮,但如果可以,我想避免这样做.

我现在只是尝试使用此代码,但它不起作用:

if document.body.scrollTop <= 0 {
    alert ("scrolling down")
} else {
    alert ("scrolling up")
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*eek 144

可以通过存储先前的scrollTop值并将当前的scrollTop值与其进行比较来检测它.

JS:

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);
Run Code Online (Sandbox Code Playgroud)

  • 将`lastScrollTop`初始化为pageYOffset ||会更安全 scrollTop而不是假设为0 (12认同)

IT *_*LOG 43

捕捉所有滚动事件(触摸和滚轮)的简单方法

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

  • 欢迎来到SO,如果你在答案中添加了一个desctription,这对OP和其他人更有帮助. (6认同)

Vas*_*asi 22

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

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

    }
Run Code Online (Sandbox Code Playgroud)

  • 来自 MDN webdocs: 注意:不要将滚轮事件与滚动事件混淆。滚轮事件的默认操作是特定于实现的,并且不一定调度滚动事件。即使确实如此,滚轮事件中的 delta* 值也不一定反映内容的滚动方向。因此,不要依赖滚轮事件的 delta* 属性来获取滚动方向。相反,检测滚动事件中目标的scrollLeft 和scrollTop 的值变化。https://developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event (5认同)
  • 这很好,但似乎只适用于使用滚轮 (2认同)
  • 谢谢!在“固定”定位部分非常有用! (2认同)

小智 10

虽然接受的答案有效,但值得注意的是,这将以很高的速度触发。这可能会导致计算成本高昂的操作出现性能问题。

MDN 的建议是限制事件。下面是对其示例的修改,增强了检测滚动方向的能力。

修改自:https ://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event

// ## function declaration
function scrollEventThrottle(fn) {
  let last_known_scroll_position = 0;
  let ticking = false;
  window.addEventListener("scroll", function () {
    let previous_known_scroll_position = last_known_scroll_position;
    last_known_scroll_position = window.scrollY;
    if (!ticking) {
      window.requestAnimationFrame(function () {
        fn(last_known_scroll_position, previous_known_scroll_position);
        ticking = false;
      });
      ticking = true;
    }
  });
}

// ## function invocation
scrollEventThrottle((scrollPos, previousScrollPos) => {
    if (previousScrollPos > scrollPos) {
      console.log("going up");
    } else {
      console.log("going down");
    }
});

Run Code Online (Sandbox Code Playgroud)


Emm*_*ual 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;
});});
Run Code Online (Sandbox Code Playgroud)


dav*_*r21 8

您可以尝试这样做。

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();
Run Code Online (Sandbox Code Playgroud)
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%;
}
Run Code Online (Sandbox Code Playgroud)
<div class="cont">
  <div class="item"></div>
  <div class="item red"></div>
  <p id="scrollLoc">0</p>
</div>
Run Code Online (Sandbox Code Playgroud)


ptm*_*der 8

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

// 初始化

let oldValue = 0;
Run Code Online (Sandbox Code Playgroud)

//监听事件

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;
});
Run Code Online (Sandbox Code Playgroud)


Usm*_*med 5

这个简单的代码可以工作:检查控制台的结果。

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);
});
Run Code Online (Sandbox Code Playgroud)