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
載入中…