当前位置:首页 > 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交互增强:

js实现分级菜单

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';
    }
  }
});

实现动画效果

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

js实现分级菜单

.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:

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

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

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

相关文章

vue实现菜单定位

vue实现菜单定位

实现菜单定位的方法 在Vue中实现菜单定位功能,可以通过监听滚动事件或使用Intersection Observer API来判断当前显示的菜单项,并高亮对应的导航链接。以下是几种常见的实现方式:…

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

jquery 菜单

jquery 菜单

jQuery 菜单实现方法 使用 jQuery 创建动态菜单可以通过多种方式实现,以下是几种常见的方法: 基于 HTML 和 CSS 的基础结构 创建菜单的 HTML 结构通常使用无序列表 <…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js手势实现

js手势实现

手势识别实现方法 在JavaScript中实现手势识别通常涉及监听触摸事件(touchstart、touchmove、touchend)或鼠标事件(mousedown、mousemove、mouseu…