基于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%对应的计算基准。
- 百分比换算公式拆解:
- 计算全周期总秒数:
totalSeconds = endTimestamp - startTimestamp - 计算当前已经流逝的秒数:
elapsedSeconds = currentTimestamp - startTimestamp - 计算进度百分比:
progressPercent = (elapsedSeconds / totalSeconds) * 100
- 计算全周期总秒数:
- 边界值兼容处理:对计算出的百分比做范围校验,若值小于0说明尚未到倒计时启动时间,进度设为0%;若值大于100说明已经超过截止时间,进度设为100%,避免进度条宽度溢出容器或出现负数。
- 动态实时更新:设置1秒间隔的定时器,每次触发时重新计算上述百分比数值,同步更新进度条的宽度值与
aria-valuenow属性,搭配Bootstrap内置的条纹动画类,即可实现流畅的动态倒计时进度效果。
踩坑说明:原有逻辑的核心问题是没有全周期总时长作为计算分母,直接把剩余秒数当百分比分子——举个实际例子,如果倒计时全周期是7天(共604800秒),刚启动倒计时时剩余秒数是604800,按原有代码逻辑会把进度条宽度设为604800%,远远撑出容器范围,根本没法正常展示。
内容的提问来源于stack exchange,提问作者Muhammad Jafar
相关产品推荐
相关产品推荐

