我正在尝试创建这样的布局:
顶部div 的固定高度为100px,底部div 的固定高度为50px,并且它们之间的div使用窗口的可用空间。 / p>
代码如下:
html body {
height: 100vh;
width: 100%;
margin: 0;
padding: 0;
border: 0;
}
.flex-grid {
display: flex;
flex-direction: column;
height: 100%;
}
.topRow {
background-color: gray;
height: 100px;
border: 2px solid black;
}
.bottomRow {
background-color: cadetblue;
border: 2px solid black;
height: 50px;
}
.content {
background-color: orange;
border: 2px solid black;
flex: 1;
display: flex;
flex-direction: row;
justify-content: space-between;
}
<div class="flex-grid">
<div class="topRow">Top div</div>
<div class="content">
<div>
<p>First column</p>
</div>
<div style="display:flex; flex-direction:column; overflow-y: scroll; background-color: azure">
<p>first row</p>
<p>2 row</p>
<p>3 row</p>
<p>4 row</p>
<p>5 row</p>
<p>6 row</p>
<p>7 row</p>
<p>8 row</p>
<p>9 row</p>
<p>10 row</p>
<p>11 row</p>
<p>12 row</p>
<p>13 row</p>
<p>14 row</p>
<p>15 row</p>
<p>16 row</p>
<p>17 row</p>
<p>18 row</p>
<p>19 row</p>
<p>20 row</p>
<p>3-1 row</p>
<p>3r2 row</p>
<p>3r3 row</p>
<p>3r4 row</p>
<p>3r5 row</p>
<p>3r6 row</p>
<p>3r7 row</p>
<p>last row</p>
</div>
<div>
<p>The last column</p>
</div>
</div>
<div class="bottomRow">Bottom div</div>
</div>
如果我在Windows 10 x64的Chrome(版本70.0.3538.77(官方内部版本)(64位))中运行此代码,则可以按预期运行,但是在Firefox(63.0.1版(64位)中运行该代码时)(正式版本))在同一Windows 10中无法正常运行。
这是Firefox中的结果:
您可以看到顶部div的高度没有100px,底部div不在浏览器窗口的范围内。同样,白色列会忽略 overflow-y:滚动
任何人都可以告诉我在Firefox中无法正常工作的错误之处吗?
PD:我也在Firefox 57中测试了相同的代码,并且得到了与Firefox 63.0.1中相同的结果
答案 0 :(得分:1)
flex-shrink
弹性容器的初始设置为flex-shrink: 1
。这意味着弹性物品可以收缩,以防止容器溢出。您可以使用flex-shrink: 0
禁用此功能。
.topRow {
height: 100px;
flex-shrink: 0;
}
OR
.topRow {
flex: 0 0 100px; /* flex-grow, flex-shrink, flex-basis */
}
有关更多详细信息,请参见我的答案中的 因素flex-shrink
:
min-height: auto
弹性容器的初始设置为min-height: auto
。这意味着弹性项目不能小于其内容的高度。要覆盖此设置,请使用min-height: 0
或overflow: auto
。
.content {
overflow: auto;
}
有关更多详细信息,请参见此帖子:
要了解为什么您的布局在Chrome而不是Firefox上可以工作的原因,请参阅我对以上帖子的回答中的 浏览器渲染说明 部分。
.flex-grid {
display: flex;
flex-direction: column;
height: 100vh;
}
.topRow {
background-color: gray;
height: 100px;
flex-shrink: 0; /* new */
border: 2px solid black;
}
.bottomRow {
background-color: cadetblue;
border: 2px solid black;
/* height: 50px; */
flex: 0 0 50px; /* new */
}
.content {
background-color: orange;
border: 2px solid black;
flex: 1;
display: flex;
flex-direction: row;
justify-content: space-between;
overflow: auto; /* new */
}
body {
margin: 0;
}
<div class="flex-grid">
<div class="topRow">Top div</div>
<div class="content">
<div>
<p>First column</p>
</div>
<div style="display:flex; flex-direction:column; overflow-y: scroll; background-color: azure">
<p>first row</p>
<p>2 row</p>
<p>3 row</p>
<p>4 row</p>
<p>5 row</p>
<p>6 row</p>
<p>7 row</p>
<p>8 row</p>
<p>9 row</p>
<p>10 row</p>
<p>11 row</p>
<p>12 row</p>
<p>13 row</p>
<p>14 row</p>
<p>15 row</p>
<p>16 row</p>
<p>17 row</p>
<p>18 row</p>
<p>19 row</p>
<p>20 row</p>
<p>3-1 row</p>
<p>3r2 row</p>
<p>3r3 row</p>
<p>3r4 row</p>
<p>3r5 row</p>
<p>3r6 row</p>
<p>3r7 row</p>
<p>last row</p>
</div>
<div>
<p>The last column</p>
</div>
</div>
<div class="bottomRow">Bottom div</div>
</div>