进度按钮(点击下载进度条实时填充动画源码)
进度按钮:点击后按钮内进度条从 0 走到 100%,文字实时显示百分比,完成变绿显示对勾,requestAnimationFrame 驱动流畅动画。
效果演示(真实可交互)
进度条在按钮内部从左到右填充,文字百分比实时更新
完整代码
HTML 结构:
<button id="pg-btn" class="pg-btn">
<span class="pg-bar" id="pg-bar"></span>
<span class="pg-text" id="pg-text">点击开始下载</span>
</button>
CSS 核心代码:
.pg-btn { position: relative; width: 240px; padding: 14px 0;
border: none; border-radius: 12px; overflow: hidden;
background: #1b1f2e; color: #fff; cursor: pointer; }
/* 进度条层 */
.pg-bar {
position: absolute; left: 0; top: 0; bottom: 0; width: 0%;
background: linear-gradient(90deg, #4d96ff, #7c5cff);
transition: width .15s linear; pointer-events: none;
}
/* 完成态 */
.pg-btn.pg-done .pg-bar {
background: linear-gradient(90deg, #22c55e, #16a34a); opacity: .35;
}
/* 文字层置于进度条之上 */
.pg-text { position: relative; z-index: 1; font-weight: 600; }
JS 逻辑(requestAnimationFrame 驱动):
const step = () => {
progress += Math.random() * 4 + 2; // 模拟网络波动:每次 2~6%
if (progress >= 100) {
progress = 100;
bar.style.width = '100%';
text.textContent = '100% · 下载完成 ✓';
btn.classList.add('pg-done');
return;
}
bar.style.width = progress + '%';
text.textContent = Math.floor(progress) + '%';
timer = requestAnimationFrame(step);
};
参数说明
| 参数 | 取值 | 说明 |
|---|---|---|
| 进度层定位 | absolute + left:0 | 宽度变化模拟进度 |
| 过渡 | width .15s linear | rAF 每帧更新时平滑追帧 |
| 单帧增量 | Math.random()*4+2 | 模拟真实网络波动,可用真实进度替换 |
| 完成态 | pg-done + 绿色 | 语义化标识,供读屏与样式使用 |
| 按钮宽度 | 240px | 过窄百分比文字会拥挤,建议 ≥180px |
兼容性与性能
- requestAnimationFrame 由浏览器按刷新率(60/120Hz)调度,比 setInterval 更平滑且页面切后台自动暂停,省电
- width 属性动画在进度条这种小尺寸元素上开销可忽略;如需极大规模可改 transform: scaleX + transform-origin: left
- 兼容所有现代浏览器;
<button>语义化 + aria 属性便于读屏播报进度 - 真实场景:把随机增量换成上传/下载接口的
onprogress回调(loaded / total),即可显示真实进度
常见问题
Q: 为什么不用 setInterval 而用 requestAnimationFrame? rAF 与屏幕刷新同步,进度更平滑;页面切到后台时自动停止,不会空转消耗 CPU;这是进度动画的最佳实践。
Q: 进度到 100% 后如何恢复可点击? 完成态加 pg-done 后若需重新执行,点击前先移除类、清零 progress 并重置 bar 宽度,或提供重置按钮(本组件已内置)。
Q: 能显示剩余时间吗? 可以,记录 startTime 与已传字节数,用 剩余 = (total - loaded) / 速率 估算,注意网络波动会导致估算跳变,建议做平滑滤波。
Q: 进度条可以换成圆形吗? 可以,把 bar 换成 conic-gradient 背景并让 --p 自定义属性随进度更新:background: conic-gradient(#4d96ff var(--p), #1b1f2e 0),兼容性良好。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。