Shadow DOM 是 Web Components 的核心技术,提供独立 DOM 环境实现样式、结构和行为的封装;通过 attachShadow 创建影子树,挂载到宿主元素上,支持 open(可访问)和 closed(不可访问)模式;其核心优势为样式隔离,内部 CSS 不影响外部,外部样式默认不穿透,可通过 CSS 变量传递主题;利用 slot 可实现 Light DOM 内容投影,支持具名插槽进行布局分发;尽管 closed 模式可增强封装,但仍存在绕过风险,主要用于逻辑隔离;整体上 Shadow DOM 有效避免全局污染,提升组件复用性与健壮性,适用于构建 UI 库和设计系统。

Shadow DOM 是 Web Components 的核心技术之一,它为组件提供了一个独立的 DOM 环境,实现真正的封装——包括样式、结构和行为。使用 Shadow DOM 可以避免全局样式污染,防止外部 JavaScript 意外修改组件内部结构,让前端组件更健壮、可复用。
什么是 Shadow DOM
Shadow DOM 允许开发者将一个隐藏的、独立的 DOM 树附加到某个元素上,这个“影子树”与主文档 DOM 隔离,有自己的作用域。
每个 Shadow Root 都挂载在一个宿主元素(Host)上,外部无法直接访问其内部结构,样式也不会泄露出去,实现了良好的封装性。
例如:
立即学习“Java免费学习笔记(深入)”;
const host = document.createElement('div');
const shadowRoot = host.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = '这是影子DOM中的内容';
document.body.appendChild(host);
这段代码创建了一个带有 Shadow DOM 的 div,其中的内容不会被外部 CSS 影响,除非特别设置穿透规则。
封闭模式:open 与 closed
创建 Shadow Root 时可以通过 mode 参数控制访问权限:
- open:可通过 JavaScript 在外部访问 Shadow Root,如 element.shadowRoot
- closed:Shadow Root 不可从外部访问,增强了封装性
示例:
const shadowRoot = host.attachShadow({ mode: 'closed' });
// 外部调用 host.shadowRoot 将返回 null
虽然 closed 模式看似更安全,但目前仍可通过一些手段绕过(如重写 attachShadow 方法),因此更多用于逻辑隔离而非绝对安全防护。
weiit-saas是一款Java开源项目,由weiit团队自研,意在通过技术封装,帮助企业一键生成小程序、公众号,让企业拥有独立品牌的自营商城。weiit-saas是完全开源电商SaaS系统,属于weiit开源的社区版,旧版已不在维护和更新,仅供学习和参考,新版saas从底层架构到前后端UI设计已经全面优化和升级。 主要特点1、项目采用Spring+SpringMVC+Mybatis主流开源框架
样式隔离与作用域CSS
Shadow DOM 最大的优势之一是样式隔离。在 Shadow Root 中定义的 CSS 不会影响外部页面,外部样式也默认不作用于内部元素(除非使用继承属性)。
可以在 Shadow Root 内部直接写 style 标签:
shadowRoot.innerHTML = `
蓝色文本
`;
如果希望某些样式能被继承(如字体、颜色等),可以结合 CSS 自定义属性(变量)实现灵活的主题传递:
:host {
--text-color: #333;
}
span {
color: var(--text-color);
}
与 Light DOM 的交互
主文档中的元素称为 Light DOM,它们可以被投影(slot)进 Shadow DOM,实现内容分发。
使用
// 宿主元素包含原始内容 host.innerHTML = '加粗文字'; // Shadow DOM 中定义插槽 shadowRoot.innerHTML = '';
渲染后,加粗文字 会被插入到 slot 位置,但仍受 Shadow DOM 样式限制。
还可以使用具名 slot 实现复杂布局:
shadowRoot.innerHTML = `基本上就这些。Shadow DOM 提供了强大的封装能力,是构建可复用、高内聚组件的关键技术,尤其适合开发设计系统或 UI 库。`; 默认内容









