需求:实现每滚动1000px触发操作的JS窗口监听函数
实现每滚动1000px触发一次操作的解决方案
直接通过scrollY % 1000 == 0判断确实不可靠,因为浏览器的scroll事件触发频率不是逐像素的,scrollY会跳过很多中间值。可以通过跟踪滚动所在的1000px区间来实现需求,不管上下滚动,只要进入新的区间就执行一次操作。
核心实现代码
// 记录上一次触发操作的1000px区间索引 let lastScrollInterval = null; window.addEventListener("scroll", () => { const scrollPos = window.scrollY; // 计算当前所在的1000px区间索引(向下取整) const currentInterval = Math.floor(scrollPos / 1000); // 只有当当前区间和上次不同时,才执行操作 if (currentInterval !== lastScrollInterval) { // 这里替换成你需要执行的业务逻辑 console.log(`触发操作,当前滚动区间:${currentInterval * 1000} - ${(currentInterval + 1) * 1000}px`); // 更新上次区间索引,避免重复触发 lastScrollInterval = currentInterval; } });
原理说明
- 用
Math.floor(scrollPos / 1000)将滚动位置转换为区间索引:比如滚动到5200px时索引为5,滚动到4800px时索引为4 - 每次滚动时对比当前索引与上次记录的索引,只要不一致,说明进入了新的1000px区间,立即执行操作
- 该方案天然支持上下滚动,无论滚动速度快慢,都会在区间切换时触发一次
可选性能优化(节流)
如果滚动事件触发过于频繁,可添加节流函数减少不必要的计算:
let lastScrollInterval = null; let throttleTimer = null; window.addEventListener("scroll", () => { if (throttleTimer) return; throttleTimer = setTimeout(() => { const scrollPos = window.scrollY; const currentInterval = Math.floor(scrollPos / 1000); if (currentInterval !== lastScrollInterval) { console.log(`触发操作,当前滚动区间:${currentInterval * 1000} - ${(currentInterval + 1) * 1000}px`); lastScrollInterval = currentInterval; } throttleTimer = null; }, 100); // 100ms节流间隔,可根据需求调整 });
内容的提问来源于stack exchange,提问作者JIRACHI
相关产品推荐
相关产品推荐

