了解 Shadow DOM v1
栏目: JavaScript · 发布时间: 5年前
内容简介:原文地址:Shadow DOM 的诞生是为了解决样式冲突和选择器失效的问题。它类似于一种新的 DOM 节点,或者说它可以封装了 HTML,可以用于封装一些小的组件,比如一个表单提交,我们可以创建一个 shadow 然后独立的完整的呈现一个表单组件,而它不受外界影响。创建一个 shadow dom 使用
原文地址: Understanding Shadow DOM v1
Shadow DOM 的诞生是为了解决样式冲突和选择器失效的问题。它类似于一种新的 DOM 节点,或者说它可以封装了 HTML,可以用于封装一些小的组件,比如一个表单提交,我们可以创建一个 shadow 然后独立的完整的呈现一个表单组件,而它不受外界影响。
创建一个 shadow dom 使用 Element.attachShadow()
<div id="host"><p>Default text</p></div> <script> const elem = document.querySelector('#host'); // attach a shadow root to #host const shadowRoot = elem.attachShadow({mode: 'open'}); // create a <p> element const p = document.createElement('p'); // add <p> to the shadow DOM shadowRoot.appendChild(p); // add text to <p> p.textContent = 'Hello!'; </script> <!-- 其中不是每一种标签都可以用于创建 shadow dom 的,上面是在 div 里头创建,像 img 就无法,会报错。 然后 attachShadow() 传入一个对象参数,其他 mode: 'open'/'closed' 两种可选,这是 V1 添加的新特性,是必要属性。 当 mode: 'closed' 时,是无法通过 elem.shadowRoot 去获取 shadow dom 元素的,因为这时候它是一个 null 像上述代码的话, elem.shadowRoot 直接就指向我们定义的变量 shadowRoot --> 复制代码
样式问题
// shadowRoot 为创建的 shadow dom 元素 shadowRoot.innerHTML = ` <p>Shadow DOM</p> <style>p {color: red;}</style>` // 或者这样 shadowRoot.innerHTML = ` <p>Shadow DOM</p> <link rel="stylesheet" href="style.css">` // 然后我们是可以通过 给 shadow dom 元素设置样式通过继承去影响 shadow dom 里面的元素样式的 shadowRoot.innerHTML = ` <p>Shadow DOM</p> <style>#host {color: red;}</style>` // 这样通过样式继承,p 标签的内容颜色也是红色的 // 可以通过 #root { all: initial; } 解决 复制代码
自定义标签也可以用 shadow dom
<my-element></my-element> <script> class MyElement extends HTMLElement { constructor() { // must be called before the this keyword super(); // attach a shadow root to <my-element> const shadowRoot = this.attachShadow({mode: 'open'}); shadowRoot.innerHTML = ` <style>p {color: red}</style> <p>Hello</p>`; } } // register a custom element on the page customElements.define('my-element', MyElement); // 注意自定义元素的名字不能是单个单词,my-element 可以,myelement 不行! </script> 复制代码
事件触发问题
<div id="host"></div> <script> const elem = document.querySelector('#host'); const shadowRoot = elem.attachShadow({mode: 'open'}); shadowRoot.innerHTML = ` <ul> <li>One</li> <li>Two</li> <li>Three</li> <ul> `; document.addEventListener('click', (event) => { console.log(event.target); }, false); // 当你点击 shadow dom 内的元素时,它会通过冒泡触发 #host 的 div 元素,你无法知道是容器里面的具体那个元素点击了 shadowRoot.querySelector('ul').addEventListener('click', (event) => { console.log(event.target); }, false); // 这样就 ok </script> 复制代码
shadow dom v0 是谷歌浏览器的规范,现在是 v1 版本,火狐和谷歌都有版本全面支持了,苹果的嘛就只是部分支持,巨硬家的就还没支持这个特性,就目前来说哈。
shadow dom 是 Web Components 的三个主要技术之一。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 你了解HTTPS,但你可能不了解X.509
- 你真的了解Mybatis的${}和#{}吗?是否了解应用场景?
- 你所了解的 array_diff_uassoc 真的是你了解的那样吗?
- 图文了解 Kubernetes
- 深入了解 JSONP
- 一文了解 Kubernetes
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
API Design for C++
Martin Reddy / Morgan Kaufmann / 2011-2-18 / USD 59.95
The design of application programming interfaces can affect the behavior, capabilities, stability, and ease of use of end-user applications. With this book, you will learn how to design a good API for......一起来看看 《API Design for C++》 这本书的介绍吧!