<…">
当前位置:首页 > JavaScript

js实现菜单导航

2026-02-28 23:24:31JavaScript

实现基础菜单导航结构

使用HTML和CSS创建基本的菜单结构,配合JavaScript实现交互功能。以下是一个简单的垂直菜单导航示例:

<nav id="mainMenu">
  <ul>
    <li><a href="#home">首页</a></li>
    <li><a href="#products">产品</a>
      <ul class="submenu">
        <li><a href="#product1">产品1</a></li>
        <li><a href="#product2">产品2</a></li>
      </ul>
    </li>
    <li><a href="#contact">联系我们</a></li>
  </ul>
</nav>
#mainMenu ul {
  list-style: none;
  padding: 0;
}
#mainMenu li {
  position: relative;
}
.submenu {
  display: none;
  position: absolute;
  left: 100%;
  top: 0;
}
.submenu.active {
  display: block;
}

添加JavaScript交互逻辑

通过事件监听实现菜单的显示/隐藏功能:

js实现菜单导航

document.addEventListener('DOMContentLoaded', function() {
  const menuItems = document.querySelectorAll('#mainMenu > ul > li');

  menuItems.forEach(item => {
    if(item.querySelector('.submenu')) {
      item.addEventListener('mouseenter', function() {
        this.querySelector('.submenu').classList.add('active');
      });
      item.addEventListener('mouseleave', function() {
        this.querySelector('.submenu').classList.remove('active');
      });
    }
  });
});

响应式菜单实现

针对移动设备添加汉堡菜单功能:

<button id="mobileMenuBtn">☰</button>
<nav id="mobileMenu">
  <!-- 菜单内容与桌面版相同 -->
</nav>
#mobileMenuBtn {
  display: none;
}
@media (max-width: 768px) {
  #mobileMenuBtn {
    display: block;
  }
  #mobileMenu {
    display: none;
  }
  #mobileMenu.active {
    display: block;
  }
}
const mobileMenuBtn = document.getElementById('mobileMenuBtn');
const mobileMenu = document.getElementById('mobileMenu');

mobileMenuBtn.addEventListener('click', function() {
  mobileMenu.classList.toggle('active');
});

使用classList管理菜单状态

现代JavaScript推荐使用classList API来管理元素的类:

js实现菜单导航

// 添加类
element.classList.add('active');

// 移除类
element.classList.remove('active');

// 切换类
element.classList.toggle('active');

// 检查是否包含类
if(element.classList.contains('active')) {
  // 执行操作
}

增强用户体验的功能

添加键盘导航支持和ARIA属性提升可访问性:

menuItems.forEach((item, index) => {
  item.setAttribute('tabindex', '0');
  item.addEventListener('keydown', function(e) {
    if(e.key === 'Enter' || e.key === ' ') {
      const submenu = this.querySelector('.submenu');
      if(submenu) {
        submenu.classList.toggle('active');
      }
    }

    // 方向键导航
    if(e.key === 'ArrowDown') {
      const nextItem = menuItems[index + 1];
      if(nextItem) nextItem.focus();
    }
    if(e.key === 'ArrowUp') {
      const prevItem = menuItems[index - 1];
      if(prevItem) prevItem.focus();
    }
  });
});

使用事件委托优化性能

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

document.getElementById('mainMenu').addEventListener('click', function(e) {
  if(e.target.closest('li').querySelector('.submenu')) {
    e.preventDefault();
    e.target.closest('li').querySelector('.submenu').classList.toggle('active');
  }
});

这些方法提供了从基础到进阶的菜单导航实现方案,可以根据具体需求进行组合和调整。

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

相关文章

js实现轮播图

js实现轮播图

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

css二级菜单制作

css二级菜单制作

使用纯CSS实现二级菜单 通过嵌套HTML结构和CSS选择器实现二级菜单的显示与隐藏效果。以下是一个基础实现方案: HTML结构: <ul class="menu"> <li…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现pdf在线预览

js实现pdf在线预览

使用PDF.js实现PDF在线预览 PDF.js是由Mozilla开发的一个开源JavaScript库,可以在网页中直接渲染PDF文件。以下是实现PDF在线预览的步骤: 引入PDF.js库 在HT…

js分组实现

js分组实现

分组实现方法 在JavaScript中,可以通过多种方式实现数组或对象的分组操作。以下是几种常见的方法: 使用Array.prototype.reduce() 通过reduce方法可以轻松实现数组分…

js 实现链表

js 实现链表

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