项目中会存在以下几种嵌套flex结构:css
<style> /* 通用样式 */ .card { width: 200px; height: 300px; margin: 20px; border: 1px solid #999; } .flex { display: flex; flex-direction: column; } .header { flex: none; height: 40px; border-bottom: 1px solid #333; } .scroll { overflow-y: auto; } .p { margin: 10px; height: 400px; background-color: rgba(0, 0, 0, 0.2); } </styl> <!-- 布局一 --> <div class="card flex"> <div class="header">Header</div> <div class="flex"> <div class="scroll"> <div class="p"></div> </div> </div> </div> <!-- 布局二 --> <div class="card flex"> <div class="flex"> <div class="header">Header</div> <div class="scroll" style="flex-grow:1;"> <div class="p"></div> </div> </div> </div> 复制代码
这在Chrome 73以前的实际展现效果以下(手头的Electron——Chrome 69): html
究其缘由,规范有关高度的解释在这一章节,简单归纳就是:chrome
flex元素的最小大小(视主轴方向决定是高仍是宽)是内部内容的大小。即,min-height/min-width默认值是“auto”。浏览器
emmm...读“规范”千遍,其义自见。当再三理解这个结论后发觉,彷佛,新版Chrome的实现是符合规范的!确实,Chrome的此举改动就是为了让浏览器的flex布局行为更贴近规范。编辑器
Chrome社区的这个issue:Flexbox rendering changed between chrome 71 and 72,对上面的问题(布局二),进行了激烈的讨论,甚至最终致使了官方的回滚。ide
至于咱们为何后知后觉,直到73才大面积暴露该问题,下文花絮会展开解释。布局
不过,跟着规范走是彻底的政治正确,怎么说都对!开发者只能顺应潮流去改变。flex
其实,当看到这个现象后,个人心里并无经历太大的波动,由于min-width
曾经已经给我上过预备课了(详见下文花絮)。因此我很快就找到了解放方式。flexbox
找到最外层被撑开的元素,上文两种布局里,都是scroll的直属父元素,对其增长min-height: 0
的属性便可修复异常布局。spa
若是min-height的行为实在没法理解的话,overflow: hidden
(非visible)也能达到一样的功效。overflow平时用的比较多,相对会更有体感,以下例:
<div style="height: 200px;overflow: scroll;">
<div style="height: 400px"></div>
</div>
复制代码
当父元素设置了overflow:hidden/scroll,展现时,父元素就会隐藏子元素的溢出部分。
固然,flex布局中的overflow,它的实际做用也就是把min-height
设置为0。
此外,还能够对子元素,上文示例中即scroll元素,设置height: 100%
来修复。但当层级比较多时,须要将该属性一层层往下传递,不够环保。
问题是顺利修复了,下面是一些插曲~
这个改动首发于Chrome 72,但为何直到Chrome 73才被咱们注意到?由于Chrome 72发布后,因为反响强烈,Chrome决定先回滚改动,给开发者更多的时间来适应该改动。
然而Chrome 72的发布,以及72的后续回滚发布都发生在中国春节假期期间,没什么用户反馈,对于中国开发者,例如我,彻底没注意到此次预警。。。
为何说我已经被min-width提早教育过?
我实现过相似编辑器的tab:
这里就是嵌套的flex横向布局,在默认样式下,滚动区会被子元素撑开,也就是此时,我第一次领略了当初就以为很奇怪的min-width: 0
的写法。
那为何那时就须要显式声明父元素的min-width
呢?此外,此次升级所形成的误伤都是发生在纵向布局的flex上,那横向布局的flex有影响吗?
答案其实很狗血,由于Chrome对于min-width
的默认值,从很早期就设置为符合规范的“auto”了。。。