当前位置:首页 > JavaScript

js实现分级菜单

2026-03-15 20:03:14JavaScript

分级菜单的实现方法

分级菜单(也称为多级下拉菜单或嵌套菜单)可以通过纯JavaScript或结合HTML/CSS实现。以下是几种常见的实现方式:

使用HTML/CSS和JavaScript创建分级菜单

HTML结构示例:

<ul class="menu">
  <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>
    <ul>
      <li><a href="#">二级菜单3</a></li>
      <li>
        <a href="#">二级菜单4</a>
        <ul>
          <li><a href="#">三级菜单1</a></li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

CSS样式示例:

.menu ul {
  display: none;
  position: absolute;
  background: #fff;
  padding: 0;
  margin: 0;
}

.menu li {
  position: relative;
  list-style: none;
}

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

JavaScript交互增强:

document.querySelectorAll('.menu li').forEach(item => {
  item.addEventListener('mouseenter', function() {
    const submenu = this.querySelector('ul');
    if(submenu) {
      submenu.style.display = 'block';
    }
  });

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

使用事件委托优化性能

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

document.querySelector('.menu').addEventListener('mouseover', function(e) {
  if(e.target.tagName === 'LI') {
    const submenu = e.target.querySelector('ul');
    if(submenu) {
      submenu.style.display = 'block';
    }
  }
});

document.querySelector('.menu').addEventListener('mouseout', function(e) {
  if(e.target.tagName === 'LI') {
    const submenu = e.target.querySelector('ul');
    if(submenu) {
      submenu.style.display = 'none';
    }
  }
});

实现动画效果

可以添加过渡动画使菜单显示更平滑:

.menu ul {
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity 0.3s, transform 0.3s;
}

.menu li:hover > ul {
  opacity: 1;
  transform: translateY(0);
}

响应式移动端适配

针对移动设备添加点击展开功能:

document.querySelectorAll('.menu > li > a').forEach(link => {
  link.addEventListener('click', function(e) {
    if(window.innerWidth <= 768) {
      e.preventDefault();
      const submenu = this.nextElementSibling;
      if(submenu) {
        submenu.style.display = submenu.style.display === 'block' ? 'none' : 'block';
      }
    }
  });
});

使用classList管理状态

更推荐使用classList而不是直接操作style:

document.querySelectorAll('.menu li').forEach(item => {
  item.addEventListener('mouseenter', function() {
    this.classList.add('active');
  });

  item.addEventListener('mouseleave', function() {
    this.classList.remove('active');
  });
});

对应CSS:

js实现分级菜单

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

这些方法可以根据具体需求组合使用,创建出功能完善、用户体验良好的分级菜单系统。

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

相关文章

vue elementui实现菜单

vue elementui实现菜单

Vue ElementUI 实现菜单 安装 ElementUI 确保项目已安装 Vue 和 ElementUI。若未安装,可以通过以下命令安装: npm install element-ui 在 m…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js实现全屏

js实现全屏

实现全屏的基本方法 使用JavaScript实现全屏功能主要依赖Element.requestFullscreen()方法。现代浏览器均支持此API,但不同浏览器可能需要添加前缀。 // 触发全屏…

vue菜单实现

vue菜单实现

实现Vue菜单的基本方法 使用Vue.js创建菜单可以通过多种方式实现,包括使用原生Vue组件、第三方UI库或自定义解决方案。以下是几种常见的实现方法: 使用原生Vue组件 创建基本的菜单结构可以使…

vue菜单tab实现

vue菜单tab实现

Vue 菜单 Tab 实现方法 使用动态组件切换内容 通过 Vue 的 component 动态组件结合 v-for 渲染菜单项,点击时切换显示内容: <template> <…