适配JS倒计时计时器实现随促销时间递减显示剩余商品数量
问题核心错误
你的计算逻辑有2个根本性错误,直接导致比例计算完全失准:
- 分母取值完全错误:
countDownDate是促销截止时刻的绝对时间戳(从1970年1月1日0点到截止时刻的总毫秒数,数值是五十多年的毫秒总量),根本不是促销活动的总时长。你拿几小时/几天的剩余时长去跟五十多年的总毫秒数做除法,得到的比例自然完全不符合预期,你后面额外乘10000本质是凑数,根本解决不了逻辑问题。 - 缺少促销开始时间定义:要做线性递减,必须先明确促销的总时长,也就是「促销截止时间 - 促销开始时间」,你只定义了截止时间,根本拿不到计算比例需要的总时长基准。
正确计算逻辑
线性递减的核心比例公式应该是:
剩余库存占比 = 活动剩余时长 / 活动总时长
活动刚开始时剩余时长等于总时长,占比为1,剩余库存等于初始值;活动结束时剩余时长为0,占比为0,剩余库存为0,完全符合你要的线性递减效果。
修正后代码
<script> // 配置项 const initStock = 1000; // 初始可售库存 const promotionDuration = 4 * 24 * 60 * 60 * 1000; // 促销总时长,这里是4天对应的毫秒数 const countDownDate = new Date("Jul 01, 2022 20:59:59").getTime(); // 促销截止时间 const promotionStartDate = countDownDate - promotionDuration; // 自动计算促销开始时间 // 每秒更新一次 const timer = setInterval(function() { const now = new Date().getTime(); const distance = countDownDate - now; let stockLeft; // 边界判断 if (now < promotionStartDate) { // 活动还没开始,库存为初始值 stockLeft = initStock; } else if (distance < 0) { // 活动结束,售罄 clearInterval(timer); document.getElementById("timer").innerHTML = "SOLD OUT"; stockLeft = 0; } else { // 正常计算剩余库存,向下取整避免出现小数 const remainPercent = distance / promotionDuration; stockLeft = Math.floor(initStock * remainPercent); } // 页面渲染 document.getElementById("available").innerHTML = initStock; document.getElementById("distance").innerHTML = distance; document.getElementById("now").innerHTML = now; document.getElementById("countDownDate").innerHTML = countDownDate; document.getElementById("numbLeft").innerHTML = stockLeft; }, 1000); </script>
额外说明
- 如果你不需要处理「活动未开始」的场景,直接把
promotionStartDate换成你实际的活动开始时间即可,不需要通过总时长倒推。 - 库存取整可以根据需求换
Math.round(四舍五入)或者保留指定位数小数,结合业务要求调整即可。
内容的提问来源于stack exchange,提问作者webguy
相关产品推荐
相关产品推荐

