CSS 经典布局实现-粘连布局

354 阅读2分钟

前言

粘连布局(sticky footer)也是常用的经典布局之一。本文介绍了什么是粘连布局以及使用 margin、flex、grid 实现粘连布局。

什么是粘连布局

当网页内容区域过短时就会出现 footer 下面一大片空白的情况,这一般不是我们想要的,我们希望 footer 此时紧贴在网页的底部。这时就可以使用粘连布局。

粘连布局(sticky footer):

  • 当内容区域元素没有超出视口高度时, footer 紧贴在网页底部(视口底部)。
  • 当内容区域元素超出视口高度时, footer 紧跟内容区域底部,即正常布局。

实现

HTML 代码如下:

<div class="main">
  <div class="content">content</div>
</div>
<div class="footer">footer</div>
  • 要将 body 的内外边距设置为0,否则网页会大一圈。
  • body 设置最小高度为 100% 并使高度继承下去。
  • 基本思路为将剩余的空白区域进行填充。
* {
  margin: 0;
  padding: 0;
}
html,
body
{
  height: 100%;
}
body {
  min-height: 100%;
}

负 margin-bottom

此方法需要在 main 盒子下增加 push 盒子来填充空出的位置。

<div class="push"></div>
  • 设置 main 最小高度为 100%,使其在有空白时铺满视口。
  • 设置 mainmargin-bottom 为负值,空出 footer 的位置。
  • pushfooter 等高,填补 main 内容超出 100% 时会与 footer 重合的空间。
  • footer 必须为固定宽高。
  • 需要添加额外的元素 push
.main {
  min-height: 100%;
  margin-bottom: -50px;
}
.push,
.footer {
  height: 50px;
}

负 margin-top

此方法需要在 main 盒子内加一层 inner 盒子,与上一方法类似,都是用盒模型空出 footer 的位置。

<div class="main">
  <div class="inner">
    <div class="content">content</div>
  </div>
</div>
  • 设置 main 最小高度为 100%,使其在有空白时铺满视口。
  • 设置 innerpadding-bottom 为负值,空出 footer 的位置。
  • footer 必须为固定宽高。
  • 需要添加额外的元素 inner
.main {
  min-height: 100%;
}
.inner {
  padding-bottom: 50px;
}
.footer {
  margin-top: -50px;
  height: 50px;
}

计算属性

  • 使用计算属性直接设置 main 盒子高度,空出 footer 位置。
.main {
  min-height: calc(100vh - 50px);
}
.footer {
  height: 50px;
}

使用视口高度单位 vh,就不需要将 body 设置高度为 100% 了。

flex 实现

  • 设置 flex: 1; 使其自动填充剩余空间, footer 会被压在最底下。
  • 高度超出 100% 后就无空间可分配, footer 也就贴在 main 后了。
  • 布局方式更加现代,更符合直觉。
body {
  display: flex;
  flex-direction: column;
}
.main {
  flex: 1;
}

grid 实现

  • 类似 flex 实现,让 main 自适应剩下区域。
  • 布局方式更加现代,更符合直觉。
body {
  display: grid;
  grid-template-rows: 1fr auto;
}

参考资料

粘连 Footer 的 5 种方法 | CSS-Tricks - 掘金