You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:实现每滚动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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 19:01:51