【问题标题】:Does the shadow DOM replace ::before and ::after?影子 DOM 会替换 ::before 和 ::after 吗?
【发布时间】:2015-09-14 15:55:23
【问题描述】:

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>";
div::before, div::after {
  content: 'Generated content';
}
&lt;div&gt;Content&lt;/div&gt;

【问题讨论】:

  • 你看过Shadow DOM的分布算法了吗?如果可以将伪 ::before::after 元素视为影子主机的子节点,那么这可能会描述行为。 w3.org/TR/shadow-dom/#distribution-algorithms
  • @DavidDomain 不多,我觉得那个规范很难理解 :S 但是,那个规范似乎在谈论 DOM 中发生的事情,但 ::before::after 不是 DOM 节点。
  • 同样,我也很难遵循规范。我只是想也许 Shadow DOM 被设计成将伪元素视为子节点,但事实可能并非如此,也没有多大意义。

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


【解决方案1】:

CSS 范围规范作者在这里。

答案实际上是,官方...未定义!

我在编写范围规范时没有考虑这种交互。我会向列表发送一封电子邮件,我们会弄清楚的。几乎可以肯定,我们会选择浏览器当前所做的任何事情(这似乎让 ::before/after “按预期”工作,即使在影子主机中也是如此)。

编辑:工作组的回应是一致的 - 当前的实施行为(::before/after do 在影子主机上工作)是应该的。我会尽快将其编辑到范围规范中。

【讨论】:

    【解决方案2】:

    我认为关键词在the generated content section的这一部分。

    ::之前

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

    ::之后

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

    原谅 ::after 描述中明显的复制粘贴错误(这是一个工作草案),我们可以看到这些伪元素在元素的实际内容之外或“紧接在”元素的实际内容之前生成内容。

    将此与 Shadow Encapsulation 部分的描述进行比较,它似乎证实了 Chrome 和 Firefox 的行为。

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

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

    【讨论】:

    • 如果我理解正确,您的意思是 ::before 和 ::after 就像孩子一样,但不是孩子。但是,在flexbox 中,只有流入的子项(和连续的文本运行)成为弹性项目,但 ::before 和 ::after 成为伪元素。所以这意味着他们必须像真正的孩子一样对待。
    • @Oriol 我不确定我是否遵循。如果我的理解是正确的,影子主机会替换“内容”,但 ::before/::after 在该内容之外创建单独的框,“紧接在之前”(和之后)。被替换的内容对伪元素没有影响,因为它们在被替换的内容之外。
    • 是的,似乎就是这样。但是,伪元素不是子元素,但必须表现得像它们一样。并且孩子(和后代)被替换。但是我们怎么知道它是否不包含伪元素(因为它们不是真正的孩子),或者是否包含(因为它们表现得像真正的孩子)?
    • 这适用于 ::-webkit-scrollbar 吗?我一直在尝试添加 ::part() 的滚动条,但是从组件外部进行样式设置时它不起作用
    猜你喜欢
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多