Set*_*ite 5 javascript google-chrome google-chrome-extension shadow-dom
我读过的所有内容都表明Shadow Dom从其父页面CSS开始是“安全的”。IE浏览器,如果我将所有div样式设置为紫色字体:
<style>
div{color: purple}
</style>
Run Code Online (Sandbox Code Playgroud)
我的Shadow Dom中的div应该具有浏览器的默认颜色。
我正在写一个chrome扩展名,它将html注入任何给定的页面。除非此html受Shadow Dom或Iframe保护,否则它将继承所有页面的CSS。
建议解决这个问题,这个问题,是使用暗影大教堂。因此,我实现了一个解决方案,但注意到它仍在继承页面的CSS。我以为这可能是在Chrome扩展程序中使用它时遇到的一个问题,所以我从一些Shadow Dom示例中劫持了jsBin(并把它扔到了另一个在线编码应用中以作很好的衡量)。
https://codepen.io/hyrumwhite/pen/xPRexQ
结果相同。我的影子DOM继承了页面CSS,我的div(奇怪的是我的h1)是紫色的。
似乎Shadow Dom中的子代将继承应用于host元素的任何样式。
这是按设计工作的吗?有办法防止这种情况吗?还是影子DOM足够新,以至于这是一个bug,我应该期待使用它时会遇到类似的bug?
Jos*_*Lee 11
继承的属性将照常继承。最好将阴影边界视为影响级联,即选择器的范围和规则的重要性。
从页面分离影子内容,考虑的all属性。
document.getElementById("example_control").attachShadow({mode:'open'}).innerHTML=`
<h1>shadow dom header</h1>
<div>shadow dom div</div>`;
document.getElementById("example_initial").attachShadow({mode:'open'}).innerHTML=`
<style>*{all:initial}</style>
<h1>shadow dom header</h1>
<div>shadow dom div</div>`;
document.getElementById("example_unset").attachShadow({mode:'open'}).innerHTML=`
<style>*{all:unset}</style>
<h1>shadow dom header</h1>
<div>shadow dom div</div>`;Run Code Online (Sandbox Code Playgroud)
div{color:purple}
div{border:1px solid}Run Code Online (Sandbox Code Playgroud)
<p>control:
<div id=example_control></div>
<p>initial:
<div id=example_initial></div>
<p>unset
<div id=example_unset></div>Run Code Online (Sandbox Code Playgroud)