Shadow DOM 样式封装
Shadow DOM styles encapsulation
我想创建一个 Chrome 扩展,它将一个小部件注入网页。
我的小部件在任何页面上注入时必须具有一致的样式。 Afaik,实现此目的的最佳方法是使用 Shadow DOM.
似乎是设计使 Shadow DOM 样式继承自父页面样式。必须对宿主元素使用 all:initial
CSS 属性 以防止父页面的样式泄漏到阴影 DOM 样式中。
所以,我有一个示例代码:
(function addWidget() {
let rootEl = document.querySelector('body');
let mount = document.createElement('div');
rootEl.appendChild(mount);
let shadowRoot = mount.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<style>
:host {
all: initial;
}
div {
position: fixed;
z-index: 2147483647;
border: 1px solid black;
padding: 30px;
font-size: 30px;
background: tomato;
top: 10px;
right: 10px;
}
</style>
<div>Shadow DOM</div>
`;
}());
如果您打开 Chrome 的开发工具并在控制台中执行此代码,它将在大多数网站上按预期工作。但在某些网站上(如 reddit.com),样式仍然继承自父页面。
我必须进行哪些更改才能确保小部件的样式在所有网页上保持一致。
wOxxOm 给出了正确答案:
Use mount.style.cssText='all:initial' instead of :host
我想创建一个 Chrome 扩展,它将一个小部件注入网页。
我的小部件在任何页面上注入时必须具有一致的样式。 Afaik,实现此目的的最佳方法是使用 Shadow DOM.
似乎是设计使 Shadow DOM 样式继承自父页面样式。必须对宿主元素使用 all:initial
CSS 属性 以防止父页面的样式泄漏到阴影 DOM 样式中。
所以,我有一个示例代码:
(function addWidget() {
let rootEl = document.querySelector('body');
let mount = document.createElement('div');
rootEl.appendChild(mount);
let shadowRoot = mount.attachShadow({mode: 'open'});
shadowRoot.innerHTML = `
<style>
:host {
all: initial;
}
div {
position: fixed;
z-index: 2147483647;
border: 1px solid black;
padding: 30px;
font-size: 30px;
background: tomato;
top: 10px;
right: 10px;
}
</style>
<div>Shadow DOM</div>
`;
}());
如果您打开 Chrome 的开发工具并在控制台中执行此代码,它将在大多数网站上按预期工作。但在某些网站上(如 reddit.com),样式仍然继承自父页面。
我必须进行哪些更改才能确保小部件的样式在所有网页上保持一致。
wOxxOm 给出了正确答案:
Use mount.style.cssText='all:initial' instead of :host