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

Bootstrap 5中data-bs-dismiss失效 模态框切换旧弹窗无法关闭

问题原因

  1. Bootstrap模态框默认带fade过渡动画,关闭动画需要约300ms才能完成,你同时在按钮上绑定了data-bs-dismiss="modal"(关闭旧模态框)和data-bs-toggle="modal"(打开新模态框),两个动作几乎同时触发,旧模态框的关闭逻辑还没执行完、背景遮罩还没销毁,新模态框就已经渲染,就会出现叠加问题。
  2. 你使用的Bootstrap 5.1.0版本本身存在模态框切换的已知缺陷,官方在后续小版本中修复了这个场景的执行时序问题。

解决方法

方法1:移除过渡动画(最快修复)

把两个模态框根元素的fade类删掉,没有过渡动画的情况下关闭操作会立即执行,不会出现时序冲突:

<!-- 修改前 -->
<div class="modal fade" id="modal_debug" tabindex="-1">
<!-- 修改后 -->
<div class="modal" id="modal_debug" tabindex="-1">

modal_newAvatar也做同样修改即可。

方法2:用JS手动控制切换时序(保留动画效果)

删掉按钮上的data-bs-toggle、data-bs-target属性,手动监听按钮点击事件,等旧模态框完全关闭后再打开新模态框:

// 先获取模态框实例
const debugModal = new bootstrap.Modal(document.getElementById('modal_debug'))
const newAvatarModal = new bootstrap.Modal(document.getElementById('modal_newAvatar'))

// 监听Novo Avatar按钮点击
document.querySelector('button[data-bs-target="#modal_newAvatar"]').addEventListener('click', function() {
  // 先关闭旧模态框
  debugModal.hide()
  // 监听旧模态框关闭完成事件
  document.getElementById('modal_debug').addEventListener('hidden.bs.modal', function () {
    // 完全关闭后再打开新模态框
    newAvatarModal.show()
  }, { once: true }) // 只监听一次,避免重复触发
})

方法3:升级Bootstrap版本

升级到Bootstrap 5.2.0及以上版本,官方已经修复了这个场景下通过data属性直接切换模态框的时序问题,升级后你现有的代码可以直接正常运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:09:05