Chrome72 嵌套 flex 布局修改,你的網站可能會發生布局錯亂

2021-02-25 掘金開發者社區
起源

2019 年 1 月 29 日,Chrome72 正式版(72.0.3626.81)發布,本次發布帶來了一個改變,且沒有在更新日誌中提及,該改變導致某些網站發生了布局錯亂。該改變主要針對的是嵌套的flex布局,下面我們一起看下是怎麼回事。

問題

首先,我們有一個嵌套的 flex 布局,代碼如下:

<style>

div {

   box-sizing: border-box;

}

.flex {

   display: flex;

   flex-direction: column;

}

.area {

   padding: 10px;

   height: 300px;

   width: 300px;

   background-color: #3fb9ab;

   color: #fff;

}

.item {

   padding: 10px;

   flex: 1;

   background-color: #158c7e;

}

.nest-item {

   flex: 1;

   overflow: auto;

   background-color: #046b5f;

}

.content {

   padding: 10px;

   height: 600px;

}

</style>

<div class="area flex">

   area

   <div class="item flex">

       item

       <div class="nest-item">

           <div class="content">content</div>

       </div>

   </div>

</div>

希望實現這樣的效果:父容器 area 有一個指定的高度,且它是一個 flex 彈性盒子,它內部有一個子元素 item,使用 flex:1 指定了佔滿剩餘空間,且 item 也是一個 flex 彈性盒子,它內部還有一個同樣佔滿剩餘空間的嵌套子元素 nest-item,通過設置 overflow:auto 讓它的內容超出後顯示滾動條。效果如下:

這樣布局的想法很簡單,即通過設置彈性盒子子元素的擴展比率,能得到一個自動佔滿剩餘空間高度的容器,再在這個容器中放需要顯示的內容,在某些情況下,這確實是一個比較不錯的主意,在 Chrome72 之前都是可以正常顯示的。但是 Chrome72.0.3626.81中顯示如下:

追溯

