当前位置:首页 > JavaScript

js实现二级菜单

2026-04-03 23:59:03JavaScript

实现二级菜单的基本思路

使用HTML、CSS和JavaScript可以轻松实现二级菜单功能。核心思路是通过事件监听控制子菜单的显示与隐藏。

HTML结构示例

<ul class="menu">
  <li>
    <a href="#">主菜单1</a>
    <ul class="submenu">
      <li><a href="#">子菜单1</a></li>
      <li><a href="#">子菜单2</a></li>
    </ul>
  </li>
  <li>
    <a href="#">主菜单2</a>
    <ul class="submenu">
      <li><a href="#">子菜单3</a></li>
      <li><a href="#">子菜单4</a></li>
    </ul>
  </li>
</ul>

CSS样式设置

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

.menu > li {
  position: relative;
  display: inline-block;
}

.submenu {
  display: none;
  position: absolute;
  left: 0;
  top: 100%;
  background: #fff;
  padding: 0;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}

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

JavaScript交互增强

如果需要更精确的控制,可以使用JavaScript:

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

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

响应式处理

针对移动设备可以添加点击事件:

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

动画效果增强

使用CSS过渡效果可以让菜单显示更平滑:

.submenu {
  opacity: 0;
  transform: translateY(-10px);
  transition: all 0.3s ease;
  pointer-events: none;
}

.menu li:hover > .submenu {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

无障碍优化

为屏幕阅读器添加ARIA属性:

js实现二级菜单

<ul class="menu" role="menubar">
  <li role="none">
    <a href="#" role="menuitem" aria-haspopup="true">主菜单1</a>
    <ul class="submenu" role="menu">
      <li role="none"><a href="#" role="menuitem">子菜单1</a></li>
    </ul>
  </li>
</ul>

通过以上方法可以实现一个功能完善、响应式的二级菜单系统。根据具体需求可以调整交互方式和视觉效果。

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

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js 实现继承

js 实现继承

原型链继承 通过让子类的原型对象指向父类的实例来实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Par…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

vue实现菜单定位

vue实现菜单定位

Vue实现菜单定位的方法 使用scrollIntoView方法 通过监听菜单点击事件,获取目标元素的DOM节点,调用scrollIntoView方法实现平滑滚动定位。需配合ref获取DOM节点。 m…