歡迎關注個人公衆號睿Talk
,獲取我最新的文章:
css
最近在項目裏遇到了一個 Flex 佈局的問題,才發現本身對它的理解仍是停留在淺顯的水平,遇到一些特殊狀況就不知道如何處理。因而找了些資料深刻學習一下,而後將個人學習心得總結成這篇文章。segmentfault
先講講我遇到的問題。我但願實現一個左中右三列的佈局,其中左右部分固定寬度,中間部分自適應:
佈局
實現起來很簡單,代碼以下:學習
<div class="container"> <div class="left">left</div> <div class="middle"> middle </div> <div class="right">right</div> </div> .container { display: flex; width: auto; height: 300px; background: grey; } .left { flex-basis: 200px; background: linear-gradient(to bottom right, green, white); } .middle { flex: 1; background: linear-gradient(to bottom right, yellow, white); } .right { flex-basis: 300px; background: linear-gradient(to bottom right, purple, white); }
到此爲止一切都很美好。但遇到中間部份內容很長的時候,UI 就變形了:
flex
爲了固定住左右部分的寬度,須要給 left 和 right 加上flex-shrink: 0
。但加上後容器的寬度就被撐開了,頁面底部出現了滾動條:
spa
而我指望的效果是滾動條出如今中間部分,整個頁面不能滾動。解決方法是給 middle 加上overflow: scroll
:
code
此時的完整代碼以下:blog
<div class="container"> <div class="left">left</div> <div class="middle"> middle <!-- 寬度爲800px的內容--> <div class="long">long</div> </div> <div class="right">right</div> </div> .container { display: flex; width: auto; height: 300px; background: grey; } .left { flex-basis: 200px; flex-shrink: 0; background: linear-gradient(to bottom right, green, white); } .middle { flex: 1; overflow: scroll; background: linear-gradient(to bottom right, yellow, white); } .right { flex-basis: 300px; flex-shrink: 0; background: linear-gradient(to bottom right, purple, white); } .long { width: 800px; }
完整的 codepen
在這裏ip
實戰經驗到此結束,下面咱們再深刻學習涉及到的知識點。get
先來說講上面用到的屬性flex: 1
。它實際上是一個縮寫,等價於flex: 1 1 0
,也就是
flex-grow : 1; flex-shrink : 1; flex-basis : 0;
下面來說講 flex 空間分配的步驟。
假設有一個寬度爲 800 的容器,裏面有 3 個項目,寬度分別是 100,200,300:
<div class="container"> <div class="left">left</div> <div class="middle">middle</div> <div class="right">right</div> </div> .container { display: flex; width: 800px; height: 300px; background: grey; } .left { flex-basis: 100px; background: linear-gradient(to bottom right, green, white); } .middle { flex-basis: 200px; background: linear-gradient(to bottom right, yellow, white); } .right { flex-basis: 300px; background: linear-gradient(to bottom right, purple, white); }
效果以下:
這時候就出現了多餘的 200 的空間(灰色部分)。這時候若是咱們對左中右分別設置flex-grow
爲 2,1,1,各個項目的計算邏輯以下:
假設父容器寬度調整爲 550,裏面依然是 3 個項目,寬度分別是 100,200,300,這時候空間就不夠用溢出了。首先要理解清楚,當咱們定義一個固定寬度容器爲flex
的時候,flex
會盡其所能不去改變容器的寬度,而是壓縮項目的寬度。這時咱們對左中右分別設置flex-shrink
爲 1,2,3,計算邏輯以下:
若是咱們不想項目被壓縮,就必須將flex-shrink
設爲 0。仍是用上面的例子,當左中右的flex-shrink
都爲 0 的時候,就會衝破寬度限制,container的寬度將會從 550 變爲 600。
codepen
在這裏
flex-basis
指定項目佔據主軸的空間,若是不設置,則等於內容自己的空間:
本文從問題出發,講解了Flex
佈局在實戰中的應用,並深刻到flex-grow
,flex-shrink
和flex-basis
的細節,描述了項目空間在填充和溢出狀況下的計算方式,但願對你有所幫助。