当前位置:首页 > JavaScript

js 实现 dropdown

2026-03-13 21:38:29JavaScript

使用原生 JavaScript 实现 Dropdown

通过监听点击事件动态切换下拉菜单的显示状态。核心逻辑是检测点击事件是否发生在下拉区域外,从而关闭菜单。

document.addEventListener('DOMContentLoaded', function() {
  const dropdowns = document.querySelectorAll('.dropdown');

  dropdowns.forEach(dropdown => {
    const button = dropdown.querySelector('.dropdown-button');
    const menu = dropdown.querySelector('.dropdown-menu');

    button.addEventListener('click', () => {
      menu.classList.toggle('show');
    });
  });

  document.addEventListener('click', function(event) {
    dropdowns.forEach(dropdown => {
      if (!dropdown.contains(event.target)) {
        dropdown.querySelector('.dropdown-menu').classList.remove('show');
      }
    });
  });
});

HTML 结构示例

需要配合以下HTML结构使用,注意添加data-dropdown属性用于标识组件。

<div class="dropdown">
  <button class="dropdown-button">Menu</button>
  <ul class="dropdown-menu">
    <li><a href="#">Item 1</a></li>
    <li><a href="#">Item 2</a></li>
    <li><a href="#">Item 3</a></li>
  </ul>
</div>

CSS 基础样式

下拉菜单默认隐藏,通过show类控制显示。添加过渡效果增强用户体验。

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

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  display: none;
  min-width: 160px;
  box-shadow: 0 2px 5px rgba(0,0,0,0.2);
}

.dropdown-menu.show {
  display: block;
  animation: fadeIn 0.3s;
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(-10px); }
  to { opacity: 1; transform: translateY(0); }
}

键盘无障碍支持

通过监听键盘事件实现无障碍访问,符合WCAG标准。

dropdowns.forEach(dropdown => {
  const button = dropdown.querySelector('.dropdown-button');
  const menu = dropdown.querySelector('.dropdown-menu');
  const items = menu.querySelectorAll('li a');

  button.addEventListener('keydown', (e) => {
    if (e.key === 'Enter' || e.key === ' ') {
      e.preventDefault();
      menu.classList.toggle('show');
    }
  });

  items.forEach(item => {
    item.addEventListener('keydown', (e) => {
      if (e.key === 'Escape') {
        menu.classList.remove('show');
        button.focus();
      }
    });
  });
});

动态内容加载

实现异步加载下拉菜单内容,适合数据量较大的场景。

function loadDropdownContent(url, dropdownId) {
  fetch(url)
    .then(response => response.json())
    .then(data => {
      const menu = document.querySelector(`#${dropdownId} .dropdown-menu`);
      menu.innerHTML = data.map(item => 
        `<li><a href="${item.url}">${item.text}</a></li>`
      ).join('');
    });
}

多级嵌套实现

支持二级菜单的嵌套结构,通过CSS控制子菜单定位。

<div class="dropdown">
  <button class="dropdown-button">Multi-level</button>
  <ul class="dropdown-menu">
    <li>
      <a href="#">Parent Item</a>
      <ul class="submenu">
        <li><a href="#">Child Item 1</a></li>
        <li><a href="#">Child Item 2</a></li>
      </ul>
    </li>
  </ul>
</div>
.submenu {
  display: none;
  position: absolute;
  left: 100%;
  top: 0;
}

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

移动端优化

添加触摸事件支持,并防止滚动穿透问题。

js 实现 dropdown

button.addEventListener('touchstart', (e) => {
  e.preventDefault();
  menu.classList.toggle('show');
});

document.addEventListener('touchstart', (e) => {
  if (!dropdown.contains(e.target)) {
    menu.classList.remove('show');
  }
});

标签: jsdropdown
分享给朋友:

相关文章

js实现复制

js实现复制

使用document.execCommand方法 在较旧的浏览器中,可以使用document.execCommand('copy')实现复制功能。创建一个临时的textarea或input元素,将需要…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…

节流js实现

节流js实现

节流(Throttle)的实现原理 节流是一种限制函数执行频率的技术,确保函数在一定时间间隔内最多执行一次。适用于高频触发事件(如滚动、输入、窗口调整等)的场景。 基础实现方式 使用时间戳判断是否执…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数:…