最轻量解法是用 data-bs-backdrop="static" 跳过 padding-right 补偿;若需点击遮罩关闭,则须为所有 position: fixed 元素添加 is-fixed 类,确保 Bootstrap 同步补偿。

直接加 body { padding-right: 0 !important } 不但无效,还会让抖动更明显——因为 Bootstrap 5+ 是通过内联样式(如 style="padding-right: 17px")动态设置的,优先级高于任何 CSS 规则。
为什么 modal-open 加了 padding-right 还会抖?
根本不是没加,而是加得“不对位”:Bootstrap 只给 body 补了 padding-right,但所有 position: fixed 元素(比如 .fixed-top 导航栏、全屏背景图、悬浮按钮)完全不受影响。它们原地不动,而流式内容被向右推了一段,视觉上就是页面“向左一缩”。
- 检查你有没有给
<nav class="navbar fixed-top is-fixed">或类似元素加is-fixed类——漏掉任何一个,抖动就会重现 - 确认没在全局 CSS 里写
body { padding-right: 0 !important },它会干扰后续滚动恢复逻辑 - 如果你用了
overlay-scrollbars或启用了scrollbar-width: none,Bootstrap 的滚动条宽度检测会返回0,导致补偿失效或反向错位
用 data-bs-backdrop="static" 跳过整个补偿流程
这是最轻量、最安全的解法,适用于不需要点击遮罩关闭的场景(比如权限确认、表单提交成功提示、单次操作反馈)。
- 在模态框根元素上加属性:
<div class="modal" data-bs-backdrop="static"> - 它跳过
modal-open类添加、跳过padding-right注入、跳过overflow: hidden设置,但依然禁用背景滚动 -
ESC键仍可关闭,不影响键盘交互 - 不破坏任何现有 CSS,也不需要改 JS 监听逻辑
必须支持点击遮罩关闭?那就加 is-fixed 类
Bootstrap 内部会自动为带 is-fixed 的 position: fixed 元素同步增删 padding-right,无需额外 JS。
立即学习“前端免费学习笔记(深入)”;
- 所有自定义
fixed元素都得加:<nav class="navbar fixed-top is-fixed">、<div class="hero-bg is-fixed"> -
is-fixed本身无样式,是纯语义钩子;Bootstrap JS 靠它识别并同步补偿 - 漏掉任何一个(比如广告位、全屏视频容器),Modal 打开时就会明显错位
真正难的不是选哪个方案,而是排查有没有第三方库(比如 perfect-scrollbar)或全局重置 CSS 悄悄改了 body 的 overflow 或内联 padding-right——这些隐性覆盖往往比技术方案本身更耗时间定位。


















