Layui 2.8+ 中 layer.msg 的 time 默认值为 0(永不关闭),非旧版的 3000;设 time: 2000 才生效,小于 100ms 被忽略;需配合 shade 和 shadeClose 实现点击遮罩关闭;回调在关闭瞬间触发,不等动画结束;连续调用需防叠加。
layer.msg 的 time 参数到底怎么设才有效
默认 3 秒自动关闭,但很多人设了 time: 2000 却没反应——根本原因是:**layui 2.8+ 版本中,time 默认值其实是 0(永不关闭)**,不是 3000。旧文档和社区示例还没完全同步这个变更,导致大量误配。
- 显式写
time: 2000才会 2 秒后关闭;不写time就永远挂着,直到用户点遮罩或触发其他操作 -
time: 0和不写time效果一致,都表示“不自动关闭” - 小于 100 毫秒的值(如
time: 50)会被忽略,底层有最小阈值保护 - 如果页面在提示期间发生重定向或 DOM 销毁,
layer.msg可能提前消失且不触发回调
想让用户点哪都关?别只靠 time: 0
单纯设 time: 0 会让提示框卡死,用户必须手动刷新才能继续操作。真要“点击任意处关闭”,得配合 shadeClose: true + 显式关闭逻辑。
-
shadeClose: true允许点击遮罩层关闭(但默认遮罩是关闭的,需同时设shade) - 正确组合:
layer.msg('请确认', { time: 0, shade: [0.2, '#000'], shadeClose: true }) - 注意:
shadeClose对无遮罩(shade: 0)无效;遮罩透明度低于 0.1 时点击灵敏度明显下降
回调函数执行时机容易误解
layer.msg 的回调函数,**只在提示框被关闭后触发,无论怎么关(自动、手动、遮罩点击、脚本调用 layer.close())**,但它不会等动画结束,而是关掉瞬间就执行。
- 如果你在回调里操作 DOM,要确保元素还存在(比如提示后跳转页面,回调里再
$('#form').reset()就会报错) - 想区分关闭方式?Layui 不提供原生钩子,得自己 patch:
let index = layer.msg('...'); layer.close(index);这样你能控制关闭源头 - 回调里不要放耗时同步操作(如大数组遍历),否则 UI 会卡顿,看起来像“没关成功”
图标(icon)和 time 组合使用时的视觉干扰
图标的加载是异步的,当 time 设得太短(比如 time: 500),可能文字刚出现、图标还没渲染完,提示就消失了——用户只看到一闪而过的空白或半截文字。
- 带图标提示建议最低设
time: 1500,留出图标加载与动画缓冲时间 -
icon: 16(加载中图标)本身会动,若time小于 2000ms,动画大概率播不完,显得卡顿 - 自定义图标(通过 CSS 覆盖)需额外加
skin: 'your-class',此时更要注意time不能太短,否则样式来不及应用
layer.msg。


















