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

JavaScript数字递增动画遇到带千位逗号的数字停止计数如何解决

问题根源

你的代码失效的核心原因是parseInt读取带逗号的字符串时会自动截断逗号后的内容:parseInt("53,210", 10)的返回值只有53,导致目标计数数值错误,同时渲染时没有将计算得到的纯数字转换为带千位分隔符的格式。

修复思路
  1. 读取目标数值时,先移除字符串中所有逗号再转为整数
  2. 每次更新DOM时,将计算得到的纯数字转换为带千位逗号的格式再写入
  3. 优化数值更新判断逻辑,避免每次从带逗号的DOM内容中解析整数
完整修改后代码

JavaScript代码

window.onload = function() {
  runAnimations();
};

// 动画总时长,单位ms
const animationDuration = 2000;
// 按60帧/秒计算每帧间隔时长
const frameDuration = 1000 / 60;
// 动画总帧数
const totalFrames = Math.round( animationDuration / frameDuration );
// ease-out缓动函数,计数后期速度放缓
const easeOutQuad = t => t * ( 2 - t );

// 千位分隔符格式化工具函数
const formatWithCommas = num => num.toLocaleString();

// 计数动画函数
const animateCountUp = el => {
    let frame = 0;
    // 先移除所有逗号再转整数,得到正确的目标值
    const countTo = parseInt( el.innerHTML.replace(/,/g, ''), 10 );
    // 记录上一次渲染的数值,避免每次从DOM重复解析
    let lastRenderedCount = 0;
    const counter = setInterval( () => {
        frame++;
        // 计算当前动画进度并应用缓动曲线
        const progress = easeOutQuad( frame / totalFrames );
        // 计算当前应展示的数值
        const currentCount = Math.round( countTo * progress );

        // 数值变化时更新DOM,同时格式化带千位逗号
        if (currentCount !== lastRenderedCount) {
            el.innerHTML = formatWithCommas(currentCount);
            lastRenderedCount = currentCount;
        }

        // 动画结束清除定时器
        if ( frame === totalFrames ) {
            clearInterval( counter );
        }
    }, frameDuration );
};

// 对所有带countup类的元素执行动画
const runAnimations = () => {
    const countupEls = document.querySelectorAll( '.countup' );
    countupEls.forEach( animateCountUp );
};

HTML代码

<ul>
  <li><span class="countup">45</span></li>
  <li><span class="countup">110</span></li>
  <li><span class="countup">53,210</span></li>
</ul>

修改后代码可兼容纯数字和带千位逗号的初始值,动画过程中也会自动展示千位分隔符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:36:00