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

网页逐次显示数字的计数器实现问题求助

网页逐次显示数字的计数器实现问题求助

嘿,我懂你为啥头疼!这个问题简直是前端新手的经典踩坑点,ChatGPT没给你讲明白的话,我来给你掰扯清楚~

首先说为啥你的代码只显示最后一个数:JavaScript在浏览器里是单线程跑的,你的for循环执行速度快到离谱,浏览器根本没机会在每次循环的时候去更新页面显示。它会等整个循环跑完,才会腾出手来处理页面渲染,所以最后就只留下循环结束时的那个1000000了。

给你两个靠谱的解决方案,随便挑一个用:

方案1:用递归setTimeout实现

这个方法能让浏览器每次更新数字后都有时间渲染页面,代码改起来也简单:

<!DOCTYPE html>
<html>
<head>
<title>Compteur de 1 à 1000000</title>
</head>
<body>
<div id="counter"></div>
<script>
const counterElement = document.getElementById('counter');
let i = 1;

const updateCounter = () => {
  if (i <= 1000000) {
    counterElement.innerHTML = i;
    i++;
    // 这里的0不是真的等0秒,是让浏览器优先处理渲染再执行下一次更新
    // 要是觉得数字跳得太快,把0改成10/20这类数值就行,单位是毫秒
    setTimeout(updateCounter, 0);
  }
};

// 启动计数器
updateCounter();
</script>
</body>
</html>

方案2:用requestAnimationFrame更流畅

如果想要更丝滑的动画效果,推荐用requestAnimationFrame,它会和浏览器的渲染帧率同步,不会出现掉帧的情况:

<!DOCTYPE html>
<html>
<head>
<title>Compteur de 1 à 1000000</title>
</head>
<body>
<div id="counter"></div>
<script>
const counterElement = document.getElementById('counter');
let i = 1;

const updateCounter = () => {
  if (i <= 1000000) {
    counterElement.innerHTML = i;
    i++;
    // 让浏览器在准备好下一次渲染时执行更新
    requestAnimationFrame(updateCounter);
  }
};

// 启动计数器
updateCounter();
</script>
</body>
</html>

简单总结下核心逻辑:不能用同步循环一口气把所有数字都赋值完,得把每次数字更新拆成独立的任务,让浏览器有时间在任务间隙去渲染页面,这样就能看到数字逐个跳出来的效果啦~

备注:内容来源于stack exchange,提问作者digitalway

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 09:30:32