检测滚动方向

IT技术 javascript scroll onscroll
2021-02-02 22:29:14

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

我想只放一个“到顶部”按钮,但如果可以的话,我想避免这种情况。

我现在刚刚尝试使用此代码,但没有用:

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

可以通过存储先前的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);
@Prateek 仍然没什么我害怕。这可能与我在页面加载时运行它的事实有关吗?这是屏幕截图:i.imgur.com/Q0H0T4s.png
2021-03-12 22:29:14
@Prateek 感谢您的回答,但它对我不起作用......我正在尝试在使用 Tumult Hype 构建的 web 应用程序中“更改场景”。
2021-03-14 22:29:14
完全同意 !!谢谢@EdBallot。我们应该在 window.onload 事件上初始化相同的内容。
2021-03-19 22:29:14
初始化lastScrollTop为 pageYOffset ||会更安全 scrollTop 而不是假设 0
2021-04-04 22:29:14
我在答案中添加了一些评论,请检查。我猜你正在使用“element.addEventListener”。
2021-04-04 22:29:14

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

window.onscroll = function(e) {
  // print "false" if direction is down and "true" if up
  console.log(this.oldScroll > this.scrollY);
  this.oldScroll = this.scrollY;
}
欢迎来到 SO,如果您在答案中添加说明,这对 OP 和其他人更有帮助。
2021-03-20 22:29:14

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

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

例子

这很好,但似乎只适用于使用滚轮
2021-03-12 22:29:14
来自 MDN 网络文档:注意:不要将滚轮事件与滚动事件混淆。滚轮事件的默认操作是特定于实现的,并且不一定调度滚动事件。即使这样做,wheel 事件中的 delta* 值也不一定反映内容的滚动方向。因此,不要依赖滚轮事件的 delta* 属性来获取滚动方向。相反,在滚动事件中检测目标的 scrollLeft 和 scrollTop 的值变化。developer.mozilla.org/en-US/docs/Web/API/Element/wheel_event
2021-03-16 22:29:14
这个很好(与scroll事件相比),因为它在到达滚动位置的末尾或开始后也会触发 - 有时您可能想要触发一些特定的动作“滚动”元素的末尾。
2021-03-24 22:29:14
谢谢!在“固定”定位部分非常有用!
2021-03-24 22:29:14

你可以试试这样做。

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>

这对我来说效果不佳。当我向上滚动到某个特定高度时,它会向下显示
2021-04-05 22:29:14

这是对 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;
});});
感谢您的提示……这似乎与 IE 的“平滑滚动”选项有关
2021-03-16 22:29:14