layui table.reload() 默认重置滚动位置,需在done回调中用settimeout恢复.layui-table-box.scrolltop();注意固定列、height配置及ie兼容性。

reload 后滚动条跳回顶部是默认行为
Layui 的 table.reload() 默认会重置整个表格容器的 DOM,包括清空并重建 tbody,所以原生滚动位置必然丢失。这不是 bug,是设计使然——它不保存也不恢复任何 UI 状态。
用 scrollTo + before 回调手动存取位置
核心思路是在 reload 前读取当前滚动偏移量,reload 完成后再设回去。关键得用 done 回调(不是 success),因为只有这时 DOM 才真正就位。
- 在
table.render()或table.reload()的配置里加done: function(res, curr, count) { ... } - reload 前用
layui.$('.layui-table-box').scrollTop()读取值并暂存到闭包变量或data-属性 -
done里用layui.$('.layui-table-box').scrollTop(保存的值)恢复,注意加setTimeout(..., 0)防止因渲染未完成而失效 - 别用
window.scrollTo,Layui 表格滚动发生在内部.layui-table-box容器,不是整个页面
注意 .layui-table-box 的选择时机和多重滚动容器
新版 Layui(2.8+)可能有嵌套滚动:外层 .layui-table-box 控制横向,内层 .layui-table-main 或 .layui-table-fixed-r 可能也有独立滚动条。reload 后若只恢复外层,右侧固定列仍会跳动。
- 优先监听和恢复
.layui-table-box的scrollTop,它覆盖主表体 - 如果启用了固定列且发现右侧列滚动异常,再额外捕获
.layui-table-fixed-r的scrollTop并同步恢复 - 不要依赖
table.config.elem直接查scrollTop,它指向的是整个表格根容器,不是可滚动区域 - 移动端或缩放场景下,
scrollTop可能为小数,建议用Math.round()存取,避免浮点误差导致恢复不准
兼容性与性能提醒
这个方案在 Layui 2.5.6–2.9.x 均有效,但要注意两个隐性坑:
- 如果表格启用了
height配置(即固定高度),.layui-table-box才存在;没设height时表格自适应,滚动条在body上,此时要改用layui.$('body').scrollTop()—— 但这种情况 reload 通常不跳,可忽略 - 高频 reload(比如搜索 debounce 间隔太短)会导致多次
scrollTop覆盖,建议加个节流标记,例如用isReloading = true控制只存一次位置 - IE11 下
scrollTop读写可能延迟,若必须支持 IE,需在done里补一次requestAnimationFrame再设值