為什麼會出現這樣的問題呢?我們看一下規範( https://drafts.csswg.org/css-flexbox/#min-size-auto )flex 彈性盒子主軸上子元素的最小大小是內容的大小(視主軸方向為寬或高)。

那麼我們再看一下上面的例子,area 的主軸是縱向的,子元素 item 的最小高度即是內容的高度,而 nest-item 被 content 撐開,content 有一個高度(600px,超出了容器的高度),那麼 item 的最小高度也就超過了 600px。這樣一來,一層層都是被內容撐開,也就沒有出現滾動條了,這樣似乎是符合規範預期的。

在 chromium 的 issue 反饋中,有人提到了這個問題( https://bugs.chromium.org/p/chromium/issues/detail?id=927066 ),根據回復,這正是官方為了讓 Chrome 更加符合規範行為而做的調整。也就是說,Chrome72 之前的版本,這算是一個沒有按照規範行為而出現的 bug。新的調整,其實就是讓 flex 彈性盒子的子元素最小高度的默認行為應用 min-height:min-content ,就像官方回覆中提到的那樣,讓子元素作為 flex 彈性盒子時卻和普通盒子處理方式不同是會讓人困惑的。

解決方法

既然知道了原因,那麼如果我們還想使用這樣的布局方式,該怎麼做呢?

對的,我們給 item 指定一個最小高度,讓它不使用默認的行為(即內容的高度),一般我們指定最小高度為0 min-height:0。給 item 加上這個樣式後,我們再看一下效果:

嗯,已經符合我們的預期了。為了驗證規範中提到的對主軸方向的行為,我們修改一下代碼,將主軸設置為水平方向試試,代碼如下:

<style>

div {

   box-sizing: border-box;

}

.flex {

   display: flex;

   flex-direction: row;

}

.area {

   padding: 10px;

   height: 300px;

   width: 300px;

   background-color: #3fb9ab;

   color: #fff;

}

.item {

   padding: 10px;

   flex: 1;

   background-color: #158c7e;

}

.nest-item {

   flex: 1;

   overflow: auto;

   background-color: #046b5f;

}

.content {

   padding: 10px;

   width: 600px;

}

</style>

<div class="area flex">

   area

   <div class="item flex">

       item

       <div class="nest-item">

           <div class="content">content</div>

       </div>

   </div>

</div>

效果如下:

看來主軸為水平方向時,是符合規範預期行為的(Chrome72 及以前的版本都符合),那麼我們給 item 加上一句樣式 min-width:0 ,效果如下:

嗯,是符合我們預期的。

結語

好了,現在你已經知道是怎麼一回事了,可是等等,你說你升級到Chrome72沒有發現我說的問題?

那是因為官方注意到這個修改會影響到一些網站的正常顯示,因此在 2019 年 2 月 6 日(正是春節假期間)發布的 Chrome72.0.3626.96 中,將這個問題還原回以前的行為了( https://chromium.googlesource.com/chromium/src/+/032ef9666487db1d04b656a095b041de8c6d2b63 )。

官方的意思是為了避免這個修改給某些網站帶來的不好的影響,因此預留時間給大家修改,等到Chrome73將會發布這一改變。所以為了未來更好的瀏覽體驗,檢查一下你的頁面吧!

相關焦點

  • android studio布局嵌套_android studio相對布局和線性布局嵌套...
    ,可以讓你拖拉 UI 控制項並進行效果預覽Android Studio七大布局在設計的時候,我們可以根據要設計的程序,採用適合的布局,在Android中有七大布局,分別是:LinearLayout(線性布局)RelativeLayout(相對布局)TableLayout(表格布局)
  • 如何用一行CSS分別實現10種現代布局?
    ; flex-wrap: wrap; justify-content: center; } .ex2 .box { flex: 1 1 150px; flex: 0 1 150px; margin: 5px; }源碼地址:https://codepen.io/una/pen/WNQdBza03、經典的側邊欄
  • 【前端知識】Flexbox,更優雅的布局
    這套框架用來實現布局的方式,不是以往的 float,而是用了 Flexbox。Flexbox 是什麼呢?就 W3C 官方給到的解釋是,這是設計來實現更複雜的版面布局。那我自己對他的定義是,Flexbox 從本質上就是一個 Box-model 的延伸,我們都知道 Box-model 定義了一個元素的盒模型,然而 Flexbox 更進一步的去規範了這些盒模型之間彼此的相對關係。
  • 【新網】6類經久不衰的網站布局設計
    網站布局設計,是根據企業希望向瀏覽者傳遞的信息(包括產品、服務、理念、文化),進行網站功能策劃,然後進行的頁面設計美化工作。作為企業對外宣傳物料的其中一種,精美的網頁設計,對於提升企業的網際網路品牌形象至關重要。
  • 網站SEO關鍵詞布局?如何創建關鍵詞詞庫?
    如果網站已經上線,並有配置訪客統計工具,可以看來客戶來源搜索詞,會給你一定參考。熟悉產品,熟悉用戶,熟悉自身企業,自然就會知道用戶關注的焦點,就可以收集整理出相應的關鍵詞來。 公共渠道—— 一些平臺提供關鍵詞數據,比如搜尋引擎自己的關鍵詞工具(百度、google都有)、5118、站長工具等等。
  • 科普:服飾網站建設該怎麼布局策劃
    自助建站費用一年從免費到幾百塊、小几千不等;定製成本較高,通常幾萬到十幾萬之間;自建團隊開發就更貴了,跟你的團隊人數及用人成本相關。選擇建站方式時,商家需要考慮服裝網站建設費用預算的問題,如果你預算不多,那麼就可以使用自助建站系統。這種建站方式也比較快,選一個模板再添加需要的版塊就行,零基礎新手也能快速做好。
  • SEO網站內鏈優化結構如何進行布局?
    那麼,網站內鏈優化結構如何進行布局呢?接下來就跟隨小編一起來了解下吧!1、網站導航每一個網站中,都是有著自己的導航欄的,基本上離首頁越近的欄目,傳遞權重越高,基本上每個欄目頁都是環繞著網站核心關鍵詞定位的,散布欄目頁去布局,不管是什麼樣的網站都是如此,每一個欄目頁都清楚地表達了此欄目頁的用意,這樣欄目頁的構建都是環繞用戶體會而提高的,用戶能夠通過搜尋引擎輸入感興趣的首要關鍵詞或許品牌詞能夠快速找到自己想看到的頁面
  • 合肥網站建設 網頁排版布局有哪些原則
    合肥網站建設,首先需要對網頁的排版設計進行合理布局。那在企業網站建設中,哪些合理布局才算是受到用戶喜歡的網頁排版布局呢?接下來小編就來為大家介紹網頁排版布局有著哪些原則?3、遍布率遍布率就是指網頁上邊全部原素在網頁頁面上應遍布勻稱,例如logo仰頭原素小,分配在網頁上邊一小部分,突現公司整體實力品牌形象的宣傳海報,關鍵點大一點版塊,部位最好是分配在中間,用戶一開啟網站,就能吸引用戶的眼光。總而言之大家分配網頁布局時以考慮到既能便捷用戶訪問、又能兼具美觀大方實際效果最好。
  • 常見客戶SEO問題解答:網站關鍵詞布局到底是什麼
    網站關鍵詞布局到底是什麼 密度需要做到一定的度,在網站所有頁面都必須出現這些關鍵詞 網站關鍵詞布局到底是什麼
  • 網站建設關鍵詞攻略:四川極客空間如何讓關鍵詞布局符合SEO思維
    關鍵詞廣義上講就是在用戶通過搜尋引擎進行搜索信息的時候,通過這些信息而可以找到你網站的詞語就是關鍵詞。 同時, 關鍵詞可以是一個字,也可以是一個詞語,同時也可以是一句簡單的話。如果從代碼中講解,關鍵詞就是網頁代碼中頭部文件中的一串字符,一般我們都將關鍵詞用 keywords來表示。
  • Chrome 沒插件,香味少一半,用Chrome瀏覽器這些插件怎麼能沒有
    俗話說Chrome 沒插件,香味少一半,Chrome 最大的優勢還是其支持眾多強大好用的擴展程序,使用Chrome瀏覽器的最大魅力就是插件了,今天,小編就來一起盤點一下chrome上那些相見恨晚的擴展。
  • 臥室最實用的掛衣架是哪一種 臥室整體布局是怎麼樣的
    購買褲架最好是選擇像的那種鈦合金鋁材料的,而且上面帶有凹凸紋路的,這樣的紋路會讓你在掛褲子的時候不會掉落。臥室整體布局是怎麼樣的1、小面積簡單布局圖示為普通小型臥室,其佔用臥室二分之一的空間,整體看,臥室主要功能作為休息區域而存在居室布局,重要性居於所有家庭規劃中首要地位,從宏觀面上的比較(以全景式的觀測面)審視,規劃是根據整體中的使用感受而做出布局決定。
  • 精通移動端布局 - 概念篇
    如果現在去縮放瀏覽器,我們會發現2px*2px的尺寸會隨著縮放而發生變化。實際上現代瀏覽器的縮放功能就是通過拉伸像素的方式實現的。而這種拉伸像素的方式也更能夠讓我們清晰了解獨立像素與物理像素之間的差異。
  • 使用Chrome DevTools優化網站速度
    他建立了一個網站,以便粉絲們可以了解他最喜歡的食物。他的歌迷喜歡這個網站,但是 Tony 一直抱怨網站加載緩慢。Tony 現在向你求助,以幫助他提升網站加載速度。設置首先,我們需要設置站點,以便以後可以對其進行更改:• 轉到 chrome://version 查看您使用的Chrome版本。本教程是基於 Chrome 68。如果您使用的是早期版本或更高版本,那麼某些功能可能看起來有所不同或不可用。不過您應該仍然能夠完成本教程,只需記住您的UI看上去可能與屏幕截圖有所不同。
  • EXCEL中"IF"函數的嵌套用法
    所以就需要使用到IF()函數嵌套方式進行判斷。      函數嵌套的意思就是在函數裡面嵌套另一個函數。在office2003版以前的Excel僅允許嵌套7層函數。而到了2007版以後的Excel中最多可以允許嵌套64層函數。也就是說,我們可以:IF(IF(IF(IF(IF(IF(.)下去一共IF64次。
  • 契合Chrome 深色模式:谷歌搜索結果頁將可隨深色顯示
    IT之家5月8日消息 根據外媒9to5Google的消息,谷歌正計劃將「黑暗模式」引入谷歌搜索結果頁,未來也可能會將旗下其他的網頁也引入Android版Chrome的黑暗模式。但是在切換為深色模式後,Chrome只會將瀏覽器 UI和「新標籤頁」的頁面更改為深色,網站還是淺色的主題。即使是谷歌自家的搜索和搜索結果頁面也仍然是淺色的。不過現在,谷歌正在改變這個問題。外媒在Chromium原始碼存儲庫中中的新代碼更改內容中發現了這個信息。該代碼將在chrome:// flags中添加一個新標誌,該標誌提供了相當簡單的描述。
  • 優愛騰芒下半年72部綜藝,布局差異有哪些?
    除了具體的節目內容創新,從平臺角度出發來看,策略和布局更顯重要性。簡言之,愛奇藝主打王牌綜藝影響力,並試水推出潮系新綜藝。騰訊視頻則採取遍地開花的策略,各類節目全面鋪開。芒果TV將「姐姐系」綜藝價值最大化,並逐步試水新品類綜藝。而優酷則將「直播帶貨」元素深度融入到內容之中,凸顯自身電商的基因與構架。愛奇藝—王牌綜N代+創新綜一代,疊加創新組合形態。
  • 72小時消滅中國海軍,臺海布局才能完成
    72小時消滅中國海軍,臺海布局才能完成據俄羅斯衛星通訊社報導,美國一向都非常有野心,總是想要插手各個國家的內政。只以前美國是世界霸主,很多國家只能敢怒不敢言,畢竟有阿富汗的例子擺在那裡。一旦美國不高興,或者美國想要獲得更多的利益,隨便找一個「洗衣粉」的理由都可以開戰。美國所謂的正義和維護世界安定,純粹就是為自己發動戰爭找的藉口。
  • 自媒體引流,你知道布局關鍵詞的重要性嗎?
    為什麼要布局「關鍵詞」?百度百科中對關鍵詞的解釋是,用戶在使用搜尋引擎時,輸入的能夠最大程度概括用戶所要查找的信息內容。簡單來說,就是用戶想要獲取某項信息時會去搜索的詞。因此,我們要站在用戶搜索習慣的基礎上,提前設置好會被搜索的詞彙,才能讓用戶一搜索出來就能看到我們,自然就能達到我們宣傳的目的,從而使得用戶找到我們。
  • 江南百景圖紫禁城怎麼布局 紫禁城布局推薦
    江南百景圖 杭州府前朝後市怎麼布局呢?