必须用 Sass 将 Bootstrap 源码嵌套进命名空间块(如 .bootstrap-iso { @import "bootstrap/scss/bootstrap"; })才能实现样式隔离,仅在 HTML 中添加 class 无效;JS 组件需显式传入带前缀的选择器,Shadow DOM 需用 adoptedStyleSheets 注入样式表,CSS 变量仍为全局需额外覆盖。
直接在 HTML 里后引入 bootstrap.min.css 就会覆盖——这不是引入方式错了,是没做作用域隔离。真想“不覆盖”,必须让 Bootstrap 的样式只生效在它该管的 DOM 范围内,而不是全局撒网。
光给 <body> 加 class="bootstrap-iso" 没用,CSS 文件里还是满屏裸 .btn、.row。起效的前提是:用 Sass 把整个 Bootstrap 包进命名空间块里。
bootstrap-iso.scss,内容为:.bootstrap-iso {@import "bootstrap/scss/bootstrap";}
$primary)都在 @import 前定义好,否则会被忽略.bootstrap-iso .btn、.bootstrap-iso .col-md-6,天然避开全局类冲突@import "bootstrap/scss/utilities" 后再改 $utilities 无效,必须在 @import 前注入新配置如果你的组件用了 attachShadow(),外部 bootstrap.min.css 默认失效——Shadow DOM 不认 light DOM 的样式表。
<style> 标签,维护成本爆炸bootstrap.min.css 已通过 <link> 加载,再取它的 CSSStyleSheet 实例:const sheet = document.querySelector('link[href*="bootstrap"]').sheet;this.shadowRoot.adoptedStyleSheets = [sheet];
@media (min-width: 768px))会自动生效,但宿主元素需显式设 display: block 或 width: 100%,否则栅格计算失准Bootstrap 的 Modal、Dropdown 等 JS 组件默认查 .modal、.dropdown-menu,一旦加了 .bootstrap-iso 前缀,它们就找不到目标节点,且控制台静默失败。
data-bs-toggle 自动初始化——它硬编码查无前缀的选择器new Modal(document.querySelector('.bootstrap-iso .modal'));
container: '.bootstrap-iso',否则浮层渲染到 document.body 后脱离样式作用域--bs-primary)仍是全局的,多个微应用共用会互相覆盖,得靠运行时注入 :root 覆盖最难防的不是按钮样式错乱,而是 JS 组件挂载到 document.body 后,DOM 节点在 light DOM,样式却锁在 shadow 或命名空间里——这种匹配失败没有报错,只能靠 Computed 面板逐个核对最终生效的样式来源。