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

Bootstrap下拉菜单点击触发按钮无法隐藏的解决方法

问题根源

你的代码存在两个核心问题,导致交互异常:

  • 重复引入Bootstrap JS资源:同时加载了bootstrap.min.js和bootstrap.bundle.min.js,后者已经包含Popper依赖和全部组件逻辑,重复加载会造成事件绑定重复、原生toggle逻辑失效
  • 自定义逻辑与原生行为冲突:Bootstrap 5的Dropdown组件默认已经实现「点击按钮切换显隐、点击外部区域自动收起」的交互,你额外绑定的jQuery点击事件,判断类名的逻辑本身就错误(show类是加在.dropdown容器和.dropdown-menu上,而非触发按钮),且事件触发时序早于原生组件的展开动画执行,才会出现菜单还没完成渲染就被隐藏的问题。
正确实现方案

第一步:修复JS引入错误

删掉重复的bootstrap.min.js引入,只保留bundle版本即可,修正后的资源引入部分:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.0.0/css/all.css" integrity="sha384-3B6NwesSXE7YJlcLI9RpRqGf2p/EgVH8BgoKTaUrmKNDkHPStTQ3EyoYjCGXaOTS" crossorigin="anonymous" />
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<!-- 仅保留bundle版本即可,已包含所有组件和依赖 -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

第二步:移除无效的自定义jQuery监听代码

你写的$('.dropdown button').on('click', ...)逻辑完全不需要,直接删除即可。Bootstrap原生会通过按钮上的data-bs-toggle="dropdown"属性自动绑定切换显隐的逻辑,修复JS引入问题后,即可正常实现点击展开、再次点击收起的预期交互。

(可选)JS手动控制显隐的正确写法

如果后续需要通过代码手动操作下拉菜单状态,不要直接修改元素的hide/show属性或手动增删类名,使用Bootstrap官方提供的实例API,避免时序冲突:

// 初始化下拉组件实例
const dropdownTrigger = document.querySelector('.dropdown button')
const dropdownInstance = new bootstrap.Dropdown(dropdownTrigger)

// 切换显隐
dropdownInstance.toggle()
// 手动显示: dropdownInstance.show()
// 手动隐藏: dropdownInstance.hide()
修正后可直接运行的完整代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <style>
    .dropdown {
      margin-left: 40%;
    }
    .dropdown-menu {
      transform: translate(calc(-50% + 20px), 40px) !important;
    }
  </style>
</head>
<body>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.0.0/css/all.css" integrity="sha384-3B6NwesSXE7YJlcLI9RpRqGf2p/EgVH8BgoKTaUrmKNDkHPStTQ3EyoYjCGXaOTS" crossorigin="anonymous" />
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
  <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>

  <div class="dropdown">
    <button class="btn btn-secondary" type="button" data-bs-toggle="dropdown" aria-expanded="false">
      <i class="fa-solid fa-bell"></i>
    </button>
    <ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
      <li><a class="dropdown-item">option 1</a></li>
      <li><a class="dropdown-item">option 2</a></li>
      <li><a class="dropdown-item">option 3</a></li>
    </ul>
  </div>
</body>
</html>

注意:使用Bootstrap原生组件时,尽量不要额外写DOM操作逻辑覆盖默认行为,优先使用官方提供的API,避免出现事件冲突、动画时序错乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:39:26