Shadow DOM 是唯一原生样式隔离方案,通过 element.attachShadow({ mode: 'open' }) 创建独立子树,实现外部样式不进、内部样式不出;iframe 隔离最彻底但开销大;框架 scoped CSS 仅为编译时类名隔离;@scope() 是未来轻量补充方案。
HTML组件本身和样式隔离没有必然关系——是否隔离,完全取决于你用什么机制加载和渲染它。
它不是 CSS 技巧,也不是框架功能,而是浏览器级的 DOM 分离机制。调用 element.attachShadow({ mode: 'open' }) 后,返回的 shadowRoot 就是一个独立子树:外部样式默认进不去,内部样式默认出不来。
mode: 'closed' 会让 element.shadowRoot 返回 null,调试困难,生产环境慎用font-family、color 等属性,需显式写 inherit 或重置::slotted(*) 只能影响 slot 中投影进来的内容,对 shadow 内部原生节点无效每个 <iframe> 都有完全独立的 window、document 和样式作用域,天然隔离。
postMessage、资源重复加载、SEO 不友好Vue 的 <style scoped>、Svelte 的 <style>、Astro 的 class:xxx,本质都是靠编译器自动加属性选择器(如 [data-v-f3f3eg9])来模拟隔离。
立即学习“前端免费学习笔记(深入)”;
div p、*[id])意外命中* { margin: 0 })穿透生效CSS @scope 规则(2026 年起部分浏览器开始支持)允许声明一个选择器作用域根,让 .title 只匹配该范围内元素。
@scope (.card) { .title { color: #333; } }
caniuse.com 上仍标为“部分支持”真正容易被忽略的一点是:即使用了 Shadow DOM,如果你在 shadowRoot 里动态插入了未包裹的 <style> 或通过 document.head.appendChild 注入样式,隔离就形同虚设。样式隔离不是“开了开关就自动生效”,而是一整套加载、注入、作用域绑定的链路控制。