Layui怎么实现左侧菜单栏的手风琴效果(点开一个关闭其他)

梦宇酱_2617

梦宇酱_2617

2026-03-23

836人浏览

原创

layui 2.x 的 layui.nav 不支持手风琴,需手动监听 .layui-nav-item > a 点击事件,移除兄弟项的 layui-nav-itemed 类并切换当前子菜单显隐;layui 3.x 则原生支持 accordion: true 的 tree 组件。

layui 2.x 中 layui.nav 不支持手风琴,得自己加逻辑

layui 2.x 的 layui.nav 组件本身没有内置「展开一个、收起其余」的手风琴行为,它默认是独立开关。你点开 a,再点开 b,a 还开着——这不是 bug,是设计如此。要实现手风琴,必须监听点击,手动控制其他子菜单的 layui-nav-itemed 类状态。

常见错误现象:layui-nav 嵌套了 layui-nav-child,但所有子菜单能同时展开;或者用了 layui-nav-tree 却发现折叠/展开全靠点击图标,不响应菜单项文字点击。

  • 只对带 layui-nav-item 的父级菜单绑定点击,别误绑到 layui-nav-child 内部的 a
  • 用 $(this).next('.layui-nav-child') 找当前要切换的子菜单,别用 find 或 children 错位操作
  • 收起其他时,只操作「同级」的 layui-nav-item 下的 layui-nav-child,避免影响二级以下嵌套(如果存在)

用 jQuery 模拟手风琴:监听 .layui-nav-item > a 点击

这是最轻量、兼容性最好的做法,不依赖 layui 的模块加载机制,也不动原生渲染逻辑。核心就是:点一个,把所有兄弟的 layui-nav-itemed 移除,再给当前加;同时控制对应子菜单的显隐。

使用场景:你已用 layui.use(['element'], ...) 初始化了导航,HTML 结构是标准的 <ul class="layui-nav layui-nav-tree"><li class="layui-nav-item"> <a>菜单</a><dl class="layui-nav-child">...</dl> </li></ul>。

示例代码片段:

$('.layui-nav-item > a').on('click', function(e) {
  e.preventDefault();
  var $this = $(this);
  var $child = $this.next('.layui-nav-child');
  
  // 收起所有同级子菜单
  $this.parent().siblings('.layui-nav-item').removeClass('layui-nav-itemed')
    .children('.layui-nav-child').removeClass('layui-nav-child-show');
  
  // 切换当前
  $this.parent().toggleClass('layui-nav-itemed');
  $child.toggleClass('layui-nav-child-show');
});

注意:layui-nav-child-show 是 layui 2.x 控制显示的类,不是自定义的;如果你用的是 layui 3.x(beta),类名可能变成 layui-show,需按实际检查 DOM。

layui.element 的 nav 事件无法直接实现手风琴

有人试过监听 element.on('nav(side)', ...),发现它只返回被点击的 elem 和 index,不提供当前展开状态,也没法阻止其他项保持展开。这个事件本质是「点击后触发」,不是「展开前拦截」,所以不能靠它做状态同步。

性能影响很小,但容易踩的坑是:在 nav 回调里又去手动 addClass/removeClass,结果和上面 jQuery 方案冲突,造成闪动或状态错乱。

  • 不要在 element.on('nav(...)', ...) 里操作 DOM 展开/收起逻辑
  • 如果用了 element.render('nav') 动态重载菜单,记得重新绑定上面的 jQuery 点击事件
  • 移动端点击区域小,建议给 .layui-nav-item > a 加 padding,别只靠文字触发

layui 3.x(Alpha/Beta)的 tree 组件更适合替代方案

如果你项目允许升级到 layui 3.x(目前是 alpha 版本),官方已废弃 nav,转推 tree 组件。它的 showCheckbox: false + accordion: true 就是原生手风琴,且支持右键、异步加载、高亮选中等。

不过要注意:layui 3.x 和 2.x 不兼容,layui.use 的模块名、CSS 类、API 全变了。比如 layui.tree 初始化后,不能再混用 layui.nav 的 HTML 结构。

参数差异关键点:

  • accordion: true 开启手风琴(默认 false)
  • onlyIconControl: true 表示只允许点击图标展开,不符合“点文字也展开”的需求,得设为 false
  • 数据格式必须是数组套对象,不能直接复用旧版 layui-nav 的 HTML

真正麻烦的不是写法,而是菜单权限动态生成时,2.x 的 HTML 拼接和 3.x 的 JSON 数据驱动思维要彻底切换。这点很多人一开始没意识到。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2303

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

4983

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6070

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

5578

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

783

5

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

120

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

100

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

80

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

60

26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习