layui 2.x 的 lay-accordion 属性不生效,需同时满足:ul 容器具有 class="layui-nav layui-nav-tree" 且添加 lay-accordion 属性;子菜单必须用 <dl class="layui-nav-child"> 包裹,每项为 <dd>;漏任一条件即退化为多开模式。

layui 2.x 的 lay-accordion 属性不生效?检查是否漏了容器 class
layui 2.x 原生支持手风琴(单展开)侧边栏,但必须同时满足两个条件:layui-nav 容器带 lay-accordion 属性,且父级容器有 layui-nav-tree 类。漏掉任一,都会变成默认的多开模式。
-
lay-accordion是属性,不是 class,要写在<ul class="layui-nav layui-nav-tree">标签里,如:<ul class="layui-nav layui-nav-tree" lay-accordion> - 子菜单必须用
<dl class="layui-nav-child">包裹,不能用<ul>或其他标签 - 每个可折叠项需是
<dd>,且其直接父级是<dl class="layui-nav-child">,嵌套层级错一层就失效
layui 3.x 没有 lay-accordion?改用 layui.nav 实例手动控制
layui 3.x 移除了 lay-accordion 属性,需通过 JS 初始化导航并监听点击,手动关闭其他子菜单。核心是调用 nav.on('click', ...) 并配合 nav.collapse 方法。
- 初始化时加
accordion: true参数:layui.nav(elem, {accordion: true}) - 若已初始化过,需先销毁再重载,否则配置不生效
- 注意:
layui.nav的accordion模式只对一级子菜单有效;二级嵌套需自行遍历.layui-nav-child并removeClass('layui-nav-show')
点击菜单后自动收起其他项,但刷新页面又全开了?需要持久化展开状态
layui 默认不记忆展开状态,刷新即重置。要保持上次操作,得把当前展开的 data-index 存到 localStorage 或 URL hash,并在初始化后主动触发 click 或调用 nav.expand(index)。
- 监听点击时存索引:
nav.on('click(*.)', function(obj){ localStorage.setItem('nav-active', obj.index); }) - 初始化后读取并展开:
const idx = localStorage.getItem('nav-active'); if(idx) nav.expand(idx); - 注意:
obj.index是从 0 开始的数字,对应<li>在父容器中的顺序,不是自定义 id
子菜单展开动画卡顿或不触发?检查 CSS 是否被覆盖或 JS 执行时机
手风琴依赖 layui.css 中的 .layui-nav-child 过渡样式(max-height + transition)。若动画异常,大概率是 CSS 冲突或 DOM 尚未就绪就调用了 nav。
- 确保引入的是完整版
layui.css,精简版可能删掉了transition规则 - JS 必须等 DOM 渲染完成后再执行
layui.nav(),推荐放在layui.use(['nav'], function(){...})回调里 - 避免给
.layui-nav-child设置display: none !important或固定height,会破坏动画逻辑


















