【问题标题】:Why do flex items wrap instead of shrink?为什么弹性项目会包裹而不是收缩?
【发布时间】:2017-01-20 06:52:39
【问题描述】:

我想知道是否有人可以简单介绍一下如何计算 flexbox 布局,尤其是优先级顺序,例如:

    <div id="container" style="display: flex; flex-direction: row; flex-wrap:wrap;">
    <div style="flex: 1 0 200px; height:200px; background-color: lightgreen;"></div>
    <div style="flex: 1 1 400px; height:200px; background-color: lightyellow;"></div>
    <div style="flex: 1 0 200px; height:200px; background-color: lightblue;"></div>
</div>

如果我让容器宽度小于 600 像素,我觉得很有趣; wrap 会在收缩前生效(我将第二个黄色块设置为flex: 1 1 400px;),它变成 3 行,然后收缩生效,直到容器达到 200px;

我想知道决定 flexbox 布局的顺序/规则是什么?为什么它不只是从 400 块缩小?

即使我也将所有三个块都设置为flex: 1 1 their basis size;,换行仍然首先发生。

谢谢

【问题讨论】:

    标签: html css flexbox


    【解决方案1】:

    请参阅规范中的Flex Layout Algorithm

    1. Initial Setup
    2. Line Length Determination
    3. Main Size Determination
    4. Cross Size Determination
    5. Main-Axis Alignment
    6. Cross-Axis Alignment
    7. Resolving Flexible Lengths
    8. Definite and Indefinite Sizes
    9. Intrinsic Sizes

    首先,在第 3 步,将弹性项目收集到弹性线中。

    稍后,在第 7 步,它们会弯曲(增长、收缩或保持不变)。

    所以是的,flex-wrap,它决定如何将弹性项目收集到弹性行中,比 flex-shrink 具有更多的“优先级”。

    【讨论】:

    • 感谢您的解释
    【解决方案2】:

    flex-shrink 属性通常在单行 flex 容器 (flex-wrap: nowrap) 中派上用场

    换句话说,当 flex 项目不能换行时,flex-shrink 将使它们在容器太小时收缩(规范称之为 负可用空间)。这具有防止弹性项目溢出容器的效果。

    但是,在多行弹性容器 (flex-wrap: wrap) 中,大多数时候不会创建负的可用空间,因为弹性项目可以创建额外的行。一个例外是当多行容器中的多行容器(比方说行方向)窄到足以包装所有项目时。这会将项目堆叠在一个列中。现在它们将收缩或保持坚挺,具体取决于flex-shrink (demo)。

    您有一个行方向的、启用了 wrap 的 flex 容器,其中包含三个 flex 项。

    • div #1 ~ flex: 1 0 200px
    • div #2 ~ flex: 1 1 400px
    • div #3 ~ flex: 1 0 200px

    当容器大于 800px 时,所有项目都保持在线。

    当容器低于 800px 时,div #3 将换行(即使可以缩小,也无需缩小)。

    在 600px 标记处(div #1 和 #2 的组合宽度),div #2 换行。同样,无需缩小。

    #container {
      display: flex;
      flex-direction: row;
      flex-wrap: wrap;
    }
    div:nth-child(1) {
      flex: 1 0 200px;
      height: 200px;
      background-color: lightgreen;
    }
    div:nth-child(2) {
      flex: 1 1 400px;
      height: 200px;
      background-color: lightyellow;
    }
    div:nth-child(3) {
      flex: 1 0 200px;
      height: 200px;
      background-color: lightblue;
    }
    <div id="container">
      <div></div>
      <div></div>
      <div></div>
    </div>

    来自规范:

    flex-shrink

    [此属性] 指定 flex 收缩因子,它决定如何 弹性项目将相对于其余弹性项目缩小 分配负可用空间时在弹性容器中。

    【讨论】:

    • 感谢您的解释
    • 我不明白为什么规范没有说明 flex-shrink 仅适用于单行 flex 容器。在 flex-shrink 属性描述下声明是一件简单的事情,但他们决心尽可能地使其混乱。
    • @Magnus,这不准确。在多行容器 (wrap) 中,假设在行方向上,项目可能会在收缩之前换行。但最终,当它们都堆叠在一个列中时,它们会缩小或保持牢固,具体取决于flex-shrink。测试一下:jsfiddle.net/19q4aeh5
    • 感谢您的快速反馈。那很有意思。但是,如果我们在容器上设置一个较小的宽度,是否会添加一个(或多个)额外的行?如果包装总是首先发生,那么物品怎么会从它们的主要尺寸缩小。
    • 不完全确定您的意思。你可以发布一个插图(也许使用我之前评论中的代码)? @马格努斯
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 2016-05-10
    • 2020-12-16
    相关资源
    最近更新 更多