【问题标题】:Flexbox - Elements Inside A Flex Item Contained By A Scrollable Container Not Rendering CorrectlyFlexbox - 可滚动容器包含的 Flex 项目内的元素未正确呈现
【发布时间】:2017-11-27 08:55:39
【问题描述】:

我正在尝试将我的一个网站转换为 flexbox,但遇到了一个涉及在 flex 容器中垂直滚动的问题。 Firefox 似乎可以正确呈现它,但 Chrome/Safari 却没有。 Here's a link to the code.

.container {
  height: 200px;
  border: solid 1px #000;
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
}

.item {
  border: solid 1px red;
  padding: 20px;
  display: flex;
  justify-content: space-between;
}

.item div {
  border: solid 1px green;
}
<div class="container">
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
</div>

由于某种原因,框 1 和 2 文本没有在弹性项目内正确呈现。谁能向我解释这里发生了什么以及如何解决它?

谢谢!

【问题讨论】:

  • 请查看并评论我的回答,如果有不清楚或遗漏的地方,请告诉我。如果没有,那么如果您能接受对您帮助最大的答案,那就太好了。

标签: css google-chrome firefox flexbox


【解决方案1】:

要获得 20 像素的内边距,请将 flex-shrink: 0; 添加到 .item 规则中,它将按预期工作。

它现在不起作用的原因是很多项目都适合200pxcontainer,所以items只是先折叠,因为flex收缩默认为1,这意味着它们被允许收缩,然后,当他们不能再这样做时,他们开始滚动。

如果你让父级更高或删除一些项目,你会看到它的行为是正确的。

.container {
  height: 200px;
  border: solid 1px #000;
  display: flex;
  flex-direction: column;
  overflow-y: scroll;
}

.item {
  flex-shrink: 0;
  border: solid 1px red;
  padding: 20px;
  display: flex;
  justify-content: space-between;
}

.item div {
  border: solid 1px green;
}
<div class="container">
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
  <div class="item">
    <div>box 1</div>
    <div>box 2</div>
  </div>
</div>

【讨论】:

    【解决方案2】:

    只需添加align-items:center 即可获得相同的效果

    更新css部分

    .item {
      border: solid 1px red;
      padding: 20px;
      display: flex;
      align-items: center; /*Add this */
      justify-content: space-between;
    }
    

    .container {
      height: 200px;
      border: solid 1px #000;
      display: flex;
      flex-direction: column;
      overflow-y: scroll;
    }
    
    .item {
      border: solid 1px red;
      padding: 20px;
      display: flex;
      align-items: center; /*Add this */
      justify-content: space-between;
    }
    
    .item div {
      border: solid 1px green;
    }
    <div class="container">
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
    </div>

    只需添加

    .item {
      border: solid 1px red;
      padding: 20px;
      display: flex;
      align-items: center; /* Add this */
      justify-content: space-between;
    }
    

    【讨论】:

    • 我不得不说这实际上并不能正确解决问题,因为item 没有 20 像素的填充。检查我的答案以了解原因。
    【解决方案3】:

    要解决此问题,请对框 div 使用垂直对齐。我认为它与折叠填充有关。我选择了居中对齐,但 flex-start 和 flex-end 也可以。

    .container {
      height: 200px;
      border: solid 1px #000;
      display: flex;
      flex-direction: column;
      overflow-y: scroll;
    }
    
    .item {
      border: solid 1px red;
      padding: 20px;
      display: flex;
      justify-content: space-between;
      align-items: center;
    }
    
    .item div {
      border: solid 1px green;
    }
    <div class="container">
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>
      <div class="item">
        <div>box 1</div>
        <div>box 2</div>
      </div>

    【讨论】:

    • 很难理解 flex-start 和 flex-end 也是如何工作的
    • 它只是将“盒子元素”放在顶部或底部而不是中心
    • 啊...现在我明白你的意思了...折叠的项目:)
    • 我不得不说这实际上并不能正确解决问题,因为item 没有 20 像素的填充。检查我的答案以了解原因。
    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2016-08-09
    • 2015-12-29
    • 1970-01-01
    • 2012-03-20
    • 1970-01-01
    相关资源
    最近更新 更多