Layui中平滑滚动需作用于.layui-body而非window,应使用scrollTo({top:0,behavior:'smooth'})并确保其有有限高度;锚点跳转需手动计算偏移;表格分页回顶须在done回调延迟执行;兼容性不足时需手写缓动动画。

直接设 scroll-behavior: smooth 通常无效
因为 Layui 管理后台绝大多数情况下滚动容器不是 window,而是 .layui-body。你在 html 或 body 上加 scroll-behavior: smooth,浏览器会尝试对 document.documentElement 或 document.body 生效,但实际滚动的是 .layui-body —— 它压根不响应这个 CSS 属性。
必须监听并重写 .layui-body 的滚动行为
平滑滚动要起作用,目标元素本身得支持 scrollTo 的 behavior: 'smooth' 选项,而 .layui-body 是那个真正被拖动的容器。你得手动接管点击跳转或按钮触发时的滚动逻辑:
- 用
document.querySelector('.layui-body').scrollTo({ top: 0, behavior: 'smooth' })替代window.scrollTo(0, 0) - 如果跳转锚点(如
#section2),不能依赖原生<a href="#section2"></a>,得拦截点击,计算目标元素在.layui-body内的偏移:el.offsetTop - layuiBody.offsetTop - 注意:Layui 的
.layui-body通常有position: relative,所以要用getBoundingClientRect().top更稳妥,再减去.layui-body.getBoundingClientRect().top
表格分页后自动回顶也得走同一套逻辑
很多人在 table.on('page(...)', ...) 里写 window.scrollTo(...),结果没反应——因为表格内容在 .layui-table-box 或 .layui-body 里,不是整页滚动。正确做法是:
- 在
done回调中用setTimeout延迟执行,确保 DOM 已更新 - 判断当前滚动主体:
document.querySelector('.layui-table-box')?.scrollTop = 0(带 height 的表格)或document.querySelector('.layui-body').scrollTo({ top: 0, behavior: 'smooth' })(整页布局) - 别加
behavior: 'smooth'到scrollTop = 0赋值上——它只对scrollTo方法有效,scrollTop是同步赋值,不支持该参数
移动端和旧版 Chrome 兼容性要单独兜底
behavior: 'smooth' 在 iOS Safari 15.4 之前、部分安卓 WebView 和老版 Chrome 中静默降级为 auto,用户感知就是“没动画”。若必须保效果,得手写简易缓动:
- 用
requestAnimationFrame+ 线性/缓入缓出公式逐步设置.scrollTop - 检测支持性:
'scrollBehavior' in document.documentElement.style,不支持就 fallback 到scrollTo(0, 0)或简单 setTimeout 分步滚动 - 别在
util.fixbar的click回调里直接写behavior—— 它默认只操作window,你得先覆盖它的行为,显式指定目标容器和滚动方式
最易被忽略的一点:Layui 的 .layui-body 往往设置了 overflow-y: auto 但没设 height 或 max-height,导致它实际高度撑满全屏,scrollTo 无法产生位移。务必确认它的 computed height 是有限值,否则 behavior: 'smooth' 会“动了但没完全动”。


















