进度按钮(点击下载进度条实时填充动画源码)

CSSJS 许可:自研原创

进度按钮:点击后按钮内进度条从 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 linearrAF 每帧更新时平滑追帧
单帧增量Math.random()*4+2模拟真实网络波动,可用真实进度替换
完成态pg-done + 绿色语义化标识,供读屏与样式使用
按钮宽度240px过窄百分比文字会拥挤,建议 ≥180px

兼容性与性能

常见问题

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(缓动曲线)等属性即可,代码中有注释说明。

✍️ 作者与审核