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

为什么我绝对定位的元素没有位于我期望的位置?

阎元徽
2023-03-14
问题内容

我只是在学习CSS的定位。基于我发现有用的文章,我开始玩转。

使用以下代码,我无法理解为什么绝对灰盒div不在其相对父级之外。我希望灰色框位于容器的左上角。

.container {

  background: lightblue;

  position: relative;

}



.box-orange {

  background: orange;

  height: 100px;

  width: 100px;

  position: relative;

  top: 100px;

  left: 100px;

  z-index: 2;

}



.box-blue {

  background: lightskyblue;

  height: 100px;

  width: 100px;

  /*position: static;*/

}



.box-green {

  background: lightgreen;

  height: 100px;

  width: 100px;

  position: relative;

  top: -105px;

  left: 105px;

  z-index: 2;

}



.box-grey {

  background: grey;

  height: 100px;

  width: 100px;

  position: absolute;

}


<div class="container">

  <div class="box-orange"></div>

  <div class="box-blue"></div>

  <div class="box-green"></div>

  <div class="box-grey"></div>

</div>

在以下情况下,也无法理解为什么灰色框不在左上角,而是在橙色框留下的空白处之后移动。我刚刚将灰色框移到了容器div中的第二位。

.container {

  background: lightblue;

  position: relative;

}



.box-orange {

  background: orange;

  height: 100px;

  width: 100px;

  position: relative;

  top: 100px;

  left: 100px;

  z-index: 2;

}



.box-blue {

  background: lightskyblue;

  height: 100px;

  width: 100px;

  /*position: static;*/

}



.box-green {

  background: lightgreen;

  height: 100px;

  width: 100px;

  position: relative;

  top: -105px;

  left: 105px;

  z-index: 2;

}



.box-grey {

  background: grey;

  height: 100px;

  width: 100px;

  position: absolute;

}


<div class="container">

  <div class="box-orange"></div>

  <div class="box-grey"></div>

  <div class="box-blue"></div>

  <div class="box-green"></div>

</div>

我发现的所有详细文档(例如MDN)和教程仅演示了2-3个框的非常简单的示例。


问题答案:

为了正确理解这一点,您需要参考官方规范,在其中找到元素 必须 满足的方程式:

'top' + 'margin-top' + 'border-top-width' + 'padding-top' + 'height' + 'padding-bottom' + 'border-bottom-width' + 'margin-bottom' + 'bottom' = height of containing block

我们没有边框和填充,因此在您的情况下,它将是:

'top' + 'margin-top' + 'height' + 'margin-bottom' + 'bottom' = height of containing block

如果您阅读下面的内容,将会发现:

  1. ‘top’和’bottom’为’auto’并且’height’不是’auto’, 然后将’top’设置为静态位置 ,将’margin-
    top’和’margin-bottom’的’auto’值设置为0 ,并解决“底部”问题。

因此,在您的情况下,您已经设置了高度并保持top/ bottom为自动,因此top将被设置为 静态位置

更精确地说,“顶部”的静态位置是从包含块的顶部边缘到假设框的顶部边缘的距离,该假设框如果元素的指定“位置”值具有一直是“静态”

为简单起见,如果未设置,则为元素的位置position:absolute

这是一个易于理解的简单示例

.container {

  background: lightblue;

  position: relative;

  padding:40px 20px;

  display:inline-block;

  vertical-align:top;

  width: 250px;

}





.box-grey {

  background: grey;

  height: 100px;

  width: 100px;

  position: absolute;

}



.box-green {

  height:20px;

  background:green;

}


<div class="container">

  <div class="box-green"></div>

  <div class="box-grey" style="position:static;">I am static</div>

</div>



<div class="container">

  <div class="box-green"></div>

  <div class="box-grey"></div>

</div>

请注意,如果添加,第一个元素的静态位置将保留position:absolute。我们没有指定任何最高值,因此浏览器将使用默认值,该position:static默认值是元素(默认位置)之一。

