结合弹性和绝对定位时会感到困惑

时间:2018-12-12 20:44:53

标签: html css flexbox

我有一个应用程序,它本质上是页眉,主要内容和始终可见的页脚。页脚可以更改大小,我想在页脚上方的主要内容面板上放置一些工具。主要布局是使用flex完成的,我在阅读文档时的理解是,绝对定位通过相对于最近的后代进行定位而与flex布局相结合,但这并不是我的经验。希望有人可以在这里帮助我。

在下面的代码示例中,我希望看到“底部” div位于页脚上方,但实际上它位于窗口的底部。 这是jsfiddle链接:http://jsfiddle.net/L809zbey/

HTML:

<div class="flex">
    <div class="header">Sweet header</div>
    <div class="content">Main content
        <div class="bottom">
          This guy should be fixed above the footer.
        </div>
    </div>

    <div class="footer">Equally sweet footer</div>
</div>

CSS:

.flex{
    border: 1px solid #ddd;
    font: 14px Arial;
    display: flex;
    flex-direction: column;
}

.header{
  background : #007AA2;
  flex: 0 0 auto;
}

.content{
  background : #FFF;
  flex: 1 1 auto;
  height: 200px;
}

.footer{
  background : #7FCADE;
  flex: 0 0 auto;
}

.bottom {
  position: absolute;
  bottom: 20px;
}

3 个答案:

答案 0 :(得分:2)

尝试将position:relative;添加到您的.flex类中。 .bottom元素当前是相对于正文的,因此为何将其固定在页面底部。

答案 1 :(得分:0)

您需要将position: relative;添加到.flex。绝对定位的事物将相对于最近定位的祖先进行定位。如果不存在,它将相对于身体

答案 2 :(得分:0)

您不需要完全定位元素 ...只需确保其始终位于.content div的底部即可。这样,它就不会覆盖任何具有绝对位置的实际内容

您可以通过将.content div设为flex-column并应用margin-top:auto您的工具div来实现此目的。

.flex {
  border: 1px solid #ddd;
  font: 14px Arial;
  display: flex;
  flex-direction: column;
}

.header {
  background: #007AA2;
  flex: 0 0 auto;
}

.content {
  background: pink;
  flex: 1;
  display: flex;
  flex-direction: column;
  height: 200px;
}

.footer {
  background: #7FCADE;
  flex: 0 0 auto;
}

.bottom {
  margin-top: auto;
  background: orange;
}
<div class="flex">
  <div class="header">Sweet header</div>
  <div class="content">Main content
    <div class="bottom">
      This guy should be fixed above the footer.
    </div>
  </div>

  <div class="footer">Equally sweet footer</div>
</div>