不显示数值或不动的根本原因是value缺失、超出范围(0≤value≤max)或max为0/负数/非数字;必须同时设置value和max(max默认为1)才能显示确定性进度。

HTML 的 <progress></progress> 标签能快速创建语义化进度条,但直接写上就生效的前提是:必须同时设置 value 和 max(或依赖浏览器默认 max=1),否则它会显示为“不确定”状态(即一直转圈或空白)。
为什么 <progress></progress> 不显示数值或不动?
这是最常遇到的问题——写了标签但看起来没反应。根本原因是:value 属性缺失、未在合理范围内(0 ≤ value ≤ max),或 max 被设为 0/负数/非数字。
-
value必须是数字,且不能大于max;若省略value,进度条进入“不确定”模式(浏览器渲染为动画条,不表示具体进度) -
max默认为1,所以写<progress value="0.7"></progress>是合法的;但写<progress value="70" max="100"></progress>更符合直觉 - 若用 JS 动态更新,务必确保赋值的是数字类型,
progress.value = "50"(字符串)可能被忽略或触发异常
如何用 CSS 自定义 <progress></progress> 样式?
原生 <progress></progress> 在不同浏览器中样式差异大,且默认无法用普通选择器改内部轨道和填充色。必须使用伪元素:
- WebKit/Blink(Chrome/Safari/Edge)支持
progress::-webkit-progress-bar和progress::-webkit-progress-value - Firefox 使用
progress::-moz-progress-bar - 要兼容,至少得写两套规则;比如让填充色变蓝、轨道变浅灰:
progress::-webkit-progress-bar { background-color: #eee; } progress::-webkit-progress-value { background-color: #4a90e2; } progress::-moz-progress-bar { background-color: #4a90e2; } - 注意:伪元素不继承父级字体、颜色等,所有样式需显式声明
什么时候不该用 <progress></progress>?
它只适用于「已知总任务量 + 当前完成量」的确定性进度,比如文件上传、表单步骤、加载已知大小资源。以下场景不合适:
- 纯加载等待(如接口响应中、初始化阶段)→ 应用
<meter></meter>语义不对,用<progress></progress>无value又失去语义,建议用带 ARIA 的<div role="progressbar" aria-valuetext="加载中..."> <li>百分比只是装饰(如“完成度 85%”,但无真实计算依据)→ <code><meter></meter>更合适,它表示标量测量而非任务进度 - 需要点击拖拽调节 →
<progress></progress>是只读的,该用<input type="range">
真正容易被忽略的是:即使样式调好了,如果 JS 更新 value 过快(比如每 10ms 改一次),部分浏览器会跳帧或卡顿;建议节流到 50ms 以上,或用 requestAnimationFrame 控制节奏。











