是否可以将伪元素的堆叠顺序设置在其父元素下面?

ada*_*ign 270 css z-index pseudo-element

我试图用:after伪元素CSS选择器设置元素的样式

#element {
    position: relative;
    z-index: 1;
}

#element::after {
    position:relative;
    z-index: 0;
    content: " ";
    position: absolute;
    width: 100px;
    height: 100px;
}
Run Code Online (Sandbox Code Playgroud)

看起来::after元素不能低于元素本身.

有没有办法让伪元素低于元素本身?

Arl*_*ley 333

伪元素被视为其相关元素的后代.要将伪元素定位在其父元素下方,您必须创建新的堆叠上下文以更改默认堆叠顺序.
定位伪元素(绝对)并指定除"auto"之外的z-index值将创建新的堆叠上下文.

#element { 
    position: relative;  /* optional */
    width: 100px;
    height: 100px;
    background-color: blue;
}

#element::after {
    content: "";
    width: 150px;
    height: 150px;
    background-color: red;

    /* create a new stacking context */
    position: absolute;
    z-index: -1;  /* to be below the parent element */
}
Run Code Online (Sandbox Code Playgroud)
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>Position a pseudo-element below its parent</title>
</head>
<body>
  <div id="element">
  </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

  • 但是,如果您有一个带背景的普通父div,则会隐藏下面的元素.在这种情况下,给出父相对定位和z-index为1.请参阅:http://jsbin.com/juputice/3/edit (102认同)
  • 还要注意,一些奇怪的行为,如果你对父元素使用变换,父元素的背景仍将位于伪元素下面,而内容将位于顶部. (17认同)
  • 谢谢@spsaucier - 似乎它对编号非常具体,即需要为1和-1,任何其他值似乎都不适用于此上下文. (9认同)
  • 对此代码只有一条注释:如果父div(伪元素的所有者的父级)具有背景(例如正文标记),则它将与伪元素背景重叠.要修复它,必须将父div设置为相对定位,并将z-index值设置为低于伪元素 (4认同)
  • @NathanHornby我有类似你自己的发现:上面的div应该是一个正的z-index而下层(伪元素)*必须是一个负面的(例如``-1`) (2认同)
  • 为什么我的示例不起作用?https://codepen.io/anon/pen/wqNOjd ...仅适用于z-index:auto; 在父母 (2认同)
  • 我已经尝试过使用父位置:fixed和z-index:1以及上述代码中的伪元素来进行此操作。在Chrome中不起作用。 (2认同)

Ada*_*dam 240

我知道这是一个老线程,但我觉得有必要发布正确的答案.这个问题的实际答案是你需要在元素的父元素上使用伪元素创建一个新的堆叠上下文(实际上你必须给它一个z-index,而不仅仅是一个位置).

像这样:

#parent {
    position: relative;
    z-index: 1;
}
#pseudo-parent {
    position: absolute;
    /* no z-index allowed */
}
#pseudo-parent:after {
    position: absolute;
    top:0;
    z-index: -1;
}
Run Code Online (Sandbox Code Playgroud)

它与使用:before或:after伪元素无关.

#parent { position: relative; z-index: 1; }
#pseudo-parent { position: absolute; } /* no z-index required */
#pseudo-parent:after { position: absolute; z-index: -1; }

/* Example styling to illustrate */
#pseudo-parent { background: #d1d1d1; }
#pseudo-parent:after { margin-left: -3px; content: "M" }
Run Code Online (Sandbox Code Playgroud)
<div id="parent">
 <div id="pseudo-parent">
   &nbsp;
 </div>
</div>
Run Code Online (Sandbox Code Playgroud)

  • 我不确定你的意思是什么`#parent`和`#pseudo-parent`,你介意给我看一个jsFiddle吗?或任何一个例子,无论如何,谢谢. (6认同)
  • 这是一个更完整的答案,亚当.谢谢!我发现(在Chrome上)#pseudo-parent的z-index不仅不是必需的,而且也是有害的 - (而#parent的z-index没有效果),并且:在div之后只有在其z-index为负数时才会显示在父项下. (4认同)
  • @adardesign - jsfiddle目前只读,HTML可在pastebin上找到 - http://pastebin.com/cjYT2aWW (2认同)
  • @arley:你的回答是在这个问题发布几个月之后发布的,当时它甚至都没有答案 - 这是一条评论说它不起作用. (2认同)
  • @Boyang - 似乎你是极少数不明白这是OP要求的解决方案的人之一,感谢你的否决。 (2认同)

Eug*_*run 52

试试看

el {
  transform-style: preserve-3d;
}
el:after {
  transform: translateZ(-1px);
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢@Eugen.这实际上是我工作的唯一答案.我必须在伪元素中设置背景颜色,元素和伪元素都是绝对定位的.工作完美. (5认同)
  • 这个更好的答案; 当主div(元素)有一些变换时,特别覆盖大多数情况. (5认同)
  • 最佳答案...就像魅​​力一样。 (3认同)
  • 他为什么要试试这个代码?有什么不同,它如何解决问题?解释您的代码,它将避免被标记为低质量答案。你确实意识到这是去年的,对吗? (2认同)
  • 就我而言,我需要将“position:absolute”添加到“el:after”;否则,它有效! (2认同)
  • 虽然这是唯一在大多数浏览器上对我有用的东西,但它在 IE11 中不起作用 (2认同)

Gab*_*ley 15

这里有两个问题:

  1. CSS 2.1规范声明"在:之前和之后:伪元素元素与其他框架交互,例如运行框,就好像它们是在关联元素内插入的真实元素一样." 鉴于在大多数浏览器中实现z索引的方式,在所有浏览器中运行的DOM中移动内容低于其父元素的z-index非常困难(阅读,我不知道如何).

  2. 上面的数字1并不一定意味着它是不可能的,但它的第二个障碍实际上更糟:最终它是浏览器支持的问题.在FF3.6之前,Firefox根本不支持生成内容的定位.谁知道像IE这样的浏览器.所以,即使你能找到一个让它在一个浏览器中运行的黑客,它很可能只能在那个浏览器中运行.

我能想到的唯一可以跨浏览器工作的是使用javascript来插入元素而不是CSS.我知道这不是一个很好的解决方案,但是:之前和之后:伪选择器真的看起来不像它们会在这里削减它.


cwe*_*der 11

关于规范(http://www.w3.org/TR/CSS2/zindex.html),由于a.someSelector被定位,它创建了一个新的堆叠上下文,其子项无法突破.保持a.someSelector未定位,然后将子a.someSelector:after放在与a.someSelector相同的上下文中.


D.N*_*.N. 9

我知道这个问题很古老,并且有一个公认的答案,但我找到了一个更好的解决方案.我在这里发布它所以我不会创建一个重复的问题,并且该解决方案仍然可供其他人使用.

切换元素的顺序.将:before伪元素用于下面应该包含的内容,并调整边距以进行补偿.保证金清理可能会很混乱,但z-index会保留所需的保证金.

我用IE8和FF3.6成功测试了这个.


小智 6

设置z-index了的:before或者:after伪元素为-1,并给它一个position是荣誉z-index性质(absoluterelative,或fixed)。这是有效的,因为伪元素的z-index相对于其父元素,而不是<html>,这是其他元素的默认值。这是有道理的,因为它们是<html>.

我遇到的问题(导致我提出这个问题和上面接受的答案)是我试图使用:after伪元素来获得背景为z-index15的元素,即使设置z-index为 14,它仍然在其父级之上呈现。这是因为,在该堆叠上下文中,它的父级的 az-index为 0。

希望这有助于澄清一些正在发生的事情。


归档时间:

查看次数:

208196 次

最近记录:

6 年,4 月 前