什么是shadow dom?

顾名思义, shadow-dom,直译的话就是 影子/隐蔽处的dom ?我觉得可以理解为潜藏在背后的 DOM 结构,也就是我们无法直接控制操做的 DOM 结构。

它相当于一个作用域的概念,使其不会被外部所影响。可以把它理解成一颗单独的dom树。这样就不会有css的命名冲突或者样式的意外泄漏。
在chrome里,我们可以启用开发者工具的“Show user agent shadow DOM”选项,就能看到这些隐藏的结构。

举例:
video标签: 虽然我们创建的是一个空标签,但是在这个空标签内部,存在一个 shadow-dom ,点开 shadow-dom 可以看到里面的内容。其实这内部的具体内容,就是 的具体实现。

shadow DOM视为“DOM中的DOM”。它是独立的DOM树,具有自己的元素和样式,与原始DOM完全隔离。可以应用在组件中。

在一些微前端框架,例如qiankun的源码时,发现qiankun在实现css样式的隔离时,使用了shadow DOM

有什么特点?

可以使用和操作常规 DOM 一样的方式来操作 Shadow DOM,例如添加子节点、设置属性,以及为节点添加自己的样式
Shadow DOM 内部的元素始终不会影响到它外部的元素(除了 :focus-within),这为封装提供了便利。

有什么用?

1、良好的封装性,对于通用的组件来说,我们作为开发者,其实并不需要关心内部很多元素的实现或原理,比如我们在页面中使用 video 标签,其实对于暂停,播放,拖动滚动条等逻辑并不需要做过多的关心,那么我们希望代码越简洁越好,就像现在一样,只需要一个video标签即可,而不是还要写一堆元素来实现本身的播放暂停等按钮
2、现行的组件都是开放式的,即最终生成的 HTML DOM 结构难以与组件外部的 DOM 进行有效结构区分,样式容易互相混淆。Shadow-dom 的 封装隐藏性为我们提供了解决这些问题的方法。

为什么需要 shadow-dom?

Shadow-dom 是游离在 DOM 树之外的节点树,但是他的创建基于普通 DOM 元素(非 document),并且创建后的 Shadow-dom 节点可以从界面上直观的看到。更重要的是,Shadow-dom 具有良好的密封性。这是浏览器提供的一种“封装”功能,提供了一种强大的技术去隐藏一些实现细节
怎么创建shadow dom?
要创建一个shadow DOM。首先我们需要一个Shadow root,Shadow root 是 shadow 树中最顶层的节点, 是在创建 shadow DOM 时被附加到常规DOM节点的内容。具有与之关联的shadow root的节点称为shadow host。(如下图所示)

像上图,shadowHost就是div.shadow-dom。这个外层的css会影响到他。(要注意:css样式的边界影响,就是不要给shadowhost或者他的父级定义可以遗传的样式,可以用all: initial还原)。

使用 attachShadow 创建shadowDom:
let shadow = element.attachShadow({mode: ‘open’});
let shadow = element.attachShadow({mode: ‘closed’});
open / closed 表示可否通过页面内的 JavaScript 方法来获取 Shadow DOM

创建shadow DOM需要注意以下几点:
1.只有封闭标签才能作为shadowHost。
2.当我们把一个标签设置成shadow DOM的时候,里面的子元素将全部失效。
3.当mode为closed时,禁止你使用host元素的shadowRoot属性从root外部访问shadow root的元素。
如何修改shadow dom的样式?
1、在shadow块下面创建style标签,在里面添加样式
2、mode为true时,通过shadowRoot获取到指定元素修改样式
试试?
示例中有两个div的className都是cn,一个在普通dom中,一个在shadowDom中。可以看到两个style标签下的cn样式互不影响

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.cn {color: red;}.shadow-dom {/* 可继承 */background-color: yellow;text-indent: 2em;/* 将所有css属性恢复到初始状态 */all: initial;}</style>
</head>
<body><div class="wrapper"><div class="cn">dom</div><div class="shadow-dom">test</div></div>
</body>
<script>const shadowHost = document.querySelector('.shadow-dom');const shadowRoot = shadowHost.attachShadow({mode: 'open'});const div = document.createElement('div');div.innerHTML = "shdow-dom";div.className = 'cn'div.setAttribute('part', 'native')const style = document.createElement('style');style.textContent = `.cn {color: blue;}`;shadowRoot.appendChild(style)shadowRoot.appendChild(div)// shadowHost.shadowRoot.querySelector('.cn').style.color = 'green'console.log('shadowRoot', shadowHost.shadowRoot)</script>
</html>

shadow-dom 的未来

现行的组件都是开放式的,即最终生成的 HTML DOM 结构难以与组件外部的 DOM 进行有效结构区分,样式容易互相混淆。Shadow-dom 的 封装隐藏性为我们提供了解决这些问题的方法。在 Web 组件化的规范中也可以看到 Shadow-dom 的身影,使用具有良好密封性的 Shadow-dom 开发下一代 Web 组件将会是一种趋势。

