具有中心valign的Flexbox,并允许扩展内容

时间:2018-11-16 05:49:12

标签: html css flexbox

首先,下面的第一个代码段是我要解决的问题。

请注意,这很正常 IF display: flex;应用于body

但是,我不想将样式应用于body,这会破坏Google Web缓存的布局。

*第一个代码段后的更多说明

* { box-sizing: border-box; }
body { margin: 0; }
.wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  width: 100%;
  background-color: #ccc;
}
.navigation {
  background-color: #f00;
  width: 100%;
  height: 3rem;
}
.footer {
  background-color: #0f0;
  width: 100%;
  text-align: center;
  line-height: 2rem;
}

.content {
  background-color: #ff0;
  flex: 1;
  margin: 0.6rem 0 1.2rem;
}
.container {
  background-color: #f0f;
  margin: 0 auto;
  max-width: 120rem;
  width: 100%;
  padding: 0 2rem;
}
.centered {
  display: flex;
  height: 100%;
  align-items: center;
  justify-content: center;
}
.long-content {
  background-color: #fff;
}
<main class="wrapper">
  <nav class="navigation">.navigation</nav>
  <div class="content">
    <section class="container centered">
      <div class="long-content">.long-content</div>
    </section>
  </div>
  <footer class="footer">.footer</footer>
</main>

因此,删除display: flex;会引起此问题:

    section中的
  • .content没有跨.content的高度

尝试使用position: relative上的.contentposition: absolute上的.centered来修复它,但解决了高度问题,但提出了:

  • .centered的宽度不跨越.content,而left:0;right:0;可以轻松固定
  • 高度不会随section中的内容而变化(我在这里不明白)

使用position: relativeposition: absolute修补原始问题是否错误? 如果是这样,哪个更合适的解决方案?

* { box-sizing: border-box; }
body { margin: 0; }
.wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  width: 100%;
  background-color: #ccc;
}
.navigation {
  background-color: #f00;
  width: 100%;
  height: 3rem;
}
.footer {
  background-color: #0f0;
  width: 100%;
  text-align: center;
  line-height: 2rem;
}

.content {
  background-color: #ff0;
  flex: 1;
  margin: 0.6rem 0 1.2rem;
  position: relative;
}
.container {
  background-color: #f0f;
  margin: 0 auto;
  max-width: 120rem;
  width: 100%;
  padding: 0 2rem;
}
.centered {
  display: flex;
  position: absolute;
  height: 100%;
  left: 0;
  right: 0;
  align-items: center;
  justify-content: center;
}
.long-content {
  background-color: #fff;
  height: 1000px;
}
<main class="wrapper">
  <nav class="navigation">.navigation</nav>
  <div class="content">
    <section class="container centered">
      <div class="long-content">.long-content</div>
    </section>
  </div>
  <footer class="footer">.footer</footer>
</main>

1 个答案:

答案 0 :(得分:0)

我继续寻找解决方案,并很快注意到我对flexbox本身了解不多,所以我继续玩Flexbox Froggy

完成所有级别后,我注意到,只需在position: absolute上使用justify-content,就可以在没有.wrapper的情况下对齐所有内容。

下面是我愚蠢问题的解决方案。

如果您删除height中的.long-content.centered将继续垂直对齐。

谢谢青蛙,向Codepip大喊!

* { box-sizing: border-box; }
body { margin: 0; }
.wrapper {
  display: flex;
  flex-direction: column;
  min-height: 100vh;
  width: 100%;
  background-color: #ccc;
  justify-content: space-between;
}
.navigation {
  background-color: #f00;
  width: 100%;
  height: 3rem;
}
.footer {
  background-color: #0f0;
  width: 100%;
  text-align: center;
  line-height: 2rem;
}

.content {
  background-color: #ff0;
  margin: 0.6rem 0 1.2rem;
}
.container {
  background-color: #f0f;
  margin: 0 auto;
  max-width: 120rem;
  width: 100%;
  padding: 0 2rem;
}
.centered {
  display: flex;
  height: 100%;
  align-items: center;
  justify-content: center;
}
.long-content {
  background-color: #fff;
  height: 1000px;
}
<main class="wrapper">
  <nav class="navigation">.navigation</nav>
  <div class="content">
    <section class="container centered">
      <div class="long-content">.long-content</div>
    </section>
  </div>
  <footer class="footer">.footer</footer>
</main>