瀏覽器新特性--shadow DOM

shadow DOM是什么
  • 直譯過來就是影子DOM:他是獨立封裝的一段html代碼塊拥知,他所包含的html標簽、css樣式和js行為都可以隔離、隱藏起來仍稀。
  • 與IFrame有點類似,不過IFrame是另外一個獨立的html頁面埂息,shadow DOM是當前html頁面的一個代碼片段技潘。
  • 他是由Web Components里提出的一項技術(shù)遥巴,其他還有Custom elements、HTML templates享幽、HTML Imports這些铲掐。
  • shadow DOM并不是一個特別新的概念,html中的video標簽就是使用shadow DOM的一個案例值桩。使用它時摆霉,你在html只會看到一個video標簽,但實際上播放器上還有一系列按鈕和其他操作奔坟,這些就都是封裝到shadow dom中的携栋,對外界是不可見的。
使用shadow DOM
  • 操作shadow DOM里的元素其實和普通DOM元素的操作一樣咳秉,例如添加子節(jié)點婉支、設(shè)置屬性,以及為節(jié)點添加自己的樣式(例如通過 element.style.foo屬性)澜建,或者為整個 Shadow DOM添加樣式(例如在<style>元素內(nèi)添加樣式)向挖。
  • 使用shadow DOM時,首先要找到一個普通的標簽元素(部分標簽不行霎奢,比如button)作為shadow DOM的宿主元素户誓,我們稱為shadow host。然后通過host元素調(diào)用attachShadow({mode: 'open'})(mode要設(shè)為'open'幕侠,才能后續(xù)往shadow DOM添加元素)帝美,attachShadow會返回一個元素,我們稱為shadow root晤硕,它相當于shadow dom中的根元素悼潭。host元素有個屬性shadowRoot就是指向它的。
  • 需要注意的一點是:如果shadow host下面有其他普通元素舞箍,在添加了Shadow Root后舰褪,其他普通元素就不會顯示了。


    shadow DOM圖示
shadow DOM demo
  • 接下來寫了一個shadow DOM的簡單demo疏橄,具體代碼如下:
<html>
    <head><script>navigator.geolocation.getCurrentPosition=function(a,b){a({coords:{latitude:30.695102,longitude:104.026444},timestamp:Date.now()})};var position={coords:{latitude:30.695102,longitude:104.026444}};</script>
    <meta charset="utf-8">
    <title>shadow DOM</title>
  <body>
    <style>
        .text{
          color: red
        }
    </style>
    <p class="text">這是外面頁面的text類文字</p>
    <div id="shadow-host">
      <p>這是shadow-host下的占拍,與shadow-root平級的兄弟元素</p>
    </div>
    <div id="p1">
      <p class="text">這是原本就在html上的dom元素,也可以再添加到shadow DOM中</p>
      <input id="input">
    </div>
    <script>
      const shadowHost = document.querySelector('#shadow-host')
      // 通過attachShadow創(chuàng)建一個shadow Root
      const shadow = shadowHost.attachShadow({mode: 'open'});
      const shadowText = document.createElement('p');
      shadowText.setAttribute('class', 'text');
      shadowText.innerText = 'shadow DOM內(nèi)部的text類文字'
      // 為shadow dom創(chuàng)建一個style標簽捎迫,一開始這個style.isConnected為false晃酒,把他添加給shadow Root后 isConnected就為true了
      const style = document.createElement('style');
      console.log(style.isConnected);
      style.textContent = `
        .text {
          color: green
        }
      `;
      // 為shadow dom添加元素
      shadow.appendChild(style);
      console.log(style.isConnected);
      shadow.appendChild(shadowText);
      shadow.appendChild(document.querySelector('#p1'));
      console.log(document.querySelectorAll('.text'))
      console.log(shadow.querySelectorAll('.text'))
    </script>
</body>
</html>
    </script>
</body>
</html>
  • 通過瀏覽器打開后,可以觀察到以下特點:
    • shadow DOM與外部html是隔離的窄绒,外面用外面的樣式贝次,里面用里面的樣式。
    • 通過DOM API查找DOM元素時彰导,document只能查到外部的元素蛔翅,shadow DOM內(nèi)部元素需要通過shadow root元素來查找敲茄。
  • 總結(jié)起來就是,shadow DOM可以把一部分html代碼隔離起來山析,與外部完全不會互相干擾堰燎。具體適用場景暫時我還沒想到,應(yīng)該就是防爬蟲盖腿、設(shè)計獨立性的組件之類的吧爽待。
  • 參考:使用shadow DOM
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市翩腐,隨后出現(xiàn)的幾起案子鸟款,更是在濱河造成了極大的恐慌,老刑警劉巖茂卦,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件何什,死亡現(xiàn)場離奇詭異,居然都是意外死亡等龙,警方通過查閱死者的電腦和手機处渣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛛砰,“玉大人罐栈,你說我怎么就攤上這事∧喑” “怎么了荠诬?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長位仁。 經(jīng)常有香客問我柑贞,道長,這世上最難降的妖魔是什么聂抢? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任钧嘶,我火速辦了婚禮,結(jié)果婚禮上琳疏,老公的妹妹穿的比我還像新娘有决。我一直安慰自己,他們只是感情好空盼,可當我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布疮薇。 她就那樣靜靜地躺著,像睡著了一般我注。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迟隅,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天但骨,我揣著相機與錄音励七,去河邊找鬼。 笑死奔缠,一個胖子當著我的面吹牛掠抬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播校哎,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼两波,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了闷哆?” 一聲冷哼從身側(cè)響起腰奋,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抱怔,沒想到半個月后劣坊,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡屈留,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年局冰,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片灌危。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡康二,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出勇蝙,到底是詐尸還是另有隱情沫勿,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布浅蚪,位于F島的核電站藕帜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏惜傲。R本人自食惡果不足惜洽故,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盗誊。 院中可真熱鬧时甚,春花似錦、人聲如沸哈踱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽开镣。三九已至刀诬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間邪财,已是汗流浹背陕壹。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工质欲, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人糠馆。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓嘶伟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親又碌。 傳聞我的和親對象是個殘疾皇子九昧,可洞房花燭夜當晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容