如果您不希望这样做,只需设置最高值,然后遵循以下规则:

  1. ‘bottom’为’auto’,’top’和’height’不是’auto’,然后将’margin-top’和’margin-bottom’的’auto’值设置为0并求解’bottom’

    .container {

    background: lightblue;

    position: relative;

    padding:40px 20px;

    display:inline-block;

    vertical-align:top;

    width: 250px;

    }

    .box-grey {

    background: grey;

    height: 100px;

    width: 100px;

    position: absolute;

    top:0;

    }

    .box-green {

    height:20px;

    background:green;

    }

    I am static

同样的逻辑适用于left属性

您可能还会注意到 包含 单词_的块_的使用,这在这里非常重要并在同一规范中进行了说明。

有时会相对于某个矩形(称为元素的包含块)来计算元素框的位置和大小。元素的包含块定义如下:

  1. 如果元素具有“位置:绝对”,则包含块由最接近的祖先以“绝对”,“相对”或“固定”的“位置”建立,方法如下:

而且这还不够,因为还有其他属性(下面列出)也建立了一个包含块,因此您可以相对于未定位的祖先定位元素!



 类似资料:
  • 问题内容: 我试图弄清楚,即使将HTML页面的主体设置为,为什么将其设置为HTML页面的主体也会使我的元素成为现实。 在此演示中可以更好地理解效果。 这是代码: 题 和定位之间是什么关系?为什么设置该属性会导致我的元素变为而不是? 问题答案: 元素仍然是,但是由于和框模型之间的一些相当复杂的交互,它看起来是固定的。令人难以置信的是,这些行为都不是未指定的,也不是任何浏览器中的错误- 实际上,这完全

  • 问题内容: 我发现当我固定一个元素固定的位置时,父元素是否相对放置都没关系,它相对于窗口的位置是否固定? CSS HTML 问题答案: 让我为两个可能的问题提供答案。请注意,您现有的标题(和原始帖子)提出的问题与您在编辑和后续评论中寻求的问题不同。 要将元素相对于父元素“固定”放置,您需要在子元素上,并且要在 父元素 上使用默认或静态以外的任何位置模式。 例如: 这将相对于parentDiv的位置

  • 如何根据具有绝对位置的子元素高度增加具有相对位置的父元素的高度。 在下面的例子中,父元素的高度显示为0px PS:我不想使用任何脚本 预期: 我得到的是: JSFIDLE 超文本标记语言: CSS:

  • 问题内容: SO上有很多问题涵盖了如何解决此问题的答案(添加),但没有一个试图真正解释标题运动背后的原因。我更奇怪为什么会这样。 可以认为固定标头停留在浏览器窗口的顶部,并且不应由于另一个未定位,非子,非父div(又称为同级)而移动。Esp。因为固定的标头不在正常的文档流中。 假设: 混淆源于固定元素是相对于浏览器窗口的想法。这是正确的,但是是使用视口计算的。视口是使用常规文档流中的元素计算的。由

  • 问题内容: 根据W3Schools: 相对定位的元素通常用作绝对定位元素的容器块。 为什么是这样?有没有很好的例子? 问题答案: 一个很好的例子是当您想将某些内容放置到页面上或相对于容器/ div放置时。 这向您显示,如果绝对div不在“相对” div内,则内容将与文档主体对齐。 请注意,绿色div()的div内部()的对齐方式为的上/右对齐。 蓝色框()具有与绿色框()完全相同的HTML布局,但

  • 本文向大家介绍通过CSS的定位有几种,分别相对于什么定位?相关面试题,主要包含被问及通过CSS的定位有几种,分别相对于什么定位?时的应答技巧和注意事项,需要的朋友参考一下 ,常规布局 ,相对定位,使用这个定位后,元素相对于本身未添加定位的位置定位 ,绝对定位,相对于最近的非祖先元素定位 ,相对于浏览器窗口定位 ,粘性定位