当前位置:首页 > JavaScript

js 实现 dropdown

2026-01-31 23:32:18JavaScript

实现基础下拉菜单(Dropdown)

使用HTML、CSS和JavaScript创建一个简单的下拉菜单。以下是一个基础实现示例:

HTML结构

<div class="dropdown">
  <button class="dropdown-toggle">菜单</button>
  <ul class="dropdown-menu">
    <li><a href="#">选项1</a></li>
    <li><a href="#">选项2</a></li>
    <li><a href="#">选项3</a></li>
  </ul>
</div>

CSS样式

.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-menu {
  display: none;
  position: absolute;
  min-width: 160px;
  box-shadow: 0 8px 16px rgba(0,0,0,0.2);
  z-index: 1;
}

.dropdown-menu li {
  padding: 12px 16px;
  display: block;
}

.dropdown-menu li:hover {
  background-color: #f1f1f1
}

.show {
  display: block;
}

JavaScript逻辑

js 实现 dropdown

document.querySelector('.dropdown-toggle').addEventListener('click', function() {
  document.querySelector('.dropdown-menu').classList.toggle('show');
});

// 点击其他地方关闭菜单
window.addEventListener('click', function(event) {
  if (!event.target.matches('.dropdown-toggle')) {
    const dropdowns = document.querySelectorAll('.dropdown-menu');
    dropdowns.forEach(function(dropdown) {
      if (dropdown.classList.contains('show')) {
        dropdown.classList.remove('show');
      }
    });
  }
});

使用事件委托处理动态内容

对于动态生成的dropdown项目,使用事件委托更高效:

document.addEventListener('click', function(event) {
  // 切换菜单显示
  if (event.target.matches('.dropdown-toggle')) {
    event.target.nextElementSibling.classList.toggle('show');
  }

  // 点击菜单项
  if (event.target.matches('.dropdown-menu a')) {
    console.log('选择了:', event.target.textContent);
    event.target.closest('.dropdown-menu').classList.remove('show');
  }

  // 点击外部关闭
  if (!event.target.closest('.dropdown')) {
    document.querySelectorAll('.dropdown-menu').forEach(menu => {
      menu.classList.remove('show');
    });
  }
});

动画效果增强

为下拉菜单添加平滑的动画效果:

CSS添加过渡

js 实现 dropdown

.dropdown-menu {
  opacity: 0;
  transform: translateY(-10px);
  transition: opacity 0.3s, transform 0.3s;
  pointer-events: none;
}

.dropdown-menu.show {
  opacity: 1;
  transform: translateY(0);
  pointer-events: auto;
}

无障碍访问支持

确保下拉菜单对屏幕阅读器友好:

<div class="dropdown">
  <button 
    class="dropdown-toggle" 
    aria-expanded="false" 
    aria-haspopup="true"
    aria-controls="dropdown-menu"
  >
    菜单
  </button>
  <ul id="dropdown-menu" class="dropdown-menu" role="menu">
    <li role="none"><a href="#" role="menuitem">选项1</a></li>
    <li role="none"><a href="#" role="menuitem">选项2</a></li>
    <li role="none"><a href="#" role="menuitem">选项3</a></li>
  </ul>
</div>

更新JavaScript

document.querySelector('.dropdown-toggle').addEventListener('click', function() {
  const expanded = this.getAttribute('aria-expanded') === 'true';
  this.setAttribute('aria-expanded', !expanded);
  document.querySelector('.dropdown-menu').classList.toggle('show');
});

键盘导航支持

添加键盘交互支持:

document.querySelector('.dropdown-toggle').addEventListener('keydown', function(e) {
  const menu = this.nextElementSibling;

  if (e.key === 'Enter' || e.key === ' ') {
    e.preventDefault();
    const expanded = this.getAttribute('aria-expanded') === 'true';
    this.setAttribute('aria-expanded', !expanded);
    menu.classList.toggle('show');
  }

  if (e.key === 'ArrowDown' && menu.classList.contains('show')) {
    e.preventDefault();
    menu.querySelector('a').focus();
  }
});

document.querySelector('.dropdown-menu').addEventListener('keydown', function(e) {
  const items = this.querySelectorAll('a');
  const currentItem = document.activeElement;
  const currentIndex = Array.from(items).indexOf(currentItem);

  if (e.key === 'ArrowDown') {
    e.preventDefault();
    const nextIndex = (currentIndex + 1) % items.length;
    items[nextIndex].focus();
  }

  if (e.key === 'ArrowUp') {
    e.preventDefault();
    const prevIndex = (currentIndex - 1 + items.length) % items.length;
    items[prevIndex].focus();
  }

  if (e.key === 'Escape') {
    this.classList.remove('show');
    this.previousElementSibling.focus();
  }
});

这些实现方法涵盖了从基础功能到增强用户体验的多个方面,可以根据项目需求选择适合的方案或组合使用。

标签: jsdropdown
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

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

js实现验证码

js实现验证码

实现验证码的JavaScript方法 生成随机验证码 使用Math.random()生成随机字符串,结合数字和字母: function generateCaptcha() { const cha…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现计算器

js实现计算器

实现基础计算器功能 使用JavaScript创建一个基础计算器需要处理数字输入、运算符逻辑和结果显示。以下是一个简单的实现示例: let currentInput = '0'; let previ…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('image…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…