浅谈shadow dom相关推荐

  1. 前端类名优秀命名例子_这是一篇需要花费你15分钟阅读的干货!浅谈前端工程化...

    01前端工程化的背景 随着业务的扩展.业务需求更加复杂.项目团队的壮大以及项目的增多等.制定一套适用于团队的前端工程化方案很有必要. 02前端工程化是什么 前端工程化是一个很广泛的话题.涉及的技术与解 ...

  2. 【浅谈DOM事件的优化】

    浅谈DOM事件的优化 在 JavaScript 程序的开发中,经常会用到一些频繁触发的 DOM 事件,如 mousemove.resize,还有不是那么常用的鼠标滚轮事件:mousewheel (在 ...

  3. 浅谈Vue中的虚拟DOM

    Virtual DOM 是JavaScript按照DOM的结构来创建的虚拟树型结构对象,是对DOM的抽象,比DOM更加轻量型 为啥要使用Virtual DOM 当然是前端优化方面,避免频繁操作DOM, ...

  4. dom影像图形成数字地形图_浅谈数字正射影像图(DOM)的生产技术

    浅谈数字正射影像图 (DOM) 的生产技术 杜 磊 [摘 要] 摘 要 : 利用航空摄影像片和遥感卫片生产制作正射影像图 , 是地形图测 绘方法的又一技术 , 它补充和完善地形图所有的缺陷 , 制作的 ...

  5. JavaScript 浅谈DOM节点层次:Text /Coment等类型

    浅谈DOM其他节点层次:Text .Coment. 一.Text类型--文本 Text类型表示纯文本内容,其特性有 nodeType == 3  ;  nodeName == "#text& ...

  6. 浅谈dom操作removechild()

    浅谈dom操作removechild() 作为一个从ui设计转向前端的小白,之前一直是在对自己设计的界面写html和css,极少去写js,刚刚把盒子模型和响应式布局这一块的东西有了一点理解,又开始学习 ...

  7. rsync命令_浅谈利用rsync服务的攻击

    本文将根据针对Linux操作系统上不安全的Rsync配置,浅谈如何利用rsync服务进行攻击. 1.什么是RSYNC? Rsync是用于在两个服务器(通常是Linux)之间传输和同步文件的实用程序.它 ...

  8. 浅谈WebKit之Port

    WebKit作为一个浏览器引擎,其相对于Gecko而言一个较大的特点就是便于移植,嵌入到其他程序中,目前大家已了解使用WebKit引擎的应用包括Safari.iPhone.Chrome.Android ...

  9. 浅谈WebKit之JavaScriptCore/V8

    WebKit作为一个浏览器引擎,其中Javascript实现包括JavaScriptCore和V8,为了能更全面的了解WebKit,我们需要深入的了解Javascript实现的基本原理.其在WebKi ...

  10. 浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别

    举例浅谈JQuery中$('.classname').get(0); $('.classname').eq(0); $('.classname')[0]三者的区别 demo Dom结构: <di ...

最新文章

  1. centos6.9配置LAMT页面500错误解决
  2. 怎样用Jenkins触发还有一个Jenkins---Global build solution
  3. Winsock编程原理——面向连接
  4. dev里timeedit控件如何赋值_抽奖程序里的字节跳动模式和时长控制,让抽奖更有仪式感!...
  5. 2021.12.17自制望远镜调焦座材料
  6. 别瞎学了,这几门语言要被淘汰了!
  7. 前端与java绘制三维图_使用HTML5 Canvas绘制三维波浪图算法和实现
  8. C#绘制立体三维饼状图(超酷)
  9. Android WebView onReceivedTitle 方法不被调用的问题
  10. (3)redis.config配置文件详解
  11. Matlab画图线型、符号及颜色设置
  12. 【记录】【0】好的博客,待整理
  13. 谈逻辑与数学界线之淡化(修正版)
  14. 在gamit中对rinex3的转换
  15. 【问题解决】Ubuntu无法进入图形页面,全屏出现OK,而且屏幕不停闪烁
  16. n行Python代码系列:五行代码实现两个视频画中画播放
  17. 【C语言从青铜到王者】第零篇·与C语言来个约会
  18. sed搜索某行在行末追加_sed在行首或者行尾添加内容
  19. 华为云电脑+teamviewer ssh实现手机远程操控服务器
  20. CSS中的clear属性

热门文章

  1. [资源]--IOS捷径大全,众多实用小功能
  2. 计算机美食网页毕业论文,毕业论文--美食网页计与制作.doc
  3. 视频信号数字光纤传输 光纤传输让高清视频传输更简单
  4. FPGA 光纤传输IP核的使用
  5. 2021-11-07算法的本质是什么?
  6. 专业人员选择关键词的标准和原则
  7. 七、CICSO设备 路由器
  8. Mac实现ts文件转为mp4文件
  9. 解除隐藏文件cmd命令_cmd命令怎么隐藏电脑上的文件
  10. LabView学习之旅(2)labview基础编程