应将 layui-header 包入带 ID 的容器并用 element.on('nav') 绑定菜单点击事件隐藏,配合 localStorage 同步状态,避免直接操作 style.display 受响应式样式覆盖。
layui-layout 的结构层级layui 的 layui-layout 是基于 css flex 的布局系统,顶部(layui-header)和侧边(layui-side)默认是同级兄弟元素。如果点击菜单后顶部没隐藏,大概率是因为你没把顶部放进可控制显隐的容器里,而是让它“钉死”在 layout 根节点下。
实操建议:
layui-header 包进一个带 ID 的 <div> 容器(比如 <div id="app-header"></div>),而不是直接写在 layui-layout 里document.getElementById('app-header')
layui-header 自带的 class 控制显隐——它没有内置折叠逻辑element.on('nav', ...) 绑定菜单点击时隐藏顶部Layui 的导航菜单(nav)事件是唯一可靠的菜单点击钩子,比原生 click 更稳定,尤其在动态渲染或子菜单展开后仍有效。
常见错误现象:绑定 click 到 .layui-nav-item a 后,二级菜单展开时不触发;或者用 router.push 或 window.location 跳转导致逻辑丢失。
实操建议:
element.on('nav(sideMenu)', function(elem){...}),其中 sideMenu 是你的菜单容器的 lay-filter 值document.getElementById('app-header').style.display = 'none'
layui-show-xs 类的干扰当页面开启响应式(比如用了 layui-show-xs、layui-hide-lg 等类),手动设置 display: none 可能被媒体查询样式覆盖,导致隐藏失败。
性能与兼容性影响:直接改 style.display 最快,但若同时存在 CSS 动画或 transition,可能视觉卡顿;IE10+ 没问题,但低版本 IE 对 layui-layout flex 支持差,建议避开。
实操建议:
classList.add('layui-hide') 替代 style.display = 'none',因为 layui-hide 是 !important 的@media (max-width: 768px) 中写了 .layui-header { display: block !important; } —— 这会强行覆盖你的隐藏逻辑layui.use(['element', 'layer']),确保 element 已正确加载,否则 element.on 不会触发用户点击菜单隐藏顶部,但 F5 刷新后顶部又出现,不是 Bug,是预期行为——DOM 状态不会自动持久化。
容易踩的坑:有人试图在 layui.config({ version: 'x.x' }) 里加逻辑,或误以为 layui.cache 能存 UI 状态,其实它只存模块路径。
实操建议:
localStorage.getItem('headerHidden')),再决定是否初始隐藏localStorage.setItem('headerHidden', 'true')
sessionStorage —— 关闭标签页就丢,用户可能觉得“刚设好怎么又出来了”