加 data-bs-backdrop="static" 可彻底避免模态框抖动,因其跳过滚动条补偿流程,不修改 body 内联样式;fixed 元素需加 .is-fixed 类同步补偿,或用 scrollbar-gutter 原生方案配合检测降级。

直接加 body { padding-right: 0 !important } 不但无效,还会让抖动更明显——因为 Bootstrap 5+ 是通过内联样式(如 style="padding-right: 17px")动态写值,CSS 规则根本盖不住它。抖动的根源不是“没补偿”,而是补偿只作用于流式内容,position: fixed 元素(比如导航栏、全屏背景)完全没同步右移。
为什么加 data-bs-backdrop="static" 就不抖了
这个属性会让 Bootstrap 完全跳过滚动条补偿流程:不加 modal-open 类、不计算滚动条宽度、不往 body 上写 padding-right、也不设 overflow: hidden。它只禁用点击遮罩关闭,ESC 键仍可关闭模态框。
- 适用于权限提示、表单确认、操作反馈等“不需要点背景关”的场景
- 不破坏现有 CSS,不影响下拉菜单、Tooltip 等其他组件
- 删掉这个属性即可恢复点击关闭,无残留副作用
- macOS Safari、旧版 Edge 兼容性无忧,不用 fallback
fixed 元素还在跳?必须加 .is-fixed 类
.is-fixed 是 Bootstrap 5 内置的 JS 钩子类,本身无任何样式,只用于告诉 Bootstrap:“这个元素要跟着 body 一起补 padding-right”。漏加一个,就抖一个。
- 所有
position: fixed元素都得显式加:比如<nav class="navbar fixed-top is-fixed">、<div class="hero-bg is-fixed"> - 它只对
fixed-top、fixed-bottom、sticky-top和带.is-fixed的元素生效 - 不加的话,手动监听
show.bs.modal/hidden.bs.modal同步padding-right,极易漏事件或多层 modal 下失效
想用 scrollbar-gutter 替代?别单独上
scrollbar-gutter: stable both 是浏览器原生占位方案,对 fixed 元素友好,但它不能单独生效,必须三件套齐上:
立即学习“前端免费学习笔记(深入)”;
- CSS 中先声明:
body { scrollbar-gutter: stable both; } - 清掉 Bootstrap 注入的内联补偿:
body.modal-open { padding-right: 0 !important; } - JS 初始化前覆盖默认行为:
Bootstrap.Modal.Default.scrollbarWidth = 0; - iOS Safari 17.4 之前、旧版 Edge 不支持
scrollbar-gutter,需用CSS.supports('scrollbar-gutter', 'stable')检测并 fallback
真正容易被忽略的是第三方库干扰:比如 overlay-scrollbars 或全局重置 CSS 悄悄改了 body 的 overflow 或内联 padding-right,这些地方查不到,抖动就找不到根。


















