【问题标题】:What's the difference between visibility: hidden and visibility: collapse in flexbox?flexbox 中的可见性:隐藏和可见性:折叠有什么区别?
【发布时间】:2017-07-04 07:24:46
【问题描述】:

CSS flexible box layout module 中,它说:

折叠的弹性项目完全从渲染中移除,但留下一个“支柱”

这和visibility: hidden 一样吗?如果答案是肯定的,那为什么要引入visibility: collapse

【问题讨论】:

    标签: css flexbox language-lawyer specifications


    【解决方案1】:

    关于浏览器支持的说明:截至 2017 年 7 月,Chrome (59) 不支持 visibility: collapse。下面带有collapse 的代码示例在Firefox 和Edge 中工作,但在Chrome 中失败(它们的行为就像hidden)。更新:截至 2020 年 7 月,此注释仍然有效。 Chrome 和 Safari 将 visibility: collapse 视为 hiddencaniuse.com


    根据flex-direction,弹性项目按行或列布局。

    每一行/每一列都被视为一个flex line

    在下面的例子中,一个弹性容器在行方向上有四个弹性项目。第四个项目换行,创建第二条柔性线:

    .container {
      display: flex;
      flex-wrap: wrap;
      width: 200px;
      border: 1px dashed black;
    }
    .box {
      height: 50px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: lightgreen;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    <div class="container">
      <div class="box box1">1</div>
      <div class="box box2">2</div>
      <div class="box box3">3</div>
      <div class="box box4">4</div>
    </div>

    display: none

    使用display: none,浏览器不会呈现弹性项目。

    如果 flex 行上的所有项目都有display: none,则该行也会折叠,这会影响布局的其余部分。弯曲线折叠时,周围的元素可能会移动。

    display: none 应用于第三个项目,第四个项目在上面一行的位置,下面一行折叠:

    .container {
      display: flex;
      flex-wrap: wrap;
      width: 200px;
      border: 1px dashed black;
    }
    .box {
      height: 50px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: lightgreen;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .box3 { display: none; }
    <code>display: none</code>
    <div class="container">
      <div class="box box1">1</div>
      <div class="box box2">2</div>
      <div class="box box3">3</div>
      <div class="box box4">4</div>
    </div>

    visibility: hidden

    使用visibility: hidden,弹性项目由浏览器呈现,但完全透明。它从视图中隐藏,但占用了它通常在布局中使用的空间。因此,周围的元素认为这个项目是完整的。

    在本例中,当最后两个框有visibility: hidden 时,布局的其余部分(包括第二条伸缩线)保持不变。

    .container {
      display: flex;
      flex-wrap: wrap;
      width: 200px;
      border: 1px dashed black;
    }
    .box {
      height: 50px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: lightgreen;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .box3 { visibility: hidden; }
    .box4 { visibility: hidden; }
    <code>visibility: hidden</code>
    <div class="container">
      <div class="box box1">1</div>
      <div class="box box2">2</div>
      <div class="box box3">3</div>
      <div class="box box4">4</div>
    </div>

    visibility: collapse

    使用visibility: collapse,不会渲染弹性项目(与display: none 相同),但弹性算法会检查项目的交叉大小,然后使用该数据来保持弹性线稳定(即交叉如果弹性项目是visible,则该行的大小将是。

    display: none 的不同之处在于collapse 允许保留一件物品(其交叉尺寸)。这在规范中被称为 strut

    因此,如果该行上的所有 flex 项目都具有 visibility: collapse,则该行的交叉大小(无论是宽度还是高度)不会折叠,并且布局的其余部分不会折叠。不受影响。

    请注意,虽然collapse 保证了线的交叉尺寸的稳定性,但它对线的主要尺寸没有提供这样的保证。这是collapsehidden 之间的关键区别。

    以下是一些示例。 (如上所述,这些在 Chrome 中不起作用。在 FF 或 Edge 中测试。)

    在本例中,前两项为visibility: collapse

    .container {
      display: flex;
      flex-wrap: wrap;
      width: 200px;
      border: 1px dashed black;
    }
    .box {
      height: 50px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: lightgreen;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .box1, .box2 {
      visibility: collapse;
    }
    <code>visibility: collapse</code>
    <div class="container">
      <div class="box box1">1</div>
      <div class="box box2">2</div>
      <div class="box box3">3</div>
      <div class="box box4">4</div>
    </div>

    布局呈现为display: none。第二行折叠,因为项目的主要尺寸消失了,让最后一个项目自然地向上移动。

    在以下示例中,所有项目都获得visibility: collapse。因此,第二行折叠,因为项目的主要尺寸消失了,但第一行的交叉尺寸仍然存在。

    .container {
      display: flex;
      flex-wrap: wrap;
      width: 200px;
      border: 1px dashed black;
    }
    .box {
      height: 50px;
      flex: 0 0 50px;
      margin: 5px;
      background-color: lightgreen;
      display: flex;
      justify-content: center;
      align-items: center;
    }
    .box {
      visibility: collapse;
    }
    <code>visibility: collapse</code>
    <div class="container">
      <div class="box box1">1</div>
      <div class="box box2">2</div>
      <div class="box box3">3</div>
      <div class="box box4">4</div>
    </div>

    jsFiddle

    【讨论】:

    • 简而言之:因为可见性:隐藏实际上并不影响布局,不,它们根本不一样。
    • 非常感谢!规范说 webkit 通过了折叠项目的测试,所以我认为 chrome 的行为是正确的,并且没有用 firefox 和 edge 进行测试。再次感谢!
    【解决方案2】:

    它实际上取决于元素。如果在表格子元素上使用,collapse 将隐藏该元素以及它占用的空间。

    collapse 如果用于任何不是表格子元素的元素,其行为将类似于 hidden

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 2013-11-08
      • 1970-01-01
      • 2013-06-27
      • 2019-04-13
      • 2011-04-11
      • 2012-05-10
      • 2017-01-15
      • 2010-10-25
      相关资源
      最近更新 更多