以3行布局:
问题在于,当主要内容扩展时,它会搜索页眉和页脚行:
HTML:
<section>
<header>
header: sized to content
<br>(but is it really?)
</header>
<div>
main content: fills remaining space<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- uncomment to see it break - ->
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- -->
</div>
<footer>
footer: fixed height in px
</footer>
</section>
CSS:
section {
display: flex;
flex-flow: column;
align-items: stretch;
height: 300px;
}
header {
flex: 0 1 auto;
background: tomato;
}
div {
flex: 1 1 auto;
background: gold;
overflow: auto;
}
footer {
flex: 0 1 60px;
background: lightgreen;
/* fixes the footer: min-height: 60px; */
}
小提琴:
我很幸运,我可以使用最新最好的CSS,无视旧版浏览器。我以为我可以使用flex布局来最终摆脱旧的基于表格的布局。出于某种原因,它没有做我想做的事情......
为了记录,有很多相关的问题关于&#34;填补剩余的高度&#34;,但没有解决我与flex有关的问题。参考文献:
答案 0 :(得分:185)
简单说明: DEMO
section {
display: flex;
flex-flow: column;
height: 300px;
}
header {
background: tomato;
/* no flex rules, it will grow */
}
div {
flex: 1; /* 1 and it will fill whole space left if no flex value are set to other children*/
background: gold;
overflow: auto;
}
footer {
background: lightgreen;
min-height: 60px; /* min-height has its purpose :) , unless you meant height*/
}
<section>
<header>
header: sized to content
<br/>(but is it really?)
</header>
<div>
main content: fills remaining space<br> x
<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- uncomment to see it break -->
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br> x
<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br> x
<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br> x
<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
<!-- -->
</div>
<footer>
footer: fixed height in px
</footer>
</section>
答案 1 :(得分:17)
如果展开的中心组件的内容超出其边界,则下面的示例包括滚动行为。此外,中心组件在视口中占用剩余空间的100%。
var str = "Who said (romance) was dead?";
var wordToBeStronged = "romance";
str = str.split( "(" + wordToBeStronged + ")" ).join( "<strong>" + wordToBeStronged + "</strong>" );
console.log( str );
可用于演示此行为的html示例
html, body, .r_flex_container{
height: 100%;
display: flex;
flex-direction: column;
background: red;
margin: 0;
}
.r_flex_container {
display:flex;
flex-flow: column nowrap;
background-color:blue;
}
.r_flex_fixed_child {
flex:none;
background-color:black;
color:white;
}
.r_flex_expand_child {
flex:auto;
background-color:yellow;
overflow-y:scroll;
}
答案 2 :(得分:5)
A more modern approach would be to use the grid property.
section {
display: grid;
align-items: stretch;
height: 300px;
grid-template-rows: min-content auto 60px;
}
header {
background: tomato;
}
div {
background: gold;
overflow: auto;
}
footer {
background: lightgreen;
}
<section>
<header>
header: sized to content
<br>(but is it really?)
</header>
<div>
main content: fills remaining space<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
</div>
<footer>
footer: fixed height in px
</footer>
</section>
答案 3 :(得分:3)
对主要内容div使用flex-grow
属性,并将dispaly: flex;
赋予其父级;
body {
height: 100%;
position: absolute;
margin: 0;
}
section {
height: 100%;
display: flex;
flex-direction : column;
}
header {
background: tomato;
}
div {
flex: 1; /* or flex-grow: 1 */;
overflow-x: auto;
background: gold;
}
footer {
background: lightgreen;
min-height: 60px;
}
<section>
<header>
header: sized to content
<br>(but is it really?)
</header>
<div>
main content: fills remaining space<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
x<br>x<br>x<br>x<br>x<br>x<br>x<br>x<br>
</div>
<footer>
footer: fixed height in px
</footer>
</section>
答案 4 :(得分:0)
这是显示解决方案的 codepen演示:
重要亮点:
html
,body
,... .container
中的所有容器都应将高度设置为100%flex
将触发基于弹性分布的项目尺寸计算:
flex
,例如:flex: 1
,则此弹性项将占用剩余空间 flex
属性的个以上,则计算将更加复杂。例如,如果将项目1设置为flex: 1
,而将项目2设置为flex: 2
,则项目2将占用剩余空间的两倍。
flex-direction
属性的值flex
属性为https://www.w3.org/TR/css-flexbox-1/#propdef-flex的情况下它将被覆盖
min-*
和max-*
将受到尊重