了解 Shadow DOM v1
栏目: JavaScript · 发布时间: 6年前
内容简介:原文地址: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
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro Django
Marty Alchin / Apress / 2008-11-24 / USD 49.99
Django is the leading Python web application development framework. Learn how to leverage the Django web framework to its full potential in this advanced tutorial and reference. Endorsed by Django, Pr......一起来看看 《Pro Django》 这本书的介绍吧!