当前位置: 首页 > 面试题库 >

::在伪元素堆叠顺序发布之前

薛涛
2023-03-14
问题内容

静态放置时,::
before伪元素堆栈(z-index)在孩子的内容之前,但在孩子的背景之后。谁能解释为什么甚至是怎么回事,或者这是所有主要浏览器都存在的问题吗?

<style>
div { background-color:yellow; width:400px; }
div::before { background-color:red; content:"div::before"; }
div::after { background-color:green; content:"div::after"; }
div p { background-color:blue; color:white; margin:-15px 0; padding:0; }
</style>
<div>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aliquam sed tellus sed tellus sodales hendrerit tristique et elit.</p>
</div>

http://jsfiddle.net/funkyscript/ALrgf/


问题答案:

的内容(div包括两个伪元素和p元素)参与相同的堆叠上下文(相对于div)。正如您所注意到的,这是因为它们全部三个都是静态放置的。换句话说,根本没有定位。(是的,这些元素在流动时确实会沿z轴堆叠;您不能使用来操纵它们的堆叠级别,z-index因为它们没有被定位。)

这是各部分绘制顺序的摘要1,在与您的问题相关的地方,以粗体强调:

每个盒子都属于一个 堆叠上下文 。给定堆叠上下文中每个定位的框都有一个整数 堆栈级别
,即它在z轴上相对于同一堆栈上下文中其他堆栈级别的位置。具有较高堆栈级别的框始终在具有较低堆栈级别的框前面格式化。盒子的堆叠高度可能为负。
在堆叠上下文中具有相同堆叠级别的框将根据文档树顺序从头到尾堆叠。

在每个堆叠上下文中,以下各层按从前到后的顺序绘制:

  1. 构成堆叠上下文的元素的背景和边界。
  2. 堆栈级别为负的子堆栈上下文(首先为负)。
  3. 流入,非内联级别,未定位的后代。
  4. 未定位的浮点数。
  5. 流内,行内,非定位后代,包括内联表和内联块。
  6. 堆栈级别为0的子堆栈上下文和堆栈级别为0的已定位后代。
  7. 子堆栈上下文的堆栈级别为正(最低优先级为第一)。

因为div::before插入在的内容之前div,然后插入到的内容div::after之后,所以当它们以静态位置显示内联时,即使将一个block元素夹在中间,它们也自然会遵循此规则(排序考虑了block
box和inline box) 。

注意,出于明显的原因,通常首先绘制背景,然后将内容覆盖在背景上:

  1. p元素作为块级元素,其背景首先被绘制(#3)。

  2. 然后,将内联级伪元素及其背景绘制在背景之上p(#5)。在格式化模型中,它们是p元素的兄弟姐妹,因此它们都参与div而不是的堆叠上下文p

  3. div::before伪元素(包括它的内容和背景)将出现在后面的p文本,因为它涉及之前p在视觉树。

  4. div::after伪元素(包括它的内容和背景)将出现在前面p,因为它涉及之后的文本p在视觉树。

如我的评论所示,如果将伪元素显示为块,则的背景div::before将隐藏在p元素的背景之后,而不是文本的后面;相反,的文本div::before将位于背景和p元素的文本之间。另请注意,的背景div::after画在的背景之前p,而内容则画在最前面。同样,这与在与上述规则相关的内容之前或之后绘制背景有关。

1
在规范的附录E中可以找到更详细的描述。



 类似资料:
  • 问题内容: 我正在尝试使用伪元素CSS选择器设置元素的样式 似乎元素不能低于元素本身。 有没有办法使伪元素低于元素本身? 问题答案: 伪元素被视为其关联元素的后代。要将伪元素放置在其父元素下方,您必须创建一个新的堆栈上下文以更改默认的堆栈顺序。 放置伪元素(绝对)并分配z索引值(不是“ auto”)会创建新的堆叠上下文。

  • 通常我们可能会认为 HTML 网页是个二维的平面,因为页面中的文本、图像或者其它元素都是按照一定顺序排列在页面上的,每个元素之间都有一定的间隙,不会重叠。然而,实际的网页其实是三维的,元素之间可能会发生堆叠(重叠),您可以通过 CSS 中的 z-index 属性来设置元素的堆叠顺序,如下图所示: 图:元素堆叠演示 每个元素都有一个默认的 z-index 属性,将 z-index 属性与 posit

  • 问题内容: 如何与决定在HTML堆叠元素的订单时,有关系吗? 当我保持小于由具有一些元件上的发言权。元素落后于没有元素的元素。 问题答案: 具有“自动”以外的z索引值的定位元素和不透明度值小于1的元素将生成堆叠上下文。请参阅有关喷漆顺序的规则。 在您的第一个示例中,我们具有带有多个后代的根堆栈上下文,包括: 定位的Z-index为正的绿色框 带有z-index的蓝色框 带有z-index 的蓝色框

  • 我有一个SVG元素,它包含两个尺寸和位置完全相同的子元素。两者唯一的区别是它们的颜色:第一个是红色,第二个是绿色。我注意到,即使绿色的圆圈在红色的上面,你仍然可以看到在圆圈的边缘有一点颜色偏移。我有什么办法可以避免这种颜色的变化吗? 下面是一张屏幕截图,显示了有红圈和没有红圈的情况: 这里还有我用来复制这个的小提琴。 null 欢迎任何不同的想法。

  • 问题内容: 我有一个:before开头的’quote’和一个:after结束的报价。 现在,我想要的是一个:after:after供“引用”参考,但我无法使其正常工作。 有人知道这是否可能吗? 到目前为止,我的代码: 问题答案: 已经提出了嵌套和伪元素的想法;请参阅“生成和替换的内容”模块的这一部分。但是,该模块已被放弃,等待完全重写,因此在重新发布该文档之前,我不会屏息。即便如此,嵌套内容伪元素

  • 堆叠布局需要一个二维的数据数组,并计算基准线;这个基准线会被传到上层,以便生成一个堆叠图。支持多个基线算法,以及启发式的排序算来可以提高感知灵敏度,就像拜伦(Byron)和瓦腾伯格(Wattenberg)在“Stacked Graphs—Geometry & Aesthetics”(http://www.leebyron.com/else/streamgraph/download.php?file