Layui侧边栏折叠唯一稳定做法是用toggleClass切换layui-side-collapsed类并配合CSS控制宽度、图标居中和文字隐藏;禁用animate()或直接改width,否则破坏DOM跟踪导致菜单错位、状态丢失。

Layui 侧边栏()本身没有内置的“禁用菜单项”机制,它不识别 <code>disabled 属性,也不自动灰显或拦截点击。要让某个菜单项(<dd> 或 <li>)视觉上不可点、行为上不响应,必须手动干预 DOM 结构和事件逻辑。
给指定菜单项加禁用样式和点击拦截
这是最直接、兼容性最好的方式,适用于静态或动态控制单个菜单项:
- 给目标
<dd>(子菜单)或<li>(一级菜单)添加layui-disabled类,并设pointer-events: none和灰色文字(可选) - 同时移除其内部
<a>的href或设为javascript:void(0),并绑定点击事件阻止默认行为 - 示例(禁用“销售退单”这一项):
若该菜单项已存在,可用 JS 动态设置:
$("#navMenu dd:contains('销售退单')")
.addClass("layui-disabled")
.css({ "pointer-events": "none", "color": "#ccc" })
.find("a").attr("href", "javascript:void(0)");
在导航监听中加守卫逻辑
Layui 导航点击通过 element.on('nav(filter)', callback) 捕获,但该回调对所有 <dd></dd> 都会触发。因此需在回调内判断当前点击项是否被禁用:
- 为禁用项添加自定义属性,如
data-disabled="true" - 在回调开头检查:
if ($(this).data("disabled")) return; - 这样即使用户右键“打开链接”或绕过样式点击,也不会触发后续跳转或业务逻辑
示例 HTML:
JS 监听中:
element.on('nav(sideNav)', function(elem){
if ($(elem).data("disabled")) return;
// 正常处理跳转或加载...
});
禁用后保持语义与可访问性
仅靠样式禁用不够健壮,尤其对键盘用户(Tab 键聚焦)或屏幕阅读器:
- 建议同时添加
aria-disabled="true"和tabindex="-1",让辅助技术识别该状态 - 避免使用
display: none或visibility: hidden,否则会丢失语义且破坏导航流 - 如果该菜单项完全无权限访问,更推荐服务端控制——不返回该节点,而非前端隐藏/禁用
增强写法:
注意结构兼容性与重载场景
侧边栏若由 table.reload()、element.render() 或异步模板重新生成,手动添加的类和属性会被清空:
- 禁用逻辑不能只执行一次,应封装成函数,在每次导航渲染后调用(如监听
element.rendered事件,或在模板加载完成回调中执行) - 若菜单数据来自 AJAX,可在数据渲染前遍历选项,对匹配项自动注入禁用属性
- 不要依赖
.next().find()等脆弱 DOM 路径,优先用语义化选择器(如[data-id="sales-return"])


















