…">
当前位置:首页 > JavaScript

js实现三级菜单

2026-04-04 04:15:46JavaScript

实现三级菜单的步骤

使用HTML、CSS和JavaScript实现一个三级菜单,可以通过嵌套的列表结构和事件监听来实现交互效果。

HTML结构

<ul class="menu">
  <li>
    <a href="#">一级菜单1</a>
    <ul>
      <li>
        <a href="#">二级菜单1</a>
        <ul>
          <li><a href="#">三级菜单1</a></li>
          <li><a href="#">三级菜单2</a></li>
        </ul>
      </li>
      <li><a href="#">二级菜单2</a></li>
    </ul>
  </li>
  <li>
    <a href="#">一级菜单2</a>
    <ul>
      <li><a href="#">二级菜单3</a></li>
    </ul>
  </li>
</ul>

CSS样式

.menu, .menu ul {
  list-style: none;
  padding: 0;
  margin: 0;
}

.menu li {
  position: relative;
}

.menu ul {
  display: none;
  position: absolute;
  left: 100%;
  top: 0;
  background: #f9f9f9;
  min-width: 160px;
  box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);
}

.menu > li > ul {
  left: 0;
  top: 100%;
}

.menu li:hover > ul {
  display: block;
}

JavaScript交互

document.addEventListener('DOMContentLoaded', function() {
  const menuItems = document.querySelectorAll('.menu li');

  menuItems.forEach(item => {
    if (item.querySelector('ul')) {
      item.addEventListener('mouseenter', function() {
        this.querySelector('ul').style.display = 'block';
      });

      item.addEventListener('mouseleave', function() {
        this.querySelector('ul').style.display = 'none';
      });
    }
  });
});

响应式设计考虑

为适应移动设备,可以添加媒体查询和触摸事件支持。

CSS媒体查询

@media (max-width: 768px) {
  .menu ul {
    position: static;
    box-shadow: none;
  }
}

JavaScript触摸支持

menuItems.forEach(item => {
  if (item.querySelector('ul')) {
    item.addEventListener('touchstart', function(e) {
      e.preventDefault();
      const submenu = this.querySelector('ul');
      submenu.style.display = submenu.style.display === 'block' ? 'none' : 'block';
    });
  }
});

无障碍改进

为提升可访问性,可以添加ARIA属性和键盘导航支持。

HTML ARIA属性

<ul class="menu" role="menubar">
  <li role="none">
    <a href="#" role="menuitem" aria-haspopup="true">一级菜单1</a>
    <ul role="menu">
      <li role="none">
        <a href="#" role="menuitem" aria-haspopup="true">二级菜单1</a>
        <ul role="menu">
          <li role="none"><a href="#" role="menuitem">三级菜单1</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

键盘导航支持

menuItems.forEach(item => {
  const link = item.querySelector('a');
  if (link && link.getAttribute('aria-haspopup') === 'true') {
    link.addEventListener('keydown', function(e) {
      if (e.key === 'Enter' || e.key === ' ') {
        e.preventDefault();
        const submenu = item.querySelector('ul');
        const isExpanded = this.getAttribute('aria-expanded') === 'true';
        this.setAttribute('aria-expanded', !isExpanded);
        submenu.style.display = isExpanded ? 'none' : 'block';
      }
    });
  }
});

性能优化建议

对于大型菜单结构,可以考虑使用事件委托减少事件监听器数量。

事件委托实现

js实现三级菜单

document.querySelector('.menu').addEventListener('mouseover', function(e) {
  const target = e.target.closest('li');
  if (target && target.querySelector('ul')) {
    target.querySelector('ul').style.display = 'block';
  }
});

document.querySelector('.menu').addEventListener('mouseout', function(e) {
  const target = e.target.closest('li');
  if (target && target.querySelector('ul')) {
    target.querySelector('ul').style.display = 'none';
  }
});

标签: 菜单js
分享给朋友:

相关文章

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,可…

vue菜单tab实现

vue菜单tab实现

实现Vue菜单Tab的步骤 在Vue中实现菜单Tab功能,可以通过动态组件或条件渲染来实现。以下是几种常见的方法: 使用动态组件 动态组件允许根据当前选中的Tab动态切换显示内容。定义一个组件数组…

css菜单制作

css菜单制作

基础水平菜单制作 使用无序列表<ul>和<li>标签构建结构,CSS设置横向排列: <ul class="horizontal-menu"> <li&g…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…