应让Layui自行管理子菜单展开状态,避免在nav监听器中调用toggle或hide等破坏layui-nav-itemed类同步的操作;确保HTML结构含layui-nav-child,通过自定义class加CSS强制显示目标父项子菜单。

菜单被选中后父菜单自动收缩,通常是因为点击触发了 Layui 的默认折叠逻辑,或者你手动绑定了错误的事件处理。要阻止这种行为,关键不是“禁用收缩”,而是不干扰 Layui 对导航状态的原生管理,同时避免在点击回调里强行操作子菜单显隐。
别在 nav 监听器里调用 toggle 或 hide
Layui 的 element.on('nav(filter)') 只该用于跳转或业务逻辑,不是控制 DOM 显隐的入口。常见错误写法:
-
$(elem).next('dl').toggle()—— 破坏layui-nav-itemed类同步,图标不转、高亮丢失 -
$('.layui-nav-child').hide()—— 强制隐藏会切断 Layui 的状态跟踪,下次点击可能无法展开 - 手动移除
layui-nav-itemed类 —— 导致当前项失去“已展开”标识,视觉和交互都错乱
让 Layui 自己管子菜单的展开状态
子菜单是否显示,应完全由 HTML 结构 + Layui 的内置机制决定:
- 确保每个父级
<li class="layui-nav-item">内含<dl class="layui-nav-child"> - 展开态由
layui-nav-itemed类自动添加/移除,不要 JS 干预 - 选中某项(比如点击“用户管理”)时,Layui 会自动给其父
<li>加layui-nav-itemed,子菜单随之显示 —— 这是预期行为,无需额外代码
如果真想固定某个父菜单始终展开
可通过 CSS 锁定其子菜单可见,且不影响其他菜单交互:
- 给目标父项加一个自定义 class,例如
class="layui-nav-item layui-nav-item-keep" - 在 CSS 中强制显示它的子菜单:
.layui-nav-item-keep .layui-nav-child { display: block !important; } - 再加一条防止 hover 关闭:
.layui-nav-item-keep:hover .layui-nav-child { display: block !important; }
检查是否有全局折叠逻辑干扰
有些项目在顶部按钮或路由切换时执行了统一收起操作,比如:
-
$('.layui-side').removeClass('layui-side-collapsed')后又立即toggleClass,造成闪退 - 监听了
router.beforeEach或hashchange并重置侧边栏状态 - 使用了
admin.sideFlexible(0)但未加条件判断,每次跳转都强制收起
这类逻辑应加白名单判断,例如只对非“用户管理”等核心模块才执行收起。


















