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

为什么使用绝对位置会导致div在顶部?

微生承业
2023-03-14
问题内容

请查看此非常简单的代码段,以在下面说明我的问题:

#container {

  position: relative;

  padding: 20px;

  border: 2px solid gray;

}



#back {

  position: absolute;

  top: 0;

  bottom: 50%;

  left: 0;

  right: 0;

  background-color: #bbb;

}


<div class="col-sm-12" id="container">

  <div id="back"></div>

  <h1>Some Text</h1>

</div>

h1标签 之后back元素,在HTML代码。

由于我不更改其position属性,因此必须为static。而且,据我所知,static元素是根据页面的流向定位的。

那么……为什么绝对位置div 显示在 其同级 上方h1

我希望它会在h1第一时间出现。

请注意,我知道如何 纠正 此行为,我只是在问为什么!

修正片段:

#container {

  position: relative;

  padding: 20px;

  border: 2px solid gray;

}



#back {

  position: absolute;

  top: 0;

  bottom: 50%;

  left: 0;

  right: 0;

  background-color: #bbb;

}



/* Adding the below corrects this behaviour */



h1 {

  position: relative;

}


<div class="col-sm-12" id="container">

  <div id="back"></div>

  <h1>Some Text</h1>

</div>

......为什么使用position: relativeh1更正此行为?


问题答案:

这就是绘画顺序的工作方式。如此处所述,您具有以下顺序:

  1. 对于其所有 流入的 ,未定位的,块级的树状后代:如果元素是块,列表项或其他等效块:

在此步骤中,您将打印h1元素的背景和边框

  1. 否则:首先按元素顺序,然后按树顺序为其所有 流入 ,未定位的块级后代:

在这个 复杂的 步骤中,您将打印h1元素的内容

  1. 按树顺序的所有 position ,opacity或transform后代均属于以下类别:

    1. 所有 带有’z-index:auto’的后代

在这一步中,您将打印定位的元素#back;因此,h1即使在DOM中,它也位于DOM 的顶部。

换句话说,我们首先考虑流入要素,然后考虑位置要素。当然,更改z-index和/或其他属性会影响顺序,因为可以考虑更多步骤。

例如加入负z-index,以#back将触发此规则:

  1. 堆叠由具有负z索引(不包括0)的后代按z索引顺序(最负数先)然后按树顺序形成的上下文。

#back由于h1稍后将在步骤(4)和(7)中进行打印,因此这将使其滞后。

添加position:relative(或absolutefixedh1将使其成为定位元素,就像#back它将触发(8)一样,在这种情况下,将确定
树的顺序

您可能还会注意到,背景和内容都以两个不同的步骤进行打印,这也可能导致[某些 不直观的
绘画行为



 类似资料:
  • 问题内容: 我有3个要素。 第一个更大(包装)并具有 第2个相对于第1个相对位置绝对定位(并包含在第1个中) 第3个包含在第2个中,并且也具有绝对定位。 为什么第3个位置相对于第2个绝对位置(这也是第1个位置的绝对位置)而不是相对位置的第一个位置? 因为3rd 是绝对定位到2nd的绝对定位。 问题答案: 因为就像重置孩子的相对位置一样。 这是无法解决的-如果您希望第三个相对于第一个绝对定位,则必须

  • 问题内容: 好吧,我试图理解并阅读可能导致它的原因,但我却无法理解: 我的代码中有这个地方: 事实是,当它尝试调用某些方法时,它将引发而不是其他预期的异常(特别是)抛出 。我实际上知道调用了什么方法,所以我直接转到该方法代码,并为应该抛出的行添加了一个块 ,它实际上按预期抛出。然而,当它上升时,以某种方式更改了上面的代码并没有 按预期进行。 是什么原因导致这种行为的?我该如何检查? 问题答案: 通

  • 我用ASP.NET c#和angular 8开发了一个web API。我尝试在服务器端(使用NPOI)将一些数据从Oracle导出到Excel文件,并在客户端下载。我可以看到内存流有数据,但是在“返回响应”中,它没有返回给客户端,而是再次调用了函数。这是我的代码: 超文本标记语言: 键入脚本: API 控制器: DAL:(生成excel的最后一个函数。) 这是我在chrome调试器中看到的:[Ne

  • 问题内容: 带有此文件的ImageIO.read(imagePath)给出了CMMException,为什么Java无法处理此看似有效的文件http://www.jthink.net/jaikoz/scratch/front.jpg 问题答案: 我想我掌握了您的问题。我检查了您链接的图像(http://www.jthink.net/jaikoz/scratch/front.jpg)。其归因于Exi

  • 为什么我在下面的代码段中的X轴上有一个溢出? 在我的网格容器上应用时,就会产生溢出。 null null https://codepen.io/anon/pen/wdjexz?editors=1100

  • 问题内容: 即使模型类中没有验证约束,我也会收到此错误(所有成员变量均已正确设置,但我在创建对象时仍然遇到此异常)。如何调试此错误? 问题答案: 每个都有一个数组。每个显示了您要保留的bean的哪个属性被侵犯。正如@Arthur正确指出的那样,违反Java持久性注释的结果也以s 结尾。 要调试你的问题,我会暂时赶在并打印出每个如下: