程序员

解释 shadow dom(上)

2019-02-26  本文已影响26人  zidea

ShadowDOM最大的用处应该是隔离外部环境用于封装组件。我们可以轻松地封装一个组件然后可以跨项目共享这个组件。样式也被封装,我们甚至可以不用写CSS 样式完全在我们的组件中,这样就防止开发人员随意修改样式


social-isolation-apex-nc.jpg

我们创建通知组件给大家说明一下 shadow dom,下面代码我就不多解释了

<div id="notificaton">
    <p>Lorem ipsum dolor sit amet.</p>
   <button>确定</button>
</div>
001.JPG

然后当我们通过id获取元素,然后调用元素的 createShadowRoot 方法来获取 shadow dom,这样一下我们的notification 就不见了。

var shadow = document.querySelector('#notificaton').createShadowRoot();

然后我们 html 赋值给shadow dom 的 innerHTML 的属性,我们界面就又回来了

 shadow.innerHTML = `
        <p>Lorem ipsum dolor sit amet.</p>
        <button>确定</button>
        `

在 html 字符串中我们还可以添加样式 <style>p { color: blue; }</style>

<script>
        var shadow = document.querySelector('#notificaton').createShadowRoot();
        shadow.innerHTML = `
        <style>p { color: blue; }</style>
        <p>Lorem ipsum dolor sit amet.</p>
        <button>确定</button>
        `
    </script>
sd-007.JPG sd-008.JPG
 var notificaton = document.getElementById('notificaton');
        var shadowroot = notificaton.createShadowRoot();
        shadowroot.innerHTML = `
        <content select="p">Lorem ipsum dolor sit amet.</content>
        <button>确定</button>
        `
sd-003.JPG

这里介绍一个:host 伪选择器,通过 :host 可以选择 shadow 下面的

var notificaton = document.getElementById('notificaton');
            var shadowroot = notificaton.createShadowRoot();
            shadowroot.innerHTML = `
        <style>:host {
            font-weight: bold;
            color:blue;
        }</style>
        <content select="span">Lorem ipsum dolor sit amet.</content>
        <button>确定</button>
        `

这里有两个语法已经过时,这里支出一下

<p>Lorem ipsum dolor sit amet.</p>
    <div id="notificaton">
            <h2>消息标题</h2>
            <p>消息内容</p>  
            <button>确定</button>
    </div>
    <script>
        var notificaton = document.getElementById('notificaton');
            var shadowroot = notificaton.attachShadow({mode:'open'});
            // shadowroot.appendChild(document.getElementById('notification-content').content.cloneNode(true));
            shadowroot.innerHTML = `
        <style>
            :host { color: blue; }
        </style>
            <slot>
        
        `
sd-009.JPG
 <p>Lorem ipsum dolor sit amet.</p>
    <div id="notificaton">
        <h2 slot="header">消息标题</h2>
        <p slot="body">消息内容</p>  
        <button>确定</button>
    </div>
    <script>
        var notificaton = document.getElementById('notificaton');
            var shadowroot = notificaton.attachShadow({mode:'open'});
            // shadowroot.appendChild(document.getElementById('notification-content').content.cloneNode(true));
            shadowroot.innerHTML = `
        <style>
            :host { color: blue; }
        </style>
            <slot name="body"></slot>
            <slot name="header"></slot>
            <slot>
        `
上一篇下一篇

猜你喜欢

热点阅读