javascript - JS/JQuery 中的去抖滚动事件是如何工作的?
问题描述
滚动事件的触发方式比我想要的要频繁。如果您向下滚动(后跟动画)并摆脱当前元素的 .swap 类,它应该做的就是将 .swap 类提供给下一个 Sibling。同样的事情只是向上。现在发生的情况是,如果向下/向上滚动,它基本上会转到最后一个元素和第一个元素。这是一个单页机,只是在不同的 div 之间切换。
我已经尝试过 Debounce、Throttling 和 requestAnimationFrame,但到目前为止还没有成功。例如:https ://css-tricks.com/debouncing-throttling-explained-examples/
非常感谢!
HTML:
<div class="div1 swap">
<h1>Hello</h1>
</div>
<div class="div2">
<h1>Stack</h1>
</div>
<div class="div3">
<h1>Overflow</h1>
</div>
<div class="div4">
<h1>Please</h1>
</div>
<div class="div5">
<h1>Help</h1>
</div>
CSS:
.div1, .div2, .div3, .div4, .div5{
visibility: hidden;
position: fixed;
}
.swap{
visibility: visible;
-webkit-animation: slide-in-left .8s ease-out both;
animation: slide-in-left .8s ease-out both;
}
JS:
window.onscroll = function(event) {
var aktiv = document.querySelector('.swap');
if(this.oldScroll > this.scrollY){
console.log("Up");
aktiv.previousElementSibling.classList.toggle('swap')
aktiv.classList.toggle('swap')
}
else{
console.log("Down");
aktiv.nextElementSibling.classList.toggle('swap')
aktiv.classList.toggle('swap')
}
this.oldScroll = this.scrollY;
}
解决方案
为滚动距离添加一些阈值,就像现在一样,即使您滚动 1px。你展示下一个元素。
window.onscroll = function(event) {
var aktiv = document.querySelector('.swap');
var diff = this.oldScroll - this.scrollY;
var delta = 100; // Or some element height
// If scolled too little - do nothing
if (Match.abs(diff) <= delta) {
return;
}
if(diff < 0){
console.log("Up");
aktiv.previousElementSibling.classList.toggle('swap')
aktiv.classList.toggle('swap')
}
else{
console.log("Down");
aktiv.nextElementSibling.classList.toggle('swap')
aktiv.classList.toggle('swap')
}
this.oldScroll = this.scrollY;
}
去抖动事件使用setTimeout
:
var timer;
window.onscroll = function (event) {
var self = this;
clearTimeout(timer);
timer = setTimeout(function () {
[...rest of code...]
}, 50)
}
推荐阅读
- laravel - 按类别获取产品的相关产品
- java - 使用 JDT 在独立 Java 应用程序中提取 IcompilationUnits
- python-3.x - 在 Mac OS 10.14.5 上安装 pymc
- javascript - 在确认页面中,如果我单击浏览器重新加载,商品将被添加到购物车中
- c - 循环遍历数组并将某些值分配给另一个数组
- c# - 如何防止串行通信中的“数据延迟”(C# 形式 <-> Arduino)
- javascript - jquery hide 方法隐藏了 div 但随后 div 重新出现
- java - 如何从 Spring Boot 应用程序调用 oracle 函数?
- java - RxJava 等待单个事件,RxJava
- reactjs - 如何在 React 中组合多个类名?