自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Web Components系列之認(rèn)識(shí) Shadow DOM

開發(fā) 前端
Shadow DOM 的主要作用就是其封裝的特性,使得各組件的內(nèi)部代碼互不干擾,提供一個(gè)安全的開發(fā)運(yùn)行環(huán)境。

前言

在初涉前端之時(shí),我就一直在好奇一個(gè)問題,為什么像:

  • <input/>
  • <select></select>
  • <audio></audio>
  • <video></video>
  • ……

等等這些標(biāo)簽,看起來似乎很簡(jiǎn)單,可為什么可以展現(xiàn)出那么豐富復(fù)雜的布局?當(dāng)時(shí)我給自己的解釋是:這些標(biāo)簽都是系統(tǒng)控制渲染的。

現(xiàn)在想想,那么解釋好像有點(diǎn)道理,但終歸沒有涉及到本質(zhì)原因,專家級(jí)的解釋應(yīng)該是:以上這些元素都是以組件的方式存在,所展現(xiàn)出來的那些布局都是在組件內(nèi)部定義好的,如果頁面引用了這些元素標(biāo)簽,那它內(nèi)部的布局都會(huì)渲染在頁面上。

在介紹 Web Components 時(shí)講到,它的第二項(xiàng)技術(shù)規(guī)范為 Shadow DOM。通過了解 Shadow DOM 的相關(guān)知識(shí),或許可以解開上面的疑惑。

查看默認(rèn)組件的 Shadow DOM

有人可能疑惑,既然說文章開頭列舉的那些元素是組件,那為什么我在開發(fā)者工具中看到的結(jié)構(gòu)是這樣的:

有什么辦法可以看到各個(gè)組件內(nèi)部的 DOM 結(jié)構(gòu)嗎?答案是有的,步驟如下:

第一步:打開開發(fā)者工具,點(diǎn)擊右上角的設(shè)置圖標(biāo):

第二步:找到偏好設(shè)置-元素,然后對(duì) “顯示用戶代理 Shadow DOM” 進(jìn)行選中:

這時(shí)候,我們?cè)俨榭茨切┠J(rèn)組件的內(nèi)部結(jié)構(gòu),如下所示:

可以看到,這些默認(rèn)標(biāo)簽下都包含一個(gè) “shadow root” 而在 shadow root 中包含的是具體布局:

一個(gè)看似簡(jiǎn)簡(jiǎn)單單的 audio 元素,里面的布局還蠻復(fù)雜的。這不禁讓我想到一句話:功夫都在舞臺(tái)外。

在上面的截圖中,我們看到了 “shadow root” ,它其實(shí)是 Shadow DOM 的一部分。

Shadow DOM 的概念

在介紹概念之前,我們先來看看 “shadow” 這個(gè)單詞的中文釋義:

Shadow DOM,翻譯過來就是“影子 DOM” 。

影子當(dāng)然都是藏在暗處,不容易讓人發(fā)現(xiàn)的,就像文章開頭提到的那些默認(rèn)元素,如果不通過設(shè)置,我們表面上看到的就是簡(jiǎn)單的一個(gè)標(biāo)簽而已。

專業(yè)的解釋就是:Shadow DOM 是 HTML 的一個(gè)規(guī)范 ,它允許瀏覽器開發(fā)者封裝自己的HTML 標(biāo)簽、CSS 樣式和特定的 Javascrip 代碼,同時(shí)也可以讓開發(fā)人員創(chuàng)建類似 這樣的自定義標(biāo)簽。

Shadow DOM 的意義

“組件化”備受追捧的原因自然是因?yàn)樗?dú)特的魅力,我們只需要將定義好的組件通過簡(jiǎn)單的一組標(biāo)簽引入頁面,就可以得到預(yù)定好的效果,并且可以在多處使用。

而 Shadow DOM 能在 Web Components 體系中占據(jù)重要的地位,是因?yàn)槠渚哂辛己玫拿芊庑?,主要表現(xiàn)在:

  • 隱藏標(biāo)記、樣式和行為;
  • 保持代碼隔離,保證頁面的干凈整潔,各組件內(nèi)部代碼互不影響;
  • 隱藏實(shí)現(xiàn)細(xì)節(jié),便于使用更強(qiáng)大的語法或功能。

