You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为导航栏添加下拉菜单 实现桌面悬停、移动端点击展开

响应式导航下拉菜单实现方案

直接基于你现有代码修改即可,不需要引入额外依赖,完全匹配你要的「桌面端hover展开、移动端点击展开」交互,下拉样式和主导航保持一致:


1. 替换/新增CSS样式

首先把你原有代码里的.navigation-bar-dropdown样式块替换成下面的内容,补全下拉默认隐藏、展开状态、两端适配的样式:

/* 下拉菜单默认隐藏 */
.navigation-bar-dropdown {
  display: none;
  flex-direction: column;
  width: 100%;
  margin-top: 1rem;
  gap: 0.5rem;
}

/* 下拉展开状态类 */
.navigation-bar-dropdown.open {
  display: flex;
}

/* 移动端带下拉的导航项改为纵向排列,避免下拉内容错位 */
.navigation-bar-menu li:has(.navigation-bar-dropdown) {
  flex-direction: column;
  align-items: center;
}

然后在你现有的@media only screen and (min-width: 700px)桌面端媒体查询块里,追加以下样式:

/* 桌面端带下拉的导航项设为相对定位,作为下拉的定位父级 */
.navigation-bar-menu li:has(.navigation-bar-dropdown) {
  position: relative;
  flex-direction: row;
}

/* 桌面端hover触发下拉显示 */
.navigation-bar-menu li:has(.navigation-bar-dropdown):hover .navigation-bar-dropdown {
  display: flex;
  position: absolute;
  top: 100%;
  left: 0;
  margin-top: 0.5rem;
  background: #ecf0f1;
  border-radius: 0.25rem;
  padding: 0.5rem;
  min-width: 100%;
  z-index: 99;
}

/* 桌面端下拉项样式和主导航统一 */
.navigation-bar-dropdown li {
  width: 100%;
  text-align: center;
  padding: 0.75rem;
  border-radius: 0.25rem;
}

2. 替换JavaScript逻辑

把你原有的JS代码全部替换成下面的内容,补全移动端点击下拉、窗口大小变化重置状态的逻辑:

window.addEventListener('DOMContentLoaded', () => {
  const menuToggler = document.querySelector('.navigation-bar-toggle')
  const menu = document.querySelector('.navigation-bar-menu')
  const dropdownParents = document.querySelectorAll('.navigation-bar-menu li:has(.navigation-bar-dropdown)')

  // 原有汉堡菜单切换逻辑
  menuToggler.addEventListener('click', () => {
    menu.classList.toggle('open')
  })

  // 移动端下拉点击切换逻辑
  dropdownParents.forEach(parent => {
    const dropdown = parent.querySelector('.navigation-bar-dropdown')
    const triggerLink = parent.querySelector('a')

    triggerLink.addEventListener('click', (e) => {
      // 仅移动端(宽度小于700px)时触发下拉切换,阻止链接默认跳转
      if (window.innerWidth < 700) {
        e.preventDefault()
        // 展开当前下拉前,先关闭其他已展开的下拉
        dropdownParents.forEach(otherParent => {
          if (otherParent !== parent) {
            otherParent.querySelector('.navigation-bar-dropdown').classList.remove('open')
          }
        })
        dropdown.classList.toggle('open')
      }
    })
  })

  // 窗口尺寸变化时重置菜单状态,避免切屏后样式错乱
  window.addEventListener('resize', () => {
    dropdownParents.forEach(parent => {
      parent.querySelector('.navigation-bar-dropdown').classList.remove('open')
    })
    // 切到桌面端时自动关闭移动端展开的汉堡菜单
    if (window.innerWidth >= 700) {
      menu.classList.remove('open')
    }
  })
})

实现效果说明

  • 桌面端:鼠标悬停在Services、Products导航项上自动弹出下拉,鼠标移开自动收起,下拉的背景、hover效果完全和主导航样式统一,不会挤压其他导航项位置
  • 移动端:点击汉堡按钮展开主菜单后,点击带下拉的导航项即可展开对应子菜单,同时自动收起其他已展开的子菜单,点击普通导航链接正常跳转
  • 横竖屏/窗口大小切换时自动重置菜单状态,不会出现错位、下拉残留的问题

内容的提问来源于stack exchange,提问作者ryrimsky

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:09:25