如何做一个粘性页脚并且仍然能够做可滚动的 flexbox 内容?

How to do a sticky footer and still be able to do scrollable flexbox content?

我正在尝试实现 sticky footer(flexbox 版本)。但是,如果我还希望能够在 flex: 1 div 中包含可滚动内容(这需要 parents 才能具有 height: 100%),我无法找到可行的解决方案。

这里有一个 fiddle 来演示这个问题: https://jsfiddle.net/gfaqLh42/6/

如您所见,红色区域是可滚动的(带有 min-height: 300px)。请注意,即使视口不小于红色区域的 min-height + 蓝色区域,页脚也在屏幕外。

有没有办法在制作粘性页脚的同时仍然使用带有可滚动内容的 flexbox flex: 1

更新

这是另一张图片,代表我在尝试完成这项工作时遇到的另一个大问题:

Is there a way to do a sticky footer and still use flexbox flex: 1 with scrollable content?

是的,而且你需要的是一路使用Flexbox。

因此,不要在 article-1/card 上使用 min-height/height,而是将 CSS 更改为:

.article-1 {
  flex: 1;
  display: flex;
  min-height: 0;                     /*  added, i.a Firefox need this  */
}

.card {
  overflow: auto;
}

注意,我还删除了一些不需要的属性,主要是因为它们被设置为默认值,并添加了一些。为什么需要 min-width,这里有很好的解释:

Updated fiddle

堆栈片段

html, body{
  height: 100%;
  margin: 0;
  font-weight: bold;
}

.header {
  position: absolute;
  height: 40px;
  background-color: grey;
  z-index: 1;
  width: 100%;
}

.content {
  display: flex;
  flex-direction: column;
  height: 100%;  
  padding-top: 40px;
  box-sizing: border-box;            /*  added  */
}

.wrap {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;                     /*  added, i.a Firefox need this  */
}

.container {
  flex: 1;
  padding: 10px;
  box-sizing: border-box;            /*  added  */
  display: flex;
  flex-direction: column;
  min-height: 0;                     /*  added, i.a Firefox need this  */
}

.article-1 {
  flex: 1;
  display: flex;
  min-height: 0;                     /*  added, i.a Firefox need this  */
}

.card {
  overflow: auto;
}

.card-text {
  height: 2000px;
  width: 2000px;
  background-color: red;
}

.article-2 {
  flex: none;
  height: 40px;
  background-color: blue;
}

.footer {
  position: relative;
  height: 40px;
  background-color: grey;
}
<div class="header">Header</div>
<div class="content">

  <div class="wrap">
    <div class="container">
      <div class="article-1">
        <div class="card">
          <div class="card-text">
            scrollable flex: 1 div<br>
            1. scrollable<br>
            2. scrollable<br>
            3. scrollable<br>
            4. etc...
          </div>
        </div>
      </div>
      <div class="article-2">
        flex: none div
      </div>
    </div>
  </div>

  <div class="footer">Footer</div>
</div>


根据评论更新

如果 article-1 需要有最小高度,并且为了避免在其上绝对定位,也可以在 content 上设置最小高度,以推动 footer 在较小的屏幕上进一步向下。

Updated fiddle 2

堆栈片段

html, body{
  height: 100%;
  margin: 0;
  font-weight: bold;
}

.header {
  position: absolute;
  height: 40px;
  background-color: grey;
  z-index: 1;
  width: 100%;
}

.content {
  display: flex;
  flex-direction: column;
  height: 100%;  
  min-height: 450px;                 /*  added  */
  padding-top: 40px;
  box-sizing: border-box;            /*  added  */
}

.wrap {
  flex: 1;
  display: flex;
  flex-direction: column;
  min-height: 0;                     /*  i.a Firefox need this  */
}

.container {
  flex: 1;
  padding: 10px;
  box-sizing: border-box;            /*  added  */
  display: flex;
  flex-direction: column;
  min-height: 0;                     /*  i.a Firefox need this  */
}

.article-1 {
  flex: 1;
  display: flex;
  min-height: 300px;                 /*  changed  */
}

.card {
  overflow: auto;
}

.card-text {
  height: 2000px;
  width: 2000px;
  background-color: red;
}

.article-2 {
  flex: none;
  height: 40px;
  background-color: blue;
}

.footer {
  position: relative;
  height: 40px;
  background-color: grey;
}
<div class="header">Header</div>
<div class="content">

  <div class="wrap">
    <div class="container">
      <div class="article-1">
        <div class="card">
          <div class="card-text">
            scrollable flex: 1 div<br>
            1. scrollable<br>
            2. scrollable<br>
            3. scrollable<br>
            4. etc...
          </div>
        </div>
      </div>
      <div class="article-2">
        flex: none div
      </div>
    </div>
  </div>

  <div class="footer">Footer</div>
</div>