当前位置:首页 > JavaScript

js实现三级菜单

2026-03-01 03:41:43JavaScript

实现三级菜单的JavaScript方法

使用HTML和CSS构建基础结构

创建嵌套的<ul><li>元素表示菜单层级,CSS设置初始隐藏状态:

<ul class="menu-level-1">
  <li>
    一级菜单
    <ul class="menu-level-2">
      <li>
        二级菜单
        <ul class="menu-level-3">
          <li>三级菜单项1</li>
          <li>三级菜单项2</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<style>
  .menu-level-2, .menu-level-3 {
    display: none;
  }
  li:hover > ul {
    display: block;
  }
</style>

纯JavaScript事件驱动实现

通过事件监听实现交互控制:

document.querySelectorAll('.menu-level-1 > li').forEach(item => {
  item.addEventListener('mouseenter', () => {
    const level2 = item.querySelector('.menu-level-2');
    if(level2) level2.style.display = 'block';
  });

  item.addEventListener('mouseleave', () => {
    const level2 = item.querySelector('.menu-level-2');
    if(level2) level2.style.display = 'none';
  });
});

// 二级菜单项事件绑定同理
document.querySelectorAll('.menu-level-2 > li').forEach(item => {
  item.addEventListener('mouseenter', () => {
    const level3 = item.querySelector('.menu-level-3');
    if(level3) level3.style.display = 'block';
  });

  item.addEventListener('mouseleave', () => {
    const level3 = item.querySelector('.menu-level-3');
    if(level3) level3.style.display = 'none';
  });
});

递归函数实现动态生成

适用于动态数据场景:

function createMenu(container, data, level = 1) {
  const ul = document.createElement('ul');
  ul.className = `menu-level-${level}`;

  data.forEach(item => {
    const li = document.createElement('li');
    li.textContent = item.text;

    if(item.children) {
      createMenu(li, item.children, level + 1);
      li.addEventListener('click', (e) => {
        e.stopPropagation();
        const childMenu = li.querySelector('ul');
        childMenu.style.display = childMenu.style.display === 'block' ? 'none' : 'block';
      });
    }

    ul.appendChild(li);
  });

  container.appendChild(ul);
}

// 使用示例
const menuData = [
  {
    text: "一级菜单",
    children: [
      {
        text: "二级菜单",
        children: [
          { text: "三级菜单1" },
          { text: "三级菜单2" }
        ]
      }
    ]
  }
];
createMenu(document.getElementById('menu-container'), menuData);

动画效果增强体验

添加CSS过渡效果提升用户体验:

.menu-level-2, .menu-level-3 {
  opacity: 0;
  max-height: 0;
  overflow: hidden;
  transition: opacity 0.3s, max-height 0.3s;
}

li:hover > ul {
  opacity: 1;
  max-height: 500px;
}

移动端适配方案

针对触摸设备添加点击事件支持:

function setupMobileMenu() {
  const menuItems = document.querySelectorAll('li');
  menuItems.forEach(item => {
    item.addEventListener('click', function(e) {
      if(this.querySelector('ul')) {
        e.preventDefault();
        const subMenu = this.querySelector('ul');
        subMenu.style.display = subMenu.style.display === 'block' ? 'none' : 'block';
      }
    });
  });
}

注意事项

  • 事件委托优化性能,避免为每个菜单项单独绑定事件
  • 使用position: absolute定位子菜单防止页面布局抖动
  • 添加aria-expanded属性增强可访问性
  • 考虑使用requestAnimationFrame优化动画性能

以上方案可根据实际需求组合使用,纯CSS方案适合简单场景,JavaScript方案提供更精细的控制,递归函数适合动态数据加载场景。

js实现三级菜单

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

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url,…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML…

css制作菜单

css制作菜单

CSS 制作菜单的方法 使用 CSS 可以制作多种风格的菜单,包括水平菜单、垂直菜单、下拉菜单等。以下是几种常见的实现方式。 水平菜单 水平菜单通常用于导航栏,可以通过 display: inli…