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

如何实现JavaScript数字计数器仅在滚动到对应区域时启动

实现方案

核心逻辑是通过IntersectionObserver API监听计数器所在区块的可见性,仅当区块进入可视区域后才启动计数逻辑,你原有HTML代码无需修改,直接替换JS代码即可生效:

// 声明定时器变量,初始不赋值
let pacijenti, procenat, klinika;
let count1 = 0;
let count2 = 0;
let count3 = 0;
// 计数器是否已经启动的标志,避免重复触发
let counterStarted = false;

// 原有计数逻辑保留
function pacijenata() {
  count1 += 1000;
  document.querySelector("#number1").innerHTML = count1 + "+";
  if( count1 === 10000 ) {
    clearInterval(pacijenti);
  }
}
function procenatIzlecenosti() {
  count2++;
  document.querySelector("#number2").innerHTML = count2 + "%";
  if( count2 === 70 ) {
    clearInterval(procenat);
  }
}
function klinike() {
  count3++;
  document.querySelector("#number3").innerHTML = count3;
  if( count3 === 4 ) {
    clearInterval(klinika);
  }
}

// 初始化可见性观察者
const observer = new IntersectionObserver((entries) => {
  const entry = entries[0];
  // 当元素进入可视区且还未启动过计数时触发
  if (entry.isIntersecting && !counterStarted) {
    counterStarted = true;
    // 重置数字初始显示
    document.querySelector("#number1").innerHTML = '0+';
    document.querySelector("#number2").innerHTML = '0%';
    document.querySelector("#number3").innerHTML = '0';
    // 启动三个计数器
    pacijenti = setInterval(pacijenata, 300);
    procenat = setInterval(procenatIzlecenosti, 60);
    klinika = setInterval(klinike, 400);
    // 计数启动后停止监听,节省性能
    observer.unobserve(entry.target);
  }
}, {
  threshold: 0.1 // 元素露出10%时触发,可根据需求调整数值
})

// 绑定要监听的计数器区块
observer.observe(document.querySelector('#brojac'))

内容的提问来源于stack exchange,提问作者Nexibald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 03:27:00