当前位置:首页 > JavaScript

js 实现菜单切换

2026-03-16 04:54:32JavaScript

实现菜单切换的 JavaScript 方法

使用 classList 切换类名

通过 classList.toggle() 方法动态添加或移除 CSS 类,控制菜单显示/隐藏状态:

const menuBtn = document.querySelector('.menu-btn');
const menu = document.querySelector('.menu');

menuBtn.addEventListener('click', () => {
  menu.classList.toggle('active');
});

对应 CSS 示例:

.menu {
  display: none;
}
.menu.active {
  display: block;
}

直接修改 style 属性

通过 JavaScript 直接操作元素的 style 属性:

js 实现菜单切换

const toggleMenu = () => {
  const menu = document.getElementById('dropdown');
  menu.style.display = menu.style.display === 'block' ? 'none' : 'block';
};

使用数据属性控制状态

通过自定义 data-* 属性存储菜单状态:

document.addEventListener('click', (e) => {
  if (!e.target.matches('[data-toggle="menu"]')) return;

  const targetId = e.target.dataset.target;
  const menu = document.getElementById(targetId);
  const isHidden = menu.dataset.visible === 'false';

  menu.dataset.visible = isHidden;
  menu.style.transform = isHidden ? 'translateX(0)' : 'translateX(-100%)';
});

动画效果实现

结合 CSS transition 实现平滑动画:

js 实现菜单切换

function toggleMenu() {
  const nav = document.querySelector('nav');
  nav.style.transform = nav.style.transform.includes('translateX(0)') 
    ? 'translateX(-100%)' 
    : 'translateX(0)';
}

对应 CSS:

nav {
  transform: translateX(-100%);
  transition: transform 0.3s ease-out;
}

多级菜单处理

递归处理嵌套菜单结构:

document.querySelectorAll('.menu-item').forEach(item => {
  item.addEventListener('click', function() {
    const submenu = this.querySelector('.submenu');
    if (submenu) {
      submenu.style.display = submenu.style.display === 'block' 
        ? 'none' 
        : 'block';
    }
  });
});

注意事项

  • 移动端需考虑触摸事件兼容性
  • 菜单打开时应确保其他交互元素被禁用(如添加遮罩层)
  • 对于复杂动画建议使用 CSS 而非 JavaScript 控制
  • 可访问性需添加 aria-expanded 等 ARIA 属性

完整示例

<button class="menu-toggle">菜单</button>
<nav class="main-menu">
  <ul>
    <li><a href="#">首页</a></li>
    <li class="has-submenu">
      <a href="#">产品</a>
      <ul class="submenu">
        <li><a href="#">产品A</a></li>
        <li><a href="#">产品B</a></li>
      </ul>
    </li>
  </ul>
</nav>

<script>
document.querySelector('.menu-toggle').addEventListener('click', function() {
  document.querySelector('.main-menu').classList.toggle('open');
});

document.querySelectorAll('.has-submenu > a').forEach(link => {
  link.addEventListener('click', function(e) {
    e.preventDefault();
    this.nextElementSibling.classList.toggle('show');
  });
});
</script>

<style>
.main-menu {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}
.main-menu.open {
  max-height: 500px;
}
.submenu {
  display: none;
}
.submenu.show {
  display: block;
}
</style>

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

相关文章

js实现轮播

js实现轮播

实现基础轮播效果 使用HTML结构创建轮播容器和图片元素: <div class="carousel"> <div class="carousel-inner">…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…