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

基于JavaScript和jQuery的专业菜单(二):子菜单箭头切换问题

解决方案

首先确保你的菜单结构中,包含子菜单的<li>元素内有一个用于显示箭头的元素,示例结构如下:

<li class="menu-item-has-children">
  <a href="#">父菜单 <span class="arrow">→</span></a>
  <ul class="sub-menu">
    <!-- 子菜单选项 -->
  </ul>
</li>

接下来修改你的脚本部分,在平滑展开/收起子菜单的逻辑中,同步处理箭头切换:

document.addEventListener('DOMContentLoaded', function() {
  const parentMenuItems = document.querySelectorAll('.menu-item-has-children');
  
  parentMenuItems.forEach(item => {
    const menuTrigger = item.querySelector('a');
    const subMenu = item.querySelector('.sub-menu');
    const arrowElem = item.querySelector('.arrow');
    
    menuTrigger.addEventListener('click', function(e) {
      e.preventDefault(); // 按需阻止父菜单链接跳转
      
      // 平滑展开/收起子菜单
      subMenu.classList.toggle('active');
      if (subMenu.style.maxHeight) {
        subMenu.style.maxHeight = null;
      } else {
        subMenu.style.maxHeight = subMenu.scrollHeight + 'px';
      }
      
      // 切换箭头文本
      arrowElem.textContent = arrowElem.textContent === '→' ? '↓' : '→';
    });
  });
});

如果更倾向用CSS类控制箭头样式(更灵活,支持过渡动画),可以这样调整:

CSS 代码

.arrow {
  display: inline-block;
  margin-left: 8px;
  transition: transform 0.3s ease;
}
.arrow.expanded {
  transform: rotate(90deg);
}

修改后的脚本

document.addEventListener('DOMContentLoaded', function() {
  const parentMenuItems = document.querySelectorAll('.menu-item-has-children');
  
  parentMenuItems.forEach(item => {
    const menuTrigger = item.querySelector('a');
    const subMenu = item.querySelector('.sub-menu');
    const arrowElem = item.querySelector('.arrow');
    
    menuTrigger.addEventListener('click', function(e) {
      e.preventDefault();
      
      // 平滑展开/收起子菜单
      subMenu.classList.toggle('active');
      if (subMenu.style.maxHeight) {
        subMenu.style.maxHeight = null;
      } else {
        subMenu.style.maxHeight = subMenu.scrollHeight + 'px';
      }
      
      // 切换箭头样式类
      arrowElem.classList.toggle('expanded');
    });
  });
});

如果你的箭头是通过CSS伪元素(如:after)实现的,只需给父级<li>添加切换类即可:

.menu-item-has-children > a:after {
  content: '→';
  margin-left: 8px;
}
.menu-item-has-children.expanded > a:after {
  content: '↓';
}

对应脚本中替换为:

item.classList.toggle('expanded');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 11:20:28