麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 網(wǎng)站 > 建站經(jīng)驗 > 正文

Chrome 73導致flex布局崩壞的分析與解決方法

2024-04-25 20:47:30
字體:
來源:轉載
供稿:網(wǎng)友

現(xiàn)象

項目中會存在如下幾種嵌套flex結構:

<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):

Chrome,flex,布局

都是符合期望的結果,scroll是可以滾動的區(qū)域,然而,Chrome 73的展示效果卻是:

Chrome,flex,布局

父元素的高度都被子元素撐開了,導致scroll元素無法滾動。what? why? 納尼?

原因

究其原因,規(guī)范有關高度的解釋在這一章節(jié),簡單概括就是:

flex元素的最小大小(視主軸方向決定是高還是寬)是內部內容的大小。即,min-height/min-width默認值是“auto”。

emmm...讀“規(guī)范”千遍,其義自見。當再三理解這個結論后發(fā)覺,似乎,新版Chrome的實現(xiàn)是符合規(guī)范的!確實,Chrome的此舉改動就是為了讓瀏覽器的flex布局行為更貼近規(guī)范。

Chrome社區(qū)的這個issue:Flexbox rendering changed between chrome 71 and 72,對上面的問題(布局二),進行了激烈的討論,甚至最終導致了官方的回滾。

至于我們?yōu)槭裁春笾笥X,直到73才大面積暴露該問題,下文花絮會展開解釋。

不過,跟著規(guī)范走是完全的政治正確,怎么說都對!開發(fā)者只能順應潮流去改變。

修復

其實,當看到這個現(xiàn)象后,我的內心并沒有經(jīng)歷太大的波動,因為min-width曾經(jīng)已經(jīng)給我上過預備課了(詳見下文花絮)。所以我很快就找到了解放方式。

找到最外層被撐開的元素,上文兩種布局里,都是scroll的直屬父元素,對其增加min-height: 0的屬性即可修復異常布局。

如果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%來修復。但當層級比較多時,需要將該屬性一層層往下傳遞,不夠環(huán)保。

花絮

問題是順利修復了,下面是一些插曲~

1. Chrome 71->72->73

這個改動首發(fā)于Chrome 72,但為什么直到Chrome 73才被我們注意到?因為Chrome 72發(fā)布后,由于反響強烈,Chrome決定先回滾改動,給開發(fā)者更多的時間來適應該改動。

然而Chrome 72的發(fā)布,以及72的后續(xù)回滾發(fā)布都發(fā)生在中國春節(jié)假期期間,沒什么用戶反饋,對于中國開發(fā)者,例如我,完全沒注意到這次預警。。。

2. min-width的學前教育

為什么說我已經(jīng)被min-width提前教育過?

我實現(xiàn)過類似編輯器的tab:

Chrome,flex,布局

這里就是嵌套的flex橫向布局,在默認樣式下,滾動區(qū)會被子元素撐開,也就是此時,我第一次領略了當初就覺得很奇怪的min-width: 0的寫法。

那為什么那時就需要顯式聲明父元素的min-width呢?此外,這次升級所造成的誤傷都是發(fā)生在縱向布局的flex上,那橫向布局的flex有影響嗎?

答案其實很狗血,因為Chrome對于min-width的默認值,從很早期就設置為符合規(guī)范的“auto”了。。。

參考

  1. Flexbox sets height of inside element to 0
  2. MDN min-height
  3. MDN min-width

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到建站經(jīng)驗頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 国产99视频精品免视看9 | 国产九色在线观看 | 成人三级免费电影 | 看一级毛片 | 精品国产中文字幕 | 国产激情网 | 欧美精品一区自拍a毛片在线视频 | av免费在线免费观看 | 神马久久精品综合 | 国产亚洲精久久久久久蜜臀 | 久久久三区 | 国产一级性生活视频 | 国产资源在线免费观看 | 毛片在线视频在线播放 | 中文字幕h | 日韩伦理电影免费观看 | 日韩中文字幕一区二区三区 | 中文字幕 亚洲一区 | 欧美日韩亚洲不卡 | 少妇激情视频 | 国产精品99爱 | 免费高清一级欧美片在线观看 | 中文字幕爱爱视频 | 黄 色 免费网 站 成 人 | 久久久久久久久久久国产精品 | 日本不卡一区二区在线观看 | 日韩毛片免费观看 | 羞羞视频入口 | 中国hdxxxx护士爽在线观看 | 韩国精品久久久 | 久久国产精品二区 | 成人国产精品齐天大性 | 91久久综合 | 性生活视频软件 | 日本在线不卡一区二区 | 国产精品久久久久久久久久免 | 在线成人免费观看视频 | 国产精品性夜天天视频 | 美女扒开腿让男生桶爽网站 | 久久网站热最新地址 | 97综合|