gpt4 book ai didi

javascript - 永久缓慢地向下滚动页面,而不会占用大量 CPU 或滚动滞后

转载 作者:技术小花猫 更新时间:2023-10-29 12:49:32 25 4
gpt4 key购买 nike

我想让页面缓慢而平滑地向下滚动。好吧,速度实际上应该是可调的。用户还应该能够在脚本向下滚动时手动向上滚动。首先我试过这个:

var autoScrollDelay = 1
var autoScrollSpeed = 1
var autoScrollTimer
function setAutoScroll(newValue) {
autoScrollSpeed = newValue ? newValue : autoScrollSpeed
if (autoScrollTimer) {
clearInterval(autoScrollTimer)
}
if (autoScrollDelay) {
autoScrollTimer = setInterval(function(){
window.scrollBy(0,autoScrollSpeed)
},autoScrollDelay)
}
}
setAutoScroll(1) // higher number = faster scrolling

但它造成了非常大的 CPU 负载,并且最慢的速度太快了。此外,在代码运行时手动向上滚动无法正常工作。

然后我尝试了:

var autoScrollDelay = 1
var autoScrollSpeed = 1
var autoScrollTimer
function setAutoScroll(newValue) {
autoScrollDelay = newValue ? newValue : autoScrollDelay //using autoScrollDelay instead of autoScrollSpeed
if (autoScrollTimer) {
clearInterval(autoScrollTimer)
}
if (autoScrollDelay) {
autoScrollTimer = setInterval(function(){
window.scrollBy(0,autoScrollSpeed)
},autoScrollDelay)
}
}
setAutoScroll(200) // higher number scrolls slower

但设置太慢(例如 200)时滚动不流畅。

然后我尝试了:

$("html, body").animate({
scrollTop: $('html, body').get(0).scrollHeight,
}, 40000, "linear");

但 CPU 负载再次高得不合理,并且无法通过这种方式手动向上或向下滚动。

有更好的方法吗?

最佳答案

这是一种可能的实现方式。刷新率是固定的,对应下面代码中的fps。为了确保速度恒定,我在计算新的滚动位置时考虑了自上次滚动以来耗时。允许手动滚动(使用滚动条、鼠标滚轮或移动设备上的触摸)并通过处理 scrollwheeltouchmove 将其考虑在内 事件。您可以在 this codepen 中查看工作中的代码.

var fps = 100;
var speedFactor = 0.001;
var minDelta = 0.5;
var autoScrollSpeed = 10;
var autoScrollTimer, restartTimer;
var isScrolling = false;
var prevPos = 0, currentPos = 0;
var currentTime, prevTime, timeDiff;

window.addEventListener("scroll", function (e) {
// window.pageYOffset is the fallback value for IE
currentPos = window.scrollY || window.pageYOffset;
});

window.addEventListener("wheel", handleManualScroll);
window.addEventListener("touchmove", handleManualScroll);

function handleManualScroll() {
// window.pageYOffset is the fallback value for IE
currentPos = window.scrollY || window.pageYOffset;
clearInterval(autoScrollTimer);
if (restartTimer) {
clearTimeout(restartTimer);
}
restartTimer = setTimeout(() => {
prevTime = null;
setAutoScroll();
}, 50);
}

function setAutoScroll(newValue) {
if (newValue) {
autoScrollSpeed = speedFactor * newValue;
}
if (autoScrollTimer) {
clearInterval(autoScrollTimer);
}
autoScrollTimer = setInterval(function(){
currentTime = Date.now();
if (prevTime) {
if (!isScrolling) {
timeDiff = currentTime - prevTime;
currentPos += autoScrollSpeed * timeDiff;
if (Math.abs(currentPos - prevPos) >= minDelta) {
isScrolling = true;
window.scrollTo(0, currentPos);
isScrolling = false;
prevPos = currentPos;
prevTime = currentTime;
}
}
} else {
prevTime = currentTime;
}
}, 1000 / fps);
}

setAutoScroll(20);

关于javascript - 永久缓慢地向下滚动页面,而不会占用大量 CPU 或滚动滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45270497/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com