shadow dom 提供强大的样式封装机制,确保组件内部样式不泄露且不受外部干扰。文章将深入探讨如何在 shadow dom 内部应用样式,外部可继承样式如何影响 shadow tree,以及内部 html 元素的默认显示行为(如 `
Web Components 作为现代 Web 开发的重要组成部分,旨在提供可复用、封装的组件。其中,Shadow DOM 是实现这一目标的关键技术,它允许开发者将一个 DOM 子树(Shadow Tree)附加到现有 DOM 元素(Shadow Host)上,并与主文档的 DOM 隔离。这种隔离不仅包括 DOM 结构,更重要的是样式。理解 Shadow DOM 的样式隔离机制及其内部元素的默认行为,是构建高质量 Web Components 的基础。
Shadow DOM 的一个核心特性是其强大的样式封装能力。这意味着组件内部的样式不会影响外部文档,反之亦然,但并非完全没有交互。
在 Shadow DOM 内部,通过
尽管 Shadow DOM 提供了强大的样式隔离,但并非所有 Light DOM 的样式都无法穿透。CSS 属性分为可继承和非可继承
两类:
下面的示例展示了 Shadow DOM 内部样式、外部可继承样式和非可继承样式的行为。
index.html
Shadow DOM 样式示例
外部标题
这是主文档中的一段文本。
main.js
class MyStyledElement extends HTMLElement {
constructor() {
super();
const shadowRoot = this.attachShadow({ mode: 'open' });
const template = document.createElement('template');
template.innerHTML = `
Shadow DOM 内部标题
这是一段 Shadow DOM 内部的文本,它会继承外部的字体,但颜色和大小被内部样式覆盖。
`;
shadowRoot.appendChild(template.content.cloneNode(true));
}
}
customElements.define('my-styled-element', MyStyledElement);解释:
在 Web Components 中,理解 Shadow Host (自定义元素本身) 和 Shadow Tree 内部元素的默认行为至关重要,尤其是在布局方面。
自定义元素(如
Shadow Tree 内部的 HTML 元素(如
示例分析: 回到原始问题中的 cutomtag-a 和 cutomtag-b。