阴影 Dom 继承父页面 CSS [Chrome]
Shadow Dom inheriting parent page CSS [Chrome]
我读过的所有内容都表明影子 Dom 应该是来自其父页面 CSS 的 'safe'。 IE。如果我将所有 div 样式设置为紫色字体:
<style>
div{color: purple}
</style>
我的 Shadow Dom 中的 div 应该具有浏览器默认颜色。
我正在编写一个 chrome 扩展程序,可以将 html 注入任何给定页面。除非此 html 受 Shadow Dom 或 Iframe 保护,否则它将继承页面的所有 CSS.
在此 question 中解决此问题的建议是使用 Shadow Dom。所以我实施了一个解决方案,但注意到它仍然继承了页面的 CSS。我认为这可能是在 Chrome 扩展中使用它的一个问题,所以我从一些 Shadow Dom 示例中劫持了一个 jsBin(并将其放入另一个实时编码应用程序中以备不时之需)。
https://codepen.io/hyrumwhite/pen/xPRexQ
同样的结果。我的阴影 DOM 继承了页面 CSS,我的 div(奇怪的是我的 h1)是紫色的。
阴影中的子项 Dom 似乎将继承应用到宿主元素的任何样式。
这是按设计工作的吗?有没有办法防止这种情况?还是阴影 DOM 足够新以至于这是一个错误,我应该在继续使用它时遇到类似的错误?
继承的属性将照常继承。最好把shadow boundary看作是影响级联的,即选择器的范围和规则的重要性。
要从页面中隔离阴影内容,请考虑 the all
property。
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>`;
div{color:purple}
div{border:1px solid}
<p>control:
<div id=example_control></div>
<p>initial:
<div id=example_initial></div>
<p>unset
<div id=example_unset></div>
对我来说,添加 :host { all: initial }
作为 ShadowDOM 样式中的第一个 CSS 规则可以防止继承,而不会影响 ShadowDOM 中定义的其他 CSS。
事实证明,使用 * { all: initial }
过于宽泛,覆盖了我在 ShadowDOM 中定义的大部分 CSS。
参考:WebFundamentals 项目 ShadowDOM 文档中标记为#reset 的部分。
我读过的所有内容都表明影子 Dom 应该是来自其父页面 CSS 的 'safe'。 IE。如果我将所有 div 样式设置为紫色字体:
<style>
div{color: purple}
</style>
我的 Shadow Dom 中的 div 应该具有浏览器默认颜色。
我正在编写一个 chrome 扩展程序,可以将 html 注入任何给定页面。除非此 html 受 Shadow Dom 或 Iframe 保护,否则它将继承页面的所有 CSS.
在此 question 中解决此问题的建议是使用 Shadow Dom。所以我实施了一个解决方案,但注意到它仍然继承了页面的 CSS。我认为这可能是在 Chrome 扩展中使用它的一个问题,所以我从一些 Shadow Dom 示例中劫持了一个 jsBin(并将其放入另一个实时编码应用程序中以备不时之需)。
https://codepen.io/hyrumwhite/pen/xPRexQ
同样的结果。我的阴影 DOM 继承了页面 CSS,我的 div(奇怪的是我的 h1)是紫色的。
阴影中的子项 Dom 似乎将继承应用到宿主元素的任何样式。
这是按设计工作的吗?有没有办法防止这种情况?还是阴影 DOM 足够新以至于这是一个错误,我应该在继续使用它时遇到类似的错误?
继承的属性将照常继承。最好把shadow boundary看作是影响级联的,即选择器的范围和规则的重要性。
要从页面中隔离阴影内容,请考虑 the all
property。
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>`;
div{color:purple}
div{border:1px solid}
<p>control:
<div id=example_control></div>
<p>initial:
<div id=example_initial></div>
<p>unset
<div id=example_unset></div>
对我来说,添加 :host { all: initial }
作为 ShadowDOM 样式中的第一个 CSS 规则可以防止继承,而不会影响 ShadowDOM 中定义的其他 CSS。
事实证明,使用 * { all: initial }
过于宽泛,覆盖了我在 ShadowDOM 中定义的大部分 CSS。
参考:WebFundamentals 项目 ShadowDOM 文档中标记为#reset 的部分。