Web Components
Web Components 是一套不同的技术,它允许您创建可重用的自定义元素——这些元素的功��与您代码的其余部分隔离开来——并在您的 Web 应用中使用它们。
概念与用法
作为开发者,我们都知道尽可能重用代码是一个好主意。传统上,这对于自定义标记结构来说并不容易——想想看您有时不得不编写的复杂的 HTML(以及相关的样式和脚本)来渲染自定义 UI 控件,以及如果您不注意,多次使用它们可能会让您的页面变得一团糟。
Web Components 旨在解决此类问题——它包含三个主要技术,可以组合使用来创建具有封装功能的通用自定义元素,您可以随意在任何地方重用它们,而不必担心代码冲突。
- 自定义元素
-
一组 JavaScript API,允许您定义自定义元素及其行为,然后可以在您的用户界面中按需使用它们。
- Shadow DOM
-
一组 JavaScript API,用于将一个封装的“影子” DOM 树附加到一个元素上——它与主文档 DOM 分开渲染——并控制相关的功能。通过这种方式,您可以将元素的特性保持私有,这样它们就可以被脚本化和样式化,而不用担心与文档的其他部分发生冲突。
- HTML 模板
-
<template>和<slot>元素使您可以编写在渲染页面中不显示的标记模板。这些模板随后可以多次用作自定义元素结构的基��进行重用。
实现 Web Component 的基本方法通常如下所示
- 创建一个类,在其中使用 `class` 语法指定 Web Component 的功能。
- 使用 `CustomElementRegistry.define()` 方法注册您的新自定义元素,向其传递要定义的元素名称、指定其功能的类或函数,以及可选的它继承自哪个元素。
- 如果需要,使用 `Element.attachShadow()` 方法将 Shadow DOM 附加到自定义元素上。使用常规的 DOM 方法将子元素、事件监听器等添加到 Shadow DOM 中。
- 如果需要,使用 `` 和 `
` 定义 HTML 模板。同样,使用常规的 DOM 方法克隆模板并将其附加到您的 Shadow DOM 中。 - 在您的页面上随意使用自定义元素,就像使用任何常规 HTML 元素一样。
指南
- 使用自定义元素
-
一个指南,展示了如何使用自定义元素的特性来创建简单的 Web Components,同时还介绍了生命周期回调和其他一些更高级的特性。
- 使用 Shadow DOM
-
一个指南,介绍了 Shadow DOM 的基础知识,展示了如何将 Shadow DOM 附加到元素上,如何向 Shadow DOM 树添加内容,如何对其进行样式设置,等等。
- 使用模板和插槽
-
一个指南,展示了如何使用 `` 和 `
` 元素定义一个可重用的 HTML 结构,然后在您的 Web Components 中使用该结构。
参考
自定义元素
CustomElementRegistry-
包含与自定义元素相关的功能,其中最重要的是 `CustomElementRegistry.define()` 方法,该方法用于注册新的自定义元素,以便它们可以在您的文档中使用。
Window.customElements-
返回对 `CustomElementRegistry` 对象的引用。
- 生命周期回调
-
在自定义元素的类定义中定义的特殊回调函数,影响其行为
connectedCallback()-
当自定义元素首次连接到文档的 DOM 时调用。
disconnectedCallback()-
当自定义元素从文档的 DOM 中断开连接时调用。
adoptedCallback()-
当自定义元素被移动到新文档时调用。
attributeChangedCallback()-
当自定义元素的某个属性被添加、删除或更改时调用。
- 用于创建自定义内置元素的扩展
-
定义了以下扩展
- `is` 全局 HTML 属性
-
允许您指定一个标准 HTML 元素应表现得像一个已注册的自定义内置元素。
- `Document.createElement()` 方法的 "is" 选项
-
允许您创建一个行为类似于给定已注册的自定义内置元素 的标准 HTML 元素的实例。
- CSS 伪类
-
与自定义元素特别相关的伪类
:defined-
匹配所有已定义的元素,包括内置元素和使用 `CustomElementRegistry.define()` 定义的自定义元素。
:host-
选择包含 CSS 的 Shadow DOM 的 Shadow Host。CSS 在其中使用。
:host()-
选择包含 CSS 的 Shadow DOM 的 Shadow Host。CSS 在其中使用(因此您可以从 Shadow DOM 内部选择一个自定义元素)——但前提是作为函数参数给出的选择器与 Shadow Host 匹配。
:host-context()-
选择包含 CSS 的 Shadow DOM 的 Shadow Host。CSS 在其中使用(因此您可以从 Shadow DOM 内部选择一个自定义元素)——但前提是作为函数参数给出的选择器与 Shadow Host 在 DOM 层级结构中的祖先匹配。
:state()-
匹配处于特定自定义状态的自定义元素。更准确地说,它匹配在元素 `CustomStateSet` 中存在指定状态的匿名自定义元素。
- CSS 伪元素
-
与自定义元素特别相关的伪元素
::part-
代表 Shadow Tree 中具有匹配 `part` 属性的任何元素。
Shadow DOM
ShadowRoot-
代表 Shadow DOM 子树的根节点。
- `Element` 扩展
-
与 Shadow DOM 相关的 `Element` 接口的扩展
- `Element.attachShadow()` 方法将 Shadow DOM 树附加到指定的元素上。
- `Element.shadowRoot` 属性返回附加到指定元素的 Shadow Root,如果未附加 Shadow Root,则返回 `null`。
- 相关的 `Node` 附加项
-
与 Shadow DOM 相关的 `Node` 接口的附加项
- `Node.getRootNode()` 方法返回上下文对象的根,如果可用,还可以选择性地包括 Shadow Root。
- `Node.isConnected` 属性返回一个布尔值,指示该节点是否(直接或间接)连接到上下文对象,例如,在普通 DOM 的情况下是 `Document` 对象,在 Shadow DOM 的情况下是 `ShadowRoot`。
- `Event` 扩展
-
与 Shadow DOM 相关的 `Event` 接口的扩展
Event.composed-
如果事件将穿过 Shadow DOM 边界传播到标准 DOM,则返回 `true`,否则返回 `false`。
Event.composedPath-
返回事件的路径(将调用监听器的对象)。如果 Shadow Root 是以 `ShadowRoot.mode` closed 创建的,则不包括 Shadow Tree 中的节点。
HTML 模板
<template>-
包含一个 HTML 片段,该片段在包含文档初始加载时不会渲染,但可以在运行时使用 JavaScript 显示,主要用作自定义元素结构的基��。相关的 DOM 接口是 `HTMLTemplateElement`。
<slot>-
Web Component 中的一个占位符,您可以用自己的标记填充,这允许您创建独立的 DOM 树并将它们一起呈现。相关的 DOM 接口是 `HTMLSlotElement`。
- `slot` 全局 HTML 属性
-
将 Shadow DOM Shadow Tree 中的一个插槽分配给一个元素。
Element.assignedSlot-
一个只读属性,返回一个对元素插入的 `
` 的引用。 Text.assignedSlot-
一个只读属性,返回一个对该文本节点插入的 `
` 的引用。 - `Element` 扩展
-
与插槽相关的 `Element` 接口的扩展
Element.slot-
返回附加到元素的 Shadow DOM 插槽的名称。
- CSS 伪元素
-
与插槽特别相关的伪元素
::slotted-
匹配插入到插槽中的任何内容。
- `slotchange` 事件
-
当 `
` 元素中的节点发生变化时,在 `HTMLSlotElement` 实例(` ` 元素)上触发。
示例
我们正在我们的 web-components-examples GitHub 仓库中构建一系列示例。随着时间的推移,还会添加更多示例。
规范
| 规范 |
|---|
| HTML # the-template-element |
| DOM # interface-shadowroot |
浏览器兼容性
html.elements.template
加载中…
api.ShadowRoot
加载中…