代码之家  ›  专栏  ›  技术社区  ›  vcRobe

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

  •  1
  • vcRobe  · 技术社区  · 6 年前

    我试图创建一个这样的布局:

    enter image description here

    底部div 具有50px的固定高度,中间的div使用窗口的可用空间。

    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>

    如果我在Windows10x64中的Chrome(版本70.0.3538.77(官方版本)(64位))中运行此代码,它会像我预期的那样工作,但是当我在同一Windows10中的Firefox(版本63.0.1(64位)(官方版本))中运行它时,它不会像预期的那样工作。

    以下是Firefox的结果:

    enter image description here

    overflow-y:滚动

    谁能告诉我我做错了什么,它在Firefox中不起作用吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Michael Benjamin    6 年前

    flex-shrink

    flex容器的初始设置为 flex-shrink: 1 . 这意味着flex项可以收缩以防止容器溢出。您可以使用禁用此功能 flex-shrink: 0

    .topRow {
       height: 100px;
       flex-shrink: 0;
    }
    

    或者

    .topRow {
       flex: 0 0 100px; /* flex-grow, flex-shrink, flex-basis */
    }
    

    有关更多详细信息,请参阅 这个 因素 我的回答是:


    min-height: auto

    flex容器的初始设置为 最小高度:自动 min-height: 0 overflow: auto .

    .content {
       overflow: auto;
    }
    

    有关详细信息,请参阅此帖子:

    浏览器呈现注释 在我对上述帖子的回答部分。


    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>
    推荐文章