javascript - 使用 chrome 和平滑滚动时出现奇怪的滚动行为

标签 javascript google-chrome scroll

我正在编写一个虚拟滚动库并遇到一个奇怪的问题,该问题仅出现在 chrome 中并在 chrome 标志中禁用平滑滚动修复它。逻辑的一部分是使用不可见的 div 来拉伸(stretch)容器,当滚动到顶部时,获取一些新数据然后滚动回旧顶部。但是,在平滑滚动的 chrome 中,似乎不会立即应用对 scrollTop 的更改,因此会获取多个数据并且滚动位置错误。

我在 Linux 上使用 chrome 84.0.4147.105-1,并在 Windows 上进行了测试,结果相同。有时可能很难触发,最安全的方法是在不触发抓取的情况下将滚动条拖动到顶部附近并向上滚动。然后你会发现控制台值从 0 跳到 900(向下滚动)到一个小数字(为什么?)并再次触发提取

const container = document.getElementById('container')
const scroller = document.getElementById('scroller')

let height = 0
let isFetching = false
const fetchData = h => {
    if (isFetching) return
    isFetching = true
    setTimeout(() => {
        height += h
        scroller.style.height = height + 'px'
        container.scrollTop += h
        isFetching = false
    }, 50)
}

fetchData(800)

container.addEventListener('scroll', ev => {
    const top = ev.target.scrollTop
    console.log(top)
    if (top <= 50) {
        fetchData(800)
    }
})
#container {
    height: 200px;
    width: 500px;
    background-color: blue;
    overflow: auto;
}

#scroller {
    width: 100%;
}
<div id="container">
     <div id="scroller"></div>
</div>

最佳答案

一个临时的(并且非常不雅观)修复正在将 fetchData 更改为

const fetchData = h => {
    if (isFetching) return
    isFetching = true
    setTimeout(() => {
        height += h
        scroller.style.height = height + 'px'
        container.scrollTop += h
        isFetching = false
        setTimeout(() => container.scrollTop += h, 200)
    }, 50)
}

短暂延迟后再次滚动

关于javascript - 使用 chrome 和平滑滚动时出现奇怪的滚动行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63337242/

相关文章:

javascript - ASP.Net 复选框回发不会触发

javascript - 简单的 Nodejs Web 服务器总是发送文本/纯 css 和 js 文件

javascript - 让其他扩展处理代理设置

javascript - 特定 anchor 链接的平滑滚动

javascript - 如何在垂直滚动条上使用 Stellar.js 从侧面移动/动画元素?

javascript - 回调函数中的谷歌地图地理编码类型错误

javascript - 为什么我收到错误 'document.write can be a form of eval' ?

javascript - 当应用程序使用jquery mobile在cordova应用程序单页中加载页面时触发事件的最佳方式?

javascript - 如何向左滑动和向右滑动

javascript - 如何使用Javascript将窗口移动x个像素