所以我尝试使用 JavaScript on scroll
来调用函数。但我想知道是否可以在不使用 jQuery 的情况下检测滚动的方向。如果没有,那么有什么解决方法吗?
我正在考虑只放置一个“顶部”按钮,但如果可以的话,我想避免这种情况。
我现在刚刚尝试使用此代码,但它不起作用:
if document.body.scrollTop <= 0 {
alert ("scrolling down")
} else {
alert ("scrolling up")
}
wheelDelta
。完全不是跨浏览器。请参阅phrogz.net/js/wheeldelta.html
可以通过存储之前的 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);
捕获所有滚动事件(触摸和滚轮)的简单方法
window.onscroll = function(e) {
// print "false" if direction is down and "true" if up
console.log(this.oldScroll > this.scrollY);
this.oldScroll = this.scrollY;
}
使用它来查找滚动方向。这只是为了找到垂直滚动的方向。支持所有跨浏览器。
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;
}
scroll
事件相比),因为它也会在到达滚动位置的结尾或开始后触发 - 有时您可能想要触发一些特定操作以“滚动”到元素的末尾。
你可以尝试这样做。
函数 scrollDetect(){ var lastScroll = 0; window.onscroll = function() { 让 currentScroll = document.documentElement.scrollTop || document.body.scrollTop; // 获取当前滚动值 if (currentScroll > 0 && lastScroll <= currentScroll){ lastScroll = currentScroll; document.getElementById("scrollLoc").innerHTML = "向下滚动"; }else{ lastScroll = currentScroll; document.getElementById("scrollLoc").innerHTML = "向上滚动"; } }; } 滚动检测(); html,body{ 高度:100%;宽度:100%;边距:0;填充:0; } .cont{ 高度:100%;宽度:100%; } .item{ 边距:0;填充:0;高度:100%;宽度:100%;背景:#ffad33; } .red{ 背景:红色; } p{ 位置:固定;字体大小:25px;前5%;左:5%; }
0
初始化一个 oldValue 通过监听事件获取 newValue 从结果中减去两者 得出结论 用 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;
});
这是对 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;
});});
这个简单的代码可以工作:检查控制台的结果。
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);
});
getBoundingClientRect
都会强制元素的布局(在本例中为整个主体)。因此,最好在每个滚动事件中调用一次并缓存结果......
虽然公认的答案有效,但值得注意的是,这将以很高的速度触发。这可能会导致计算成本高昂的操作出现性能问题。
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");
}
});
您可以使用 document.documentElement.scrollTop
获取滚动条位置。然后只需将其与之前的位置进行比较即可。
我个人使用此代码来检测 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;
}
}
如果有人希望通过 React hooks
实现它
const [scrollStatus, setScrollStatus] = useState({
scrollDirection: null,
scrollPos: 0,
});
useEffect(() => {
window.addEventListener("scroll", handleScrollDocument);
return () => window.removeEventListener("scroll", handleScrollDocument);
}, []);
function handleScrollDocument() {
setScrollStatus((prev) => { // to get 'previous' value of state
return {
scrollDirection:
document.body.getBoundingClientRect().top > prev.scrollPos
? "up"
: "down",
scrollPos: document.body.getBoundingClientRect().top,
};
});
}
console.log(scrollStatus.scrollDirection)
修改 Prateek 的回答,如果 lastScrollTop
没有变化,那么它将是水平滚动(x 方向溢出,可以通过鼠标使用水平滚动条或使用滚轮 + shift 来使用。
const containerElm = document.getElementById("container");
let lastScrollTop = containerElm.scrollTop;
containerElm.addEventListener("scroll", (evt) => {
const st = containerElm.scrollTop;
if (st > lastScrollTop) {
console.log("down scroll");
} else if (st < lastScrollTop) {
console.log("up scroll");
} else {
console.log("horizontal scroll");
}
lastScrollTop = Math.max(st, 0); // For mobile or negative scrolling
});
这似乎工作正常。
document.addEventListener('DOMContentLoaded', () => {
var scrollDirectionDown;
scrollDirectionDown = true;
window.addEventListener('scroll', () => {
if (this.oldScroll > this.scrollY) {
scrollDirectionDown = false;
} else {
scrollDirectionDown = true;
}
this.oldScroll = this.scrollY;
// test
if (scrollDirectionDown) {
console.log('scrolling down');
} else {
console.log('scrolling up');
}
});
});
不定期副业成功案例分享
lastScrollTop
初始化为 pageYOffset || 会更安全scrollTop 而不是假设为 0