Flexbox代码中意外的行为控制溢出

时间:2018-11-08 23:07:04

标签: css css3 google-chrome firefox flexbox

我正在尝试创建这样的布局:

enter image description here

顶部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中的结果:

enter image description here

您可以看到顶部div的高度没有100px,底部div不在浏览器窗口的范围内。同样,白色列会忽略 overflow-y:滚动

任何人都可以告诉我在Firefox中无法正常工作的错误之处吗?

PD:我也在Firefox 57中测试了相同的代码,并且得到了与Firefox 63.0.1中相同的结果

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: 0overflow: auto

.content {
   overflow: auto;
}

有关更多详细信息,请参见此帖子:

要了解为什么您的布局在Chrome而不是Firefox上可以工作的原因,请参阅我对以上帖子的回答中的 浏览器渲染说明 部分。


jsFiddle demo

 .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>