flexbox 中的可见性:隐藏和可见性:折叠有啥区别?

Posted

技术标签:

【中文标题】flexbox 中的可见性:隐藏和可见性:折叠有啥区别?【英文标题】: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

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于flexbox 中的可见性:隐藏和可见性:折叠有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

CSS col 可见性:折叠在 Chrome 上不起作用

处理 Mozilla Firefox 中的“可见性:折叠”错误都有哪些好的解决方法?

在 RowDetailsTemplate 中隐藏/折叠图像

WPF 可见性折叠保留空间

具有折叠行的 HTML 表:如果“可见性:折叠”和“溢出:自动”出现错误

WPF ComboBoxItem 内的折叠可见性