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

如何将悬停展开式菜单改为点击触发(展开/收起)?

实现点击展开/收起的导航菜单

你需要将原有的鼠标悬停展开导航菜单,修改为点击主菜单切换子菜单的展开/收起状态,以下提供两种实现方案:

方案一:纯HTML + CSS实现(无需JavaScript)

利用原生复选框的checked状态结合CSS选择器实现交互,无需额外脚本。

修改后的HTML代码

<nav class="navigation">
  <ul class="mainmenu">
    <li>
      <input type="checkbox" id="menu1" class="menu-toggle">
      <label for="menu1">Products</label>
      <ul class="submenu">
        <li><a href="">Tops</a></li>
        <li><a href="">Bottoms</a></li>
        <li><a href="">Footwear</a></li>
      </ul>
    </li>
    <li>
      <input type="checkbox" id="menu2" class="menu-toggle">
      <label for="menu2">Other</label>
      <ul class="submenu">
        <li><a href="">Contact us</a></li>
        <li><a href="">About us</a></li>
        <li><a href="">FAQ</a></li>
      </ul>
    </li>
  </ul>
</nav>

修改后的CSS代码

html, body {
    font-family: Arial, Helvetica, sans-serif;
}

.navigation {
  width: 300px;
}

.mainmenu, .submenu {
  list-style: none;
  padding: 0;
  margin: 0;
}

/* 隐藏原生复选框 */
.menu-toggle {
  display: none;
}

.mainmenu label {
  display: block;
  background-color: #CCC;
  text-decoration: none;
  padding: 10px;
  color: #000;
  cursor: pointer; /* 提示元素可点击 */
}

.mainmenu label:hover {
    background-color: #C5C5C5;
}

/* 复选框选中时,展开对应子菜单 */
.menu-toggle:checked ~ .submenu {
  max-height: 200px;
}

.submenu a {
  display: block;
  background-color: #999;
  text-decoration: none;
  padding: 10px;
  color: #000;
}

.submenu a:hover {
  background-color: #666;
}

.submenu {
  overflow: hidden;
  max-height: 0;
  transition: all 0.5s ease-out;
  -webkit-transition: all 0.5s ease-out;
}

原理说明:将原主菜单的<a>标签替换为<label>,绑定隐藏的复选框。点击<label>会触发复选框状态切换,CSS通过:checked选择器控制子菜单的max-height属性,实现平滑的展开/收起过渡。


方案二:JavaScript实现(保留原有HTML结构)

如果不想修改原有HTML结构,可通过JavaScript监听点击事件,切换子菜单的显示状态。

调整后的HTML(保留原结构)

<nav class="navigation">
  <ul class="mainmenu">
    <li><a href="#" class="menu-link">Products</a>
      <ul class="submenu">
        <li><a href="">Tops</a></li>
        <li><a href="">Bottoms</a></li>
        <li><a href="">Footwear</a></li>
      </ul>
    </li>
    <li><a href="#" class="menu-link">Other</a>
      <ul class="submenu">
        <li><a href="">Contact us</a></li>
        <li><a href="">About us</a></li>
        <li><a href="">FAQ</a></li>
      </ul>
    </li>
  </ul>
</nav>

调整后的CSS(新增.active类)

html, body {
    font-family: Arial, Helvetica, sans-serif;
}

.navigation {
  width: 300px;
}

.mainmenu, .submenu {
  list-style: none;
  padding: 0;
  margin: 0;
}

.mainmenu a {
  display: block;
  background-color: #CCC;
  text-decoration: none;
  padding: 10px;
  color: #000;
}

.mainmenu a:hover {
    background-color: #C5C5C5;
}

/* 通过.active类控制子菜单展开 */
.mainmenu li.active .submenu {
  max-height: 200px;
}

.submenu a {
  background-color: #999;
}

.submenu a:hover {
  background-color: #666;
}

.submenu {
  overflow: hidden;
  max-height: 0;
  transition: all 0.5s ease-out;
  -webkit-transition: all 0.5s ease-out;
}

JavaScript代码

// 获取所有主菜单链接
const menuLinks = document.querySelectorAll('.menu-link');

menuLinks.forEach(link => {
  link.addEventListener('click', function(e) {
    e.preventDefault(); // 阻止链接默认跳转行为
    // 切换父元素<li>的.active类
    const parentLi = this.parentElement;
    parentLi.classList.toggle('active');
  });
});

原理说明:给主菜单链接添加点击事件监听,点击时切换其父元素<li>的.active类,CSS通过该类控制子菜单的max-height,实现展开/收起的切换效果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:10:25