progress标签需手动更新value属性,通过XMLHttpRequest.upload.onprogress监听上传进度并计算百分比,配合CSS定制样式和过渡动画,上传完成后需重置状态。

progress 标签本身不自动获取上传进度,需配合 XMLHttpRequest 或 Fetch API + Upload Progress Events 手动更新其 value 属性。
基础结构:正确初始化 progress 元素
确保 <progress></progress> 有明确的 min、max 和初始 value:
<progress id="uploadProgress" min="0" max="100" value="0"></progress> <span id="percentText">0%</span>
其中 max="100" 便于直接映射百分比;value 初始为 0,后续由 JS 动态更新。
监听上传进度:使用 XMLHttpRequest 的 upload.onprogress
这是最兼容、最可靠的方式。关键点:
立即学习“前端免费学习笔记(深入)”;
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 必须在
open()之后、send()之前绑定upload.onprogress - 事件对象的
loaded和total属性提供已上传字节数和总字节数 - 计算百分比时注意
total可能为 0(如服务端未返回 Content-Length),需做安全判断
示例代码片段:
const xhr = new XMLHttpRequest();
const progressEl = document.getElementById('uploadProgress');
const textEl = document.getElementById('percentText');
<p>xhr.upload.onprogress = function(e) {
if (e.lengthComputable) {
const percent = Math.round((e.loaded / e.total) * 100);
progressEl.value = percent;
textEl.textContent = <code>${percent}%</code>;
}
};</p><p>xhr.open('POST', '/upload');
xhr.send(file);替代方案:Fetch API 需配合 ReadableStream(现代浏览器)
Fetch 本身不支持上传进度,但可通过 手动分块上传 + stream reader 实现(较复杂)。更实用的做法是:
- 继续用
XMLHttpRequest处理上传(推荐,兼容性好、API 直观) - 若必须用 Fetch,可封装一个“带进度的上传函数”,底层仍借助
XMLHttpRequest或使用第三方库(如axios的onUploadProgress选项)
样式增强:让进度条更直观
默认 <progress></progress> 样式简陋,可用 CSS 定制外观:
progress {
width: 200px;
height: 8px;
}
progress::-webkit-progress-bar { background-color: #eee; }
progress::-webkit-progress-value { background-color: #4CAF50; border-radius: 4px; }
progress::-moz-progress-bar { background-color: #4CAF50; }添加过渡动画能让数值变化更平滑:
progress::-webkit-progress-value {
transition: width 0.2s ease;
}不复杂但容易忽略:记得在上传完成或失败后重置 value,避免残留状态;同时处理 error、abort 等事件,提升用户体验。


















