菜鸟科技网

js如何制作二级菜单栏

是使用JavaScript(JS)制作二级菜单栏的详细步骤和实现方法,涵盖HTML结构、CSS样式及JS交互逻辑,并附上代码示例与注意事项:

js如何制作二级菜单栏-图1
(图片来源网络,侵删)

HTML基础架构搭建

核心思路是通过嵌套的<ul><li>标签构建层级关系。

<!-主菜单容器 -->
<nav class="menu-container">
  <ul class="primary-menu">
    <li class="has-submenu">
      <a href="#" class="main-item">一级菜单1</a>
      <!-对应的二级子菜单 -->
      <ul class="sub-menu">
        <li><a href="#" class="sub-item">二级选项A</a></li>
        <li><a href="#" class="sub-item">二级选项B</a></li>
      </ul>
    </li>
    <li class="has-submenu">
      <a href="#" class="main-item">一级菜单2</a>
      <ul class="sub-menu">
        <li><a href="#" class="sub-item">二级选项C</a></li>
      </ul>
    </li>
  </ul>
</nav>

关键点:

  • .has-submenu标记包含子菜单的主项;
  • 默认隐藏二级菜单(通过CSS控制),后续由JS触发显示。

CSS样式设计要点

布局与定位

属性 作用 示例值
display: flex; 使主菜单水平排列 .primary-menu
position: relative; 确保子菜单相对于父元素定位 .has-submenu
position: absolute; 脱离文档流实现悬浮效果 .sub-menu
top: 100%; left: 0; 将子菜单紧贴父级下方 .sub-menu
visibility: hidden; 初始隐藏状态(优于display:none因可保留占位空间) .sub-menu默认状态

视觉效果增强

/ 悬停时展开子菜单 /
.has-submenu:hover .sub-menu {
  visibility: visible;
  opacity: 1;
  transition: all 0.3s ease-in-out; / 平滑过渡动画 /
}
/ 箭头图标提示存在下级菜单 /
.main-item::after {
  content: "▼";
  margin-left: 5px;
  font-size: 0.8em;
}

技巧:使用伪元素添加小箭头提升用户体验。


JavaScript交互逻辑实现

方案1:纯鼠标事件驱动(推荐)

document.querySelectorAll('.has-submenu').forEach(item => {
  const mainLink = item.querySelector('.main-item');
  const subMenu = item.querySelector('.sub-menu');
  // 鼠标移入时显示子菜单
  item.addEventListener('mouseenter', () => {
    subMenu.style.visibility = 'visible';
    subMenu.style.opacity = '1';
  });
  // 鼠标离开整个区域后隐藏
  item.addEventListener('mouseleave', () => {
    subMenu.style.visibility = 'hidden';
    subMenu.style.opacity = '0';
  });
});

优势:不依赖点击操作,更符合传统PC端交互习惯。

js如何制作二级菜单栏-图2
(图片来源网络,侵删)

方案2:移动端适配扩展

若需支持触摸设备,可补充以下代码:

// 点击切换显示/隐藏(针对移动端)
mainLink.addEventListener('click', function(e) {
  e.preventDefault(); // 阻止默认跳转行为
  const isVisible = subMenu.style.visibility === 'visible';
  subMenu.style.visibility = isVisible ? 'hidden' : 'visible';
});

常见场景优化策略对比表

需求类型 实现方式 注意事项
横向多级嵌套 配合CSS的left偏移量逐级向右展开 避免超出视窗右侧导致截断
垂直侧边栏模式 修改主菜单为垂直排列 (flex-direction: column),子菜单左对齐 需调整left值为负值以向左延伸
加载 AJAX异步获取子菜单数据后注入DOM 确保网络延迟时的加载提示(如旋转图标)
响应式折叠设计 窗口缩放至阈值时自动切换为汉堡包图标+下拉面板 监听resize事件并重置布局

完整示例演示

假设我们要创建一个电商网站的分类导航栏:

<div id="category-nav">
  <ul>
    <li data-category="electronics">📱 电子设备 <span class="counter">(12)</span></li>
    <li data-category="clothing">👕 服饰鞋包 <span class="counter">(8)</span></li>
    <!-动态生成的子类目将在此处插入 -->
  </ul>
</div>
<script>
// 根据数据集动态加载子菜单内容
fetch('/api/categories')
  .then(response => response.json())
  .then(data => {
    document.querySelectorAll('#category-nav li').forEach(li => {
      const catId = li.dataset.category;
      if(data[catId]) {
        const sublist = document.createElement('ul');
        data[catId].forEach(item => {
          const childLi = document.createElement('li');
          childLi.innerHTML = `<a href="/list?id=${item.id}">${item.name}</a>`;
          sublist.appendChild(childLi);
        });
        li.appendChild(sublist);
      }
    });
  });
</script>

此例展示了如何结合后端API实现数据驱动的动态菜单,适合大型应用。


FAQs相关问答

Q1: 如果二级菜单被其他元素遮挡怎么办?

A: 检查CSS中的z-index属性是否设置合理,通常给.sub-menu设置较高的值(如z-index: 1000),确保其位于其他页面元素之上,同时确认父容器未设置overflow: hidden

Q2: 为什么鼠标快速划过时子菜单闪烁不稳定?

A: 这是由于事件触发频率过高导致的渲染冲突,解决方案有两种:①增加防抖机制(debounce),限制函数执行次数;②改用CSS过渡效果替代部分JS控制,利用硬件加速优化性能,例如将transition属性添加到.sub-menu的选择器中。

通过以上步骤,您可以灵活运用JS创建功能完善、交互流畅的二级菜单栏,并根据项目

分享:
扫描分享到社交APP
上一篇
下一篇