如何做一个粘性页脚并且仍然能够做可滚动的 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
,这里有很好的解释:
堆栈片段
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
在较小的屏幕上进一步向下。
堆栈片段
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>
我正在尝试实现 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
,这里有很好的解释:
堆栈片段
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
在较小的屏幕上进一步向下。
堆栈片段
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>