必须同时设置 data-bs-backdrop="static" 和 data-bs-keyboard="false" 才能禁用点击背景和esc键关闭;漏前缀、错值或单设其一均无效,且 tabindex="-1" 与 aria-hidden="true" 缺一不可。
必须同时设置 data-bs-backdrop="static" 和 data-bs-keyboard="false",缺一不可;漏掉 bs- 前缀、写错值(如 "false" 或 true)、或只设其一,都会导致点击背景仍能关闭。
data-bs-backdrop="static" 是唯一有效值,不是布尔开关
data-bs-backdrop 的取值是语义化的:"true"(默认)允许点击关闭,"false" 会直接移除整个 .modal-backdrop DOM 节点,模态框“悬空”,可能引发滚动穿透、焦点丢失或屏幕阅读器误读;只有 "static" 才表示“保留遮罩但禁用点击事件”。写成 data-backdrop="static"(漏 bs-)会被浏览器完全忽略,降级为默认 true。
必须配对设置 data-bs-keyboard="false"
Bootstrap 内部将鼠标点击和键盘 ESC 分开处理:backdrop 控制遮罩层点击,keyboard 控制 ESC 键。只禁鼠标不等于锁死关闭通路——尤其在表单未提交完成时,用户按 ESC 退出会导致数据丢失。JS 初始化等效写法:new bootstrap.Modal(el, { backdrop: 'static', keyboard: false })。
tabindex="-1" 和 aria-hidden="true" 缺一不可
这两个属性不是可选装饰,而是 Bootstrap 初始化时的硬性依赖:
-
tabindex="-1":让模态框可被 JS 聚焦,缺失会导致keyboard: false配置被忽略 -
aria-hidden="true":参与内部状态管理,缺失可能引发初始化异常、重复触发或 focus trap 失效 - 动态插入的 Modal(如 AJAX 加载后追加 DOM),仅补 HTML 属性无效,必须在 JS 初始化时传参
嵌套 Modal 和移动端 iOS 点击穿透是隐藏雷区
Bootstrap 官方明确不支持嵌套模态框。若在已打开的 data-bs-backdrop="static" Modal 中再打开另一个 Modal,第二个遮罩会覆盖第一个,但点击区域逻辑混乱:点第一层背景,可能关闭第二层,也可能无响应。iOS Safari 上偶发点击背景仍关闭,主因是 pointer-events: none 在 touch 事件链中的处理差异,临时缓解可加样式:.modal-backdrop.show { pointer-events: auto !important; }。











