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

基于Bootstrap 4进度条,如何将后台配置的截止日期时间差换算为动态进度正确占比

基于Bootstrap 4实现带倒计时的动态进度条

核心需求

进度条宽度占比不使用固定静态值,完全根据后台管理员配置的截止日期动态计算,和倒计时状态实时联动展示。

已完成的前期实现

  • 后端数据交互:已经对接后台配置接口,可获取管理员设置的截止日期(格式示例为DD-MM-YY H:M:S,如31-03-2021 14:15:00),通过计算「配置截止日期 - 当前系统时间」得到剩余时间秒数,对应嵌入页面的JS变量生成逻辑为:
    var countTime = #{(properties.countdown_date.to_datetime.strftime('%a, %d %b %Y %H:%M:%S').to_time - Time.now.to_datetime.strftime('%a, %d %b %Y %H:%M:%S').to_time).to_i}
    其中properties.countdown_date为后端获取后台配置截止日期的专用方法。
  • 页面结构搭建:已使用Bootstrap 4官方标准进度条结构,代码如下:
    <div class="progress" style="height: 1.3rem">
      <div
        aria-valuemax="100"
        aria-valuemin="0"
        aria-valuenow="25"
        class="progress-bar progress-bar-striped progress-bar-animated"
        role="progressbar"
      >
      </div>
    </div>
    
  • 初步赋值逻辑:尝试将获取到的剩余秒数直接作为进度条宽度百分比赋值,对应JS代码为:
    $(".progress-bar").css("width", countTime+"%");

现存问题

直接将剩余秒数作为百分比值赋值给进度条,完全不符合进度条0-100%的刻度规则:既没有全周期的统一计算基准,也无法匹配真实的时间流逝比例,展示效果完全失真,无法达到动态展示的预期。

时间差换算进度条百分比的实现方案

要解决比例计算问题,核心是明确全周期的计算基准,不能孤立使用剩余秒数做换算,具体实现逻辑如下:

  • 补全计算所需的基准值:后端除了传递管理员配置的截止日期时间戳,还需要同步传递本次倒计时的启动时间戳,两个时间的差值就是倒计时的完整总时长,作为进度条100%对应的计算基准。
  • 百分比换算公式拆解:
    1. 计算全周期总秒数:totalSeconds = endTimestamp - startTimestamp
    2. 计算当前已经流逝的秒数:elapsedSeconds = currentTimestamp - startTimestamp
    3. 计算进度百分比:progressPercent = (elapsedSeconds / totalSeconds) * 100
  • 边界值兼容处理:对计算出的百分比做范围校验,若值小于0说明尚未到倒计时启动时间,进度设为0%;若值大于100说明已经超过截止时间,进度设为100%,避免进度条宽度溢出容器或出现负数。
  • 动态实时更新:设置1秒间隔的定时器,每次触发时重新计算上述百分比数值,同步更新进度条的宽度值与aria-valuenow属性,搭配Bootstrap内置的条纹动画类,即可实现流畅的动态倒计时进度效果。

踩坑说明:原有逻辑的核心问题是没有全周期总时长作为计算分母,直接把剩余秒数当百分比分子——举个实际例子,如果倒计时全周期是7天(共604800秒),刚启动倒计时时剩余秒数是604800,按原有代码逻辑会把进度条宽度设为604800%,远远撑出容器范围,根本没法正常展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 10:15:07