shadow DOM是否替换:: before和:: after?

时间:2015-06-27 23:08:36

标签: css css3 language-lawyer pseudo-element shadow-dom

CSS Scoping

  

shadow host的后代不得在其中生成框   格式化树。相反,active shadow tree的内容   生成框,就好像它们是元素的内容一样。

CSS Pseudo-Elements::before::after描述为

  

这些伪元素生成框,就好像它们是直接的一样   他们的原始元素的孩子

那么这些是真的吗?

  • 首先,影子主机(不包括::before::after)的所有内容都被活动阴影树的内容替换。然后,::before::after会在影子主机中生成框。
  • 首先,::before::after在影子主机中生成框。然后,影子主机的所有内容(包括::before::after)将被活动影子树的内容替换。

Firefox和Chrome做前者,但规范是否描述了行为?



var root = document.querySelector('div').createShadowRoot();
root.innerHTML = "<p>Shadow content</p>";
&#13;
div::before, div::after {
  content: 'Generated content';
}
&#13;
<div>Content</div>
&#13;
&#13;
&#13;

2 个答案:

答案 0 :(得分:23)

CSS Scoping规范作者在这里。

答案实际上是,正式......未定义!

当我编写范围规范时,我没有想到这种互动。我会发一封电子邮件到列表中,我们会搞清楚。几乎可以肯定的是,我们将决定当前所做的任何浏览器(看起来像工作之前/之后的那样“正如预期的那样”,即使在影子主机中也是如此)。

编辑:工作组的回应是一致的 - 当前的实现行为(在之前/之后在阴影主机上工作)应该如何。我很快就会把它编辑成Scoping规范。

答案 1 :(得分:2)

我认为关键措辞是the generated content section的这一部分。

  

<强> ::前

     

表示在原始元素的实际内容之前的可设置样式的子伪元素。

     

<强> ::后

     

表示在原始元素的实际内容之前的可设置样式的子伪元素。

在描述中删除了明显的复制粘贴错误(它是一个工作草案),我们可以看到这些伪元素在&#34;之前生成内容,或者直接生成#34;实际内容元素。

将此与Shadow Encapsulation部分的说明进行比较,似乎可以确认Chrome和Firefox的行为。

  

影子主机的后代不得在格式化树中生成框。相反,活动阴影树的内容生成框,就好像它们是元素的内容一样。

简而言之,影子主机替换元素的实际内容,并且:: before和:: after紧跟元素实际内容之前/之后生成伪元素。因为伪元素在被替换的内容之外创建框,所以被替换的内容对伪元素没有影响。