這就意味著,如果我們使用了 Shadow DOM,那就可以在它內(nèi)部隨意的發(fā)揮,而不必?fù)?dān)心這些發(fā)揮會(huì)影響到頁面的其他部分,變相地給了開發(fā)人員極大的自由。

想想曾經(jīng)小心翼翼地定義樣式、綁定事件的時(shí)光吧,懷念嗎?

Shadow DOM 結(jié)構(gòu)

Shadow DOM 允許將隱藏的 DOM 樹附加到常規(guī)的 DOM 樹中——它以 Shadow root 節(jié)點(diǎn)為起始根節(jié)點(diǎn),在這個(gè)根節(jié)點(diǎn)的下方,可以是任意元素,和普通的 DOM 元素一樣,借用網(wǎng)上的一張圖片:

下面是我根據(jù)自己的理解畫出來的:

大家根據(jù)自己喜好,看哪一張更容易理解就對(duì)著哪張看,都無所謂的。對(duì)應(yīng)到實(shí)際的文檔中,其結(jié)構(gòu)如下:

在以上的結(jié)構(gòu)圖中,我們看到了幾個(gè)陌生的名詞,包括我們?cè)谥翱吹降?“shadow root”,它們都是 Shadow DOM 的術(shù)語,接下來我解釋一下它們各自的含義。

Shadow DOM 術(shù)語

Shadow host

一個(gè)常規(guī) DOM節(jié)點(diǎn),Shadow DOM 會(huì)被附加到這個(gè)節(jié)點(diǎn)上。

Shadow tree

Shadow DOM內(nèi)部的DOM樹。

Shadow boundary

Shadow DOM 分界線。Shadow DOM 結(jié)束的地方,也是常規(guī) DOM 開始的地方。

Shadow root

Shadow tree 的根節(jié)點(diǎn)。

用法

掛載 Shadow DOM

可使用 Element.attachShadow() 方法給指定的元素掛載一個(gè)Shadow DOM,并且返回對(duì) ShadowRoot 的引用。

let hostEle = document.getElementById("myCard");
let shadowroot = hostEle.attachShadow({mode: "open"});

控制 Shadow DOM

你可以使用同樣的方式來操作 Shadow DOM,就和操作常規(guī) DOM 一樣——例如添加子節(jié)點(diǎn)、設(shè)置屬性,以及為節(jié)點(diǎn)添加自己的樣式(例如通過 element.style 屬性),或者為整個(gè) Shadow DOM 添加樣式(例如在<style>元素內(nèi)添加樣式)。不同的是,Shadow DOM 內(nèi)部的元素始終不會(huì)影響到它外部的元素(除了 :focus-within 元素內(nèi)添加樣式),這為封裝提供了便利。

注意事項(xiàng)

如果一個(gè)元素底下已經(jīng)有一個(gè) Shadow DOM 掛載,繼續(xù)給它掛載的話,會(huì)報(bào)錯(cuò):

結(jié)束語

Shadow DOM 的主要作用就是其封裝的特性,使得各組件的內(nèi)部代碼互不干擾,提供一個(gè)安全的開發(fā)運(yùn)行環(huán)境。

關(guān)于 Shadow DOM 的基本概念就先介紹這么多,接下來將介紹它的操作方法。



責(zé)任編輯:武曉燕 來源: 編程三昧
相關(guān)推薦

2022-02-09 20:20:30

瀏覽器組件化網(wǎng)頁

2014-05-26 16:29:12

Shadow DomWeb Compone

2020-09-28 14:26:42

Shadow DOMWeb組件

2014-05-26 16:16:59

Shadow DomWeb Compone

2022-02-16 08:12:03

組件樣式元素

2011-08-08 22:10:17

2024-02-26 09:13:35

WebComponents開源項(xiàng)目

2022-02-18 08:10:43

MyCardTemplates布局

2014-05-26 15:35:55

Web組件Web Compone

2016-12-13 15:41:40

JavaHashMap

2011-07-04 14:51:53

2023-11-03 08:04:47

Web微前端框架

2022-02-25 10:44:38

Web前端框架

2018-06-19 08:18:45

影子IT網(wǎng)絡(luò)安全IT安全

2014-05-19 10:55:12

Web組件Web Compone

2010-06-23 09:14:15

Widget開發(fā)

2024-11-12 13:34:25

2019-05-21 14:33:01

2014-05-26 17:26:16

Web ComponeGMU

2025-03-27 03:30:00

Web框架組件
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)