CSS :before/:after 选择器突然与父级分开定位 div

CSS :before/:after selectors are suddenly being positioned separately of parent div

我换了一台新电脑,突然 CSS :after:before 选择器不再工作了。

奇怪的是,我之前在另一台电脑上添加的:before/:after选择器,在我的新电脑上显示完全正常。但是我现在添加的任何新代码都不会显示,即使我将旧代码复制并粘贴到新的 div.

比如这个:

html

<div id="wtf"></div>

css

#wtf {
    width: 10px;
    height: 20px;
    background: red;
}
#wtf:after {
    content: "";
    position: absolute;
    left: 100px;
    top: 10px;
    width: 20px;
    height: 20px;
    background: blue;
}

将此代码直接复制并粘贴到 fiddle: ( http://jsfiddle.net/rLnrtu0x/ ) 时有效,但我的本地浏览器上只显示红色框。无论我做什么,蓝框都不会显示。所有其他 CSS 行为正常。

有谁知道我可能做错了什么?

在 Ubuntu 14.04 上的 Mozilla 35.0.1 和 Chrome 42.0.2311.152(64 位)上测试。我不能在我的旧电脑上重新测试它,因为它坏了,但我以前从未遇到过 :before/:after 选择器的问题。

更新

我刚刚和检查员一起找到了选择器。它们实际上正常显示,但它们的定位是相对于 html,而不是它们的父级 div。同样,使用我在计算机更改之前添加的代码,:before/:after 选择器相对于父 div 定位。但是新代码,即使它是复制粘贴的,也会相对于 html 定位选择器。为什么会这样?

原来跟换电脑无关。 :before/:after 选择器实际上正在显示,但它们是相对于 html 而不是父 div 定位的,因为父 div 是绝对定位的。

父容器需要position

绝对定位元素被定位"at a specified position relative to its closest positioned ancestor or to the containing block."(src:MDN)

因此,您的 :after 伪元素未包含在其父元素中,因为父元素不是 "positioned" 或其位置设置为 static.

唯一的解释是,您之前的设置中一定有某些东西将 position 应用到 #wtf,这使得它的子项可以绝对定位在其中。

您可以 "fix" 通过将位置应用于 #wtf 来解决问题,如下所示:

#wtf {
    width: 10px;
    height: 20px;
    background: red;
    position: relative;
}
#wtf:after {
    content: "";
    position: absolute;
    left: 100px;
    top: 10px;
    width: 20px;
    height: 20px;
    background: blue;
}
<div id="wtf"></div>