element.progress() 单独调用只改 width 不更新数字,因不修改 lay-percent 属性且不重绘文本;正确动态更新需三步同步:更新 lay-percent 属性 → 调用 element.init() → 再调用 element.progress()。

element.progress() 单独调用不会更新百分比数字,只改 width 样式 —— 这不是 bug,是 layui 的设计行为。
为什么 element.progress('filter', '60%') 看不到新数字
这个函数只设置 .layui-progress-bar 的 width 内联样式,不修改 lay-percent 属性值,也不重绘文本节点。浏览器渲染的百分比文字,来自上次 element.init() 解析出的 lay-percent 值,所以你看到的还是旧数字。
- 多次调用
element.progress(),第二次起常无反应,因为 DOM 属性没变,init()也不会再触发 - 传入分数如
'2/5'给element.progress()会静默失败 —— 它只接受带%的字符串或纯数字 - 大号进度条(
layui-progress-big)若没显示数字,大概率是漏了lay-showPercent="true"或写成了lay-showpercent(大小写敏感)
正确动态更新的三步必须同步执行
缺一不可:改属性 → 重解析 → 重绘动画。
- 用
$().attr('lay-percent', '75%')更新属性值(注意是lay-percent,不是data-percent或其他) - 立即调用
element.init(),强制重新读取所有lay-*属性(包括lay-showPercent和新的lay-percent) - 最后执行
element.progress('yourFilter', '75%'),确保宽度动画和过渡效果生效
示例(假设容器有 lay-filter="uploadProgress"):
var percent = 85;
$('.layui-progress-bar[lay-filter="uploadProgress"]').attr('lay-percent', percent + '%');
element.init();
element.progress('uploadProgress', percent + '%');
表格单元格里放进度条要绕开 element 模块
在 .layui-table-cell 中嵌套 layui-progress 容易错位、高度塌陷或初始化异常。官方不推荐在这种受限容器中依赖 element.progress() 的 JS 渲染逻辑。
- 直接用原生 CSS 控制:给进度条容器加
.progress-wrap类,设固定高度和overflow: hidden - 进度更新时,跳过
element,直接操作 DOM:document.querySelector('.progress-bar').style.width = n + '%' - 避免使用
layui-progress-big,它依赖内部文本节点居中,在窄列中极易溢出或截断
上传组件里的 progress 回调为何不触发
这不是进度条本身的问题,而是上传流程没进入「可监听状态」。
- 必须设
auto: false,且在before回调中 return false,否则自动上传启动,progress被跳过 - 后端必须支持
multipart/form-data,且不能拦截或超时中断(比如 Nginx 的client_max_body_size不够,进度会卡在 99%) - 多文件上传时,每个进度条必须用唯一
lay-filter,比如"progress-" + index,否则后一个覆盖前一个 -
n === 100只代表浏览器发完了,不代表上传成功 ——done才是服务端响应到达的信号
最容易被忽略的是:lay-percent 属性和 element.progress() 调用之间没有自动同步机制,靠人来补全这层关系。一旦漏掉 element.init(),后续所有更新都会“看起来动了,但数字没变”。


















