我想将页脚放在布局页面的底部(当高度小于窗口时)。通常提到的解决方案是
min-height:100vh
,但这也扩展了其他元素的高度。我想将所有行的高度限制为内容的高度,同时将页脚推到底部(必要时)。
body {
font-family: Helvetica;
}
.wrapper {
display: grid;
grid-template-columns: auto;
min-height:100vh;
}
.box {
background-color: #20262e;
color: #fff;
border-radius: 3px;
padding: 20px;
font-size: 14px;
width:100%;
}
.a {grid-area: 1/1/2/2;}
.b {grid-area: 2/1/3/2;}
.footer {grid-area: 4/1/5/2;}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box footer">Footer</div>
</div>
你的尺码有一些错误。
对于整页和
padding
在身体上,你不能在这里使用min-height:100vh
因为它将是视口高度从身体的填充和最终水平滚动条偏移20px。使用 min-height:100%
代替,并将 body 设置为 100vh
of height
。 (box-sizing
也需要重置)。
width : 100%
不是块元素所必需的(除非您有特定原因)
例子。
body {
padding: 20px;
font-family: Helvetica;
margin: 0;
height: 100vh;/* reference for the direct child */
box-sizing: border-box;/* include padding and border into size calculation */
}
.wrapper {
display: grid;
grid-template-columns: auto;
min-height: 100%;/*of avalaible space of sized(height:xx) parent */
}
.box {
background-color: #20262e;
color: #fff;
border-radius: 3px;
padding: 20px;
font-size: 14px;
}
.a {
grid-area: 1/1/2/2;
}
.b {
grid-area: 2/1/3/2;
}
.footer {
grid-area: 4/1/5/2;
/* ?? should I stick at the bottom of the viewport ?? */
position:sticky;
bottom:0;
}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box footer">Footer</div>
</div>
如果不需要随时看到
footer
,请删除position:sticky
和bottom:0
。
grid-area
设置想法(没有行模板)缩小第一行,插入一个将使用这么多行的exta虚拟容器。(不优雅和平均,如果设置垂直间隙会中断。 )body {
padding: 20px;
font-family: Helvetica;
margin: 0;
height: 100vh;/* reference for the direct child */
box-sizing: border-box;/* include padding and border into size calculation */
}
.wrapper {
display:grid;
min-height: 100%;/*of avalaible space of sized(height:xx) parent */
}
.box {
background-color: #20262e;
color: #fff;
border-radius: 3px;
padding: 20px;
font-size: 14px;
}
.a {
grid-area: 1/1/2/2;
}
.b {
grid-area: 2/1/3/2;
}
.footer {
grid-area: 0/1/21/2;
}
/* fill a few rows if any rooms left */
.wrapper:before {
content:'';
grid-area:3/1/19/2;/* about 15 rows */
}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box footer">Footer</div>
</div>
grid
上使用 grid-template-rows
和正确的选项(在您的原始代码中没有设置 grid-template-area
):body {
padding: 20px;
font-family: Helvetica;
margin: 0;
height: 100vh;
/* reference for the direct child */
box-sizing: border-box;
/* include padding and border into size calculation */
}
.wrapper {
display: grid;
grid-template-rows: auto auto 1fr auto;
min-height: 100%;
/*of avalaible space of sized(height:xx) parent */
}
.box {
background-color: #20262e;
color: #fff;
border-radius: 3px;
padding: 20px;
font-size: 14px;
}
.footer {
grid-row: 4
}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box footer">Footer</div>
</div>
编辑:对于未知数量的行,flex 将是有效的。
body {
padding: 20px;
font-family: Helvetica;
margin: 0;
height: 100vh;
/* reference for the direct child */
box-sizing: border-box;
/* include padding and border into size calculation */
}
.wrapper {
display: flex;
flex-direction: column;
min-height: 100%;
}
.box {
background-color: #20262e;
color: #fff;
border-radius: 3px;
padding: 20px;
font-size: 14px;
}
/* if you need a gap , use margin , a pseudo stands here ! */
.box + .box {
margin-top:2px;
}
.wrapper:after {
content: '';
flex: 1;
}
.footer {
order: 2;
}
<div class="wrapper">
<div class="box a">A</div>
<div class="box b">B</div>
<div class="box footer">Footer</div>
</div>