Shadow DOM 是 Web Components 的核心技术,用于实现 DOM 和样式隔离。它通过 attachShadow 方法挂载到宿主元素上,创建独立的影子树,确保内部结构、样式不被外部干扰,避免 CSS 冲突与全局污染。其关键特性包括样式隔离、DOM 封装和作用域限制。Shadow DOM 与 Light DOM 通过 <slot> 机制进行内容分发,支持默认和具名插槽,实现灵活的内容投影。样式可通过 CSS 自定义属性、:host、:host-context 在组件内部定制宿主外观,而 ::part() 和 ::slotted() 则允许有限的外部样式控制。并非所有元素都支持 Shadow DOM,如 <img> 或 <input> 等原生控件无法挂载。总体而言,Shadow DOM 提供了高内聚、可复用的组件封装能力,是构建现代前端组件系统的重要基础。

Shadow DOM 是 Web Components 的核心技术之一,它为开发者提供了一种将封装的 DOM 和样式隔离于页面其他部分的能力。在复杂的前端项目中,CSS 冲突和结构污染是常见问题,而 Shadow DOM 正是解决这类问题的有效手段。
Shadow DOM 允许你创建一个独立于主文档 DOM 树的“影子”树。这个影子树拥有自己的元素和样式,不会受到外部 CSS 的影响,同时外部 JavaScript 也无法直接访问其内部结构。
每个 Shadow Root 都挂载在一个宿主元素(Host)上,宿主元素是普通 DOM 节点,而 Shadow Root 内部的内容对外部是隐藏的,实现了真正的封装。
关键特性包括:使用 element.attachShadow() 方法可以为任意元素挂载 Shadow Root。该方法接收一个配置对象,其中 mode 字段决定封闭性。
立即学习“Java免费学习笔记(深入)”;
示例代码:
const host = document.createElement('my-component');
const shadowRoot = host.attachShadow({ mode: 'open' });
shadowRoot.innerHTML = `
<style>
p { color: blue; margin: 0; }
</style>
<p>这是 Shadow DOM 中的内容</p>
`;
document.body.appendChild(host);
页面原本的 DOM 结构称为 Light DOM。当使用 Web Components 时,Light DOM 的内容可以通过 <slot> 元素投影到 Shadow DOM 中,实现内容分发。
示例:
// 宿主元素包含一些子节点
host.innerHTML = `<span>插槽内容</span>`;
// 在 Shadow Root 中定义插槽
shadowRoot.innerHTML = `
<div class="wrapper">
<slot></slot>
</div>
`;
此时 span 元素会被渲染在 slot 的位置,但其样式仍受 Shadow 内部控制。这种机制让组件既能封装内部结构,又能接受外部输入内容。
还可以使用具名插槽:
<slot name="header"></slot> ... <span slot="header">标题内容</span>
Shadow DOM 内部的样式默认不会影响外部,反之亦然。但有时需要允许一定程度的样式定制。
可通过以下方式实现灵活控制:
:host {
--text-color: red;
}
p { color: var(--text-color); }
:host {
display: block;
border: 1px solid #ccc;
}
:host(.highlight) {
border-color: orange;
}
基本上就这些。Shadow DOM 提供了强大的封装能力,是构建可复用、高内聚 Web Components 的基础。理解其工作机制有助于开发更健壮、更易维护的前端组件系统。
以上就是JavaScript中的Shadow DOM深入理解_javascript Web Components的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号