You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS实现父li激活子li未激活,点击子li后父子均激活的菜单需求

实现菜单父子节点的激活状态交互效果

没问题,我帮你搞定这个菜单交互需求,下面是完整的实现代码和说明:

1. HTML 结构

首先咱们先搭好菜单的DOM结构,父节点默认加上active类,子节点初始都不带这个类:

<ul class="menu">
  <li class="parent active">
    父菜单
    <ul class="submenu">
      <li>子菜单1</li>
      <li>子菜单2</li>
      <li>子菜单3</li>
    </ul>
  </li>
</ul>

2. CSS 样式

接下来用CSS定义激活状态的高亮效果,让用户能直观看到哪个节点处于激活状态:

/* 基础菜单样式 */
.menu {
  list-style: none;
  padding: 0;
  width: 200px;
  background: #f5f5f5;
}

.menu li {
  padding: 10px;
  cursor: pointer;
}

/* 激活状态样式 */
.menu li.active {
  background: #4CAF50;
  color: white;
}

/* 子菜单缩进 */
.submenu {
  list-style: none;
  padding-left: 20px;
  background: #eee;
}

3. JavaScript 交互逻辑

最后写JavaScript来处理点击事件,核心逻辑是:点击子节点时,先清除所有子节点的激活状态,再给当前点击的子节点加上激活状态,同时保留父节点的激活状态:

// 获取所有子菜单节点
const subMenuItems = document.querySelectorAll('.submenu li');

// 给每个子节点绑定点击事件
subMenuItems.forEach(item => {
  item.addEventListener('click', function() {
    // 先移除所有子节点的active类
    subMenuItems.forEach(subItem => subItem.classList.remove('active'));
    // 给当前点击的子节点添加active类
    this.classList.add('active');
    // 父节点的active类保持不变,不用额外处理
  });
});

效果说明

  • 点击前:父菜单处于激活高亮状态,所有子菜单都是默认样式;
  • 点击后:父菜单依然保持激活状态,被点击的子菜单变为高亮,其他子菜单回到默认样式。

内容的提问来源于stack exchange,提问作者Keerthi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:02:07