新聞中心
前言
- ……
等等這些標簽,看起來似乎很簡單,可為什么可以展現(xiàn)出那么豐富復雜的布局?當時我給自己的解釋是:這些標簽都是系統(tǒng)控制渲染的。

作為一家“創(chuàng)意+整合+營銷”的成都網(wǎng)站建設(shè)機構(gòu),我們在業(yè)內(nèi)良好的客戶口碑。創(chuàng)新互聯(lián)公司提供從前期的網(wǎng)站品牌分析策劃、網(wǎng)站設(shè)計、成都做網(wǎng)站、成都網(wǎng)站建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、創(chuàng)意表現(xiàn)、網(wǎng)頁制作、系統(tǒng)開發(fā)以及后續(xù)網(wǎng)站營銷運營等一系列服務(wù),幫助企業(yè)打造創(chuàng)新的互聯(lián)網(wǎng)品牌經(jīng)營模式與有效的網(wǎng)絡(luò)營銷方法,創(chuàng)造更大的價值。
現(xiàn)在想想,那么解釋好像有點道理,但終歸沒有涉及到本質(zhì)原因,專家級的解釋應(yīng)該是:以上這些元素都是以組件的方式存在,所展現(xiàn)出來的那些布局都是在組件內(nèi)部定義好的,如果頁面引用了這些元素標簽,那它內(nèi)部的布局都會渲染在頁面上。
在介紹 Web Components 時講到,它的第二項技術(shù)規(guī)范為 Shadow DOM。通過了解 Shadow DOM 的相關(guān)知識,或許可以解開上面的疑惑。
查看默認組件的 Shadow DOM
有人可能疑惑,既然說文章開頭列舉的那些元素是組件,那為什么我在開發(fā)者工具中看到的結(jié)構(gòu)是這樣的:
有什么辦法可以看到各個組件內(nèi)部的 DOM 結(jié)構(gòu)嗎?答案是有的,步驟如下:
第一步:打開開發(fā)者工具,點擊右上角的設(shè)置圖標:
第二步:找到偏好設(shè)置-元素,然后對 “顯示用戶代理 Shadow DOM” 進行選中:
這時候,我們再查看那些默認組件的內(nèi)部結(jié)構(gòu),如下所示:
可以看到,這些默認標簽下都包含一個 “shadow root” 而在 shadow root 中包含的是具體布局:
一個看似簡簡單單的 audio 元素,里面的布局還蠻復雜的。這不禁讓我想到一句話:功夫都在舞臺外。
在上面的截圖中,我們看到了 “shadow root” ,它其實是 Shadow DOM 的一部分。
Shadow DOM 的概念
在介紹概念之前,我們先來看看 “shadow” 這個單詞的中文釋義:
Shadow DOM,翻譯過來就是“影子 DOM” 。
影子當然都是藏在暗處,不容易讓人發(fā)現(xiàn)的,就像文章開頭提到的那些默認元素,如果不通過設(shè)置,我們表面上看到的就是簡單的一個標簽而已。
專業(yè)的解釋就是:Shadow DOM 是 HTML 的一個規(guī)范 ,它允許瀏覽器開發(fā)者封裝自己的HTML 標簽、CSS 樣式和特定的 Javascrip 代碼,同時也可以讓開發(fā)人員創(chuàng)建類似 這樣的自定義標簽。
Shadow DOM 的意義
“組件化”備受追捧的原因自然是因為它獨特的魅力,我們只需要將定義好的組件通過簡單的一組標簽引入頁面,就可以得到預(yù)定好的效果,并且可以在多處使用。
而 Shadow DOM 能在 Web Components 體系中占據(jù)重要的地位,是因為其具有良好的密封性,主要表現(xiàn)在:
- 隱藏標記、樣式和行為;
- 保持代碼隔離,保證頁面的干凈整潔,各組件內(nèi)部代碼互不影響;
- 隱藏實現(xiàn)細節(jié),便于使用更強大的語法或功能。
這就意味著,如果我們使用了 Shadow DOM,那就可以在它內(nèi)部隨意的發(fā)揮,而不必擔心這些發(fā)揮會影響到頁面的其他部分,變相地給了開發(fā)人員極大的自由。
想想曾經(jīng)小心翼翼地定義樣式、綁定事件的時光吧,懷念嗎?
Shadow DOM 結(jié)構(gòu)
Shadow DOM 允許將隱藏的 DOM 樹附加到常規(guī)的 DOM 樹中——它以 Shadow root 節(jié)點為起始根節(jié)點,在這個根節(jié)點的下方,可以是任意元素,和普通的 DOM 元素一樣,借用網(wǎng)上的一張圖片:
下面是我根據(jù)自己的理解畫出來的:
大家根據(jù)自己喜好,看哪一張更容易理解就對著哪張看,都無所謂的。對應(yīng)到實際的文檔中,其結(jié)構(gòu)如下:
在以上的結(jié)構(gòu)圖中,我們看到了幾個陌生的名詞,包括我們在之前看到的 “shadow root”,它們都是 Shadow DOM 的術(shù)語,接下來我解釋一下它們各自的含義。
Shadow DOM 術(shù)語
Shadow host
一個常規(guī) DOM節(jié)點,Shadow DOM 會被附加到這個節(jié)點上。
Shadow tree
Shadow DOM內(nèi)部的DOM樹。
Shadow boundary
Shadow DOM 分界線。Shadow DOM 結(jié)束的地方,也是常規(guī) DOM 開始的地方。
Shadow root
Shadow tree 的根節(jié)點。
用法
掛載 Shadow DOM
可使用 Element.attachShadow() 方法給指定的元素掛載一個Shadow DOM,并且返回對 ShadowRoot 的引用。
let hostEle = document.getElementById("myCard");
let shadowroot = hostEle.attachShadow({mode: "open"});
控制 Shadow DOM
你可以使用同樣的方式來操作 Shadow DOM,就和操作常規(guī) DOM 一樣——例如添加子節(jié)點、設(shè)置屬性,以及為節(jié)點添加自己的樣式(例如通過 element.style 屬性),或者為整個 Shadow DOM 添加樣式(例如在


咨詢
建站咨詢