当前位置:首页 > JavaScript

js实现二级菜单

2026-02-28 23:30:47JavaScript

使用HTML+CSS+JavaScript实现二级菜单

通过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="#">二级菜单1</a></li>
    </ul>
  </li>
</ul>

CSS样式

.menu {
  list-style: none;
  padding: 0;
  position: relative;
}
.menu > li {
  display: inline-block;
  position: relative;
}
.submenu {
  display: none;
  position: absolute;
  left: 0;
  top: 100%;
  background: #fff;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}
.menu li:hover > .submenu {
  display: block;
}

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

添加动画效果增强用户体验

通过CSS transition实现平滑过渡效果:

.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;
}

移动端适配方案

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

if ('ontouchstart' in window) {
  document.querySelectorAll('.menu > li > a').forEach(link => {
    link.addEventListener('click', function(e) {
      e.preventDefault();
      const submenu = this.nextElementSibling;
      const isOpen = submenu.style.display === 'block';

      document.querySelectorAll('.submenu').forEach(sm => {
        sm.style.display = 'none';
      });

      if (!isOpen) {
        submenu.style.display = 'block';
      }
    });
  });
}

无障碍访问优化

添加ARIA属性提升可访问性:

js实现二级菜单

<ul class="menu" role="menubar">
  <li role="none">
    <a href="#" role="menuitem" aria-haspopup="true">一级菜单</a>
    <ul class="submenu" role="menu">
      <li role="none"><a href="#" role="menuitem">二级菜单</a></li>
    </ul>
  </li>
</ul>
// 添加键盘导航支持
document.addEventListener('keydown', function(e) {
  if (e.key === 'Escape') {
    document.querySelectorAll('.submenu').forEach(sm => {
      sm.style.display = 'none';
    });
  }
});

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

相关文章

js实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

vue实现导航菜单

vue实现导航菜单

Vue 实现导航菜单的方法 基础路由导航实现 在 Vue 项目中,使用 vue-router 可以轻松实现导航菜单功能。首先安装并配置路由: npm install vue-router 在 rou…

css制作横向菜单

css制作横向菜单

使用浮动(Float)实现横向菜单 将菜单项的 display 属性设置为 float: left,使列表项横向排列。清除浮动避免影响后续布局。 ul.horizontal-menu { lis…

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单负责导航功能,右侧区域根据菜单选择动态展示对应内容。 创建基本组件结构 在Vue项目中创建…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…