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

如何用单个JavaScript函数实现多个div的数值递增动画效果?

方案实现

分两种场景适配,你可以根据自身需求选择:

场景1:所有计数器的起始值、结束值、动画参数完全一致

如果要使用200个同规则的计数器,不需要手动写200次调用,直接循环生成调用即可:

// 假设你的div id命名规则为value1、value2...value200
for(let i = 1; i <= 200; i++) {
  animateValue(`value${i}`, 100, 1000000)
}

场景2:每个计数器的参数不同(支持自定义起始/结束值)

推荐用自定义属性绑定配置的方案,后续新增计数器仅需要修改HTML,不用调整JS代码,维护成本最低:

第一步:修改HTML结构

给所有需要动画的计数器添加统一类名,用data-*属性存储每个计数器的专属配置:

<!-- 可以自由自定义每个计数器的起始、结束值 -->
<div class="anim-counter" data-start="100" data-end="1000000">100</div>
<div class="anim-counter" data-start="0" data-end="50000">0</div>
<div class="anim-counter" data-start="200" data-end="800000">200</div>
<!-- 新增200个计数器直接复制标签修改参数即可,不需要修改JS代码 -->

第二步:调整JS代码,批量初始化

/**
 * 原动画函数无需做任何修改
 */
function animateValue(id, start, end, duration) {
  let current = start;
  const obj = document.getElementById(id);
  obj.innerHTML = current;
  const setIncrOut = () => {
    let time = Math.random() * 500;
    setTimeout(function() {
      if (current < end) {
        current += 1;
        obj.innerHTML = current;
        setIncrOut(time)
      }
    }, time);
  }
  setIncrOut();
}

// 批量初始化所有计数器
document.querySelectorAll('.anim-counter').forEach((counterEl, index) => {
  // 自动生成唯一id,无需手动给div添加id
  const uid = `anim-counter-${index}`;
  counterEl.id = uid;
  // 读取元素绑定的自定义参数
  const start = Number(counterEl.dataset.start) || 0;
  const end = Number(counterEl.dataset.end) || 100;
  const duration = Number(counterEl.dataset.duration) || 500;
  // 调用动画
  animateValue(uid, start, end, duration);
})

优化提示

如果对动画精度要求不高,200个计数器同时运行时,可以把setTimeout替换为全局的requestAnimationFrame统一调度,避免大量定时器占用资源,你当前的实现已经可以满足需求,不做额外优化也可以正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:09:04