鲜荣彬
Herry

Shadow DOM

  1、在浏览器中的表现形式

    以video为例,如下代码:

<video controls autoplay name="media" width="500">
  <source id="mp4" src="#" type="video/mp4">
</video>

    如果不对浏览器任何设置操作,渲染生成的代码和上面的代码分毫不差。

    然后打开Chrome的开发者模式,在 setting 中勾选显示显示 shadow DOM。

         

     浏览器中的渲染结果如下:

        

       可以发现,在<video>标签中多了一个包裹的对象, #shadow-root。

   2、定义

       Shadow DOM 允许在 document渲染时插入一个DOM子树,但这棵子树不在DOM主树中。

       #shadow-root 被成为影子根,而外层的video此时被成为 影子宿主(shadow host)。

       #shadow-root可以嵌套, 形成影子树(shadow trees).

       影子树对其中的HTML,CSS,JS 有选择性的进行渲染。

   3、如何创建

      最简单的例子如下:

<div id="hostDiv">
  I love you
</div>

<script type="text/javascript">
  let hostDiv = document.getElementById('hostDiv');
  let shadow = hostDiv.createShadowRoot(); // hostDiv.attachShadow({ mode: 'open'})
  shadow.innerHTML = '<a href="#">baidu</a>';
</script>

   4、如何修改影子元素的样式

    为了保证影子宿主和影子根 之间样式互不侵袭,他们之间存在影子边界(shadow boundary).

    <template>

      此标签在使用前不会被渲染,不会执行加载等操作。

      也能够实现隐藏标签内容,位置任意。 

    <content>

          web组件技术套件废弃的部分。

      select属性告诉<content>有选择性的插入内容。 

          使用CSS选择器选取要展示的内容。

    <slot>

      自定义web组件的占位符。

      属性 name,指插槽名字。

    参考 w3c标准

<div id="hostDiv">
  <i id="c1">first</i>
  <i class="c2">second</i>
</div>

<template id="template">
  <content select="#c1"></content> I  love you<br>
  <content select=".c2"></content> you love me
</template>
<script type="text/javascript">
  let hostDiv = document.getElementById('hostDiv');
  let shadow = hostDiv.createShadowRoot();
  shadow.appendChild(document.importNode(template.content,true))
</script>
使用 content 完成 ShadowDOM
<div id="hostDiv">
  <i slot="c1">first</i>
  <i slot="c2">second</i>
</div>

<template id="template">
  <slot name="c1"></slot> I  love you<br>
  <slot name="c2"></slot> you love me
</template>
<script type="text/javascript">
  let hostDiv = document.getElementById('hostDiv');
  let shadow = hostDiv.attachShadow({   mode: "open"});
  shadow.appendChild(document.importNode(template.content,true))
</script>
使用 slot 完成 ShadowDOM

    

Angular ViewEncapsulation

  提供模版和CSS样式使用的样式封装策略。

  官方上的解释:

    ViewEncapsulation.Native:使用 Shadow DOM。它只在原生支持 Shadow DOM 的平台上才能工作。

    ViewEncapsulation.Emulated:使用垫片(shimmed) CSS 来模拟原生行为。

    ViewEncapsulation.None: 使用全局样式,没有任何视图包装。

     ViewEncapsulation.None:使用全局 CSS,不做任何封装。

  默认编译器是 Emulated。

posted on 2019-06-04 15:15  Herry彬  阅读(1029)  评论(0)    收藏  举报