Flexible Box 模型,通常被稱為 flexbox,是一種一維的佈局模型。它給 flexbox 的子元素之間提供了強大的空間分佈和對齊能力。
- 基本介紹
- 瀏覽器相容性
- 啟用Flexbox
- 容器屬性
- 行||列 對齊 ==row and columns==
- 水平||垂直 對齊 ==Vertical and horizontal==
- 更改水平對齊 ==change horizontal alignment==
- 更改垂直對齊 ==change vertical alignment==
- 關於基準線 ==about baseline==
- 換行 ==wrap==
- flex元素上的屬性
- order
- align-self
- flex-grow
- flex-shrink
- flex-basis
- flex
介紹
Flexbox,也稱為靈活盒模組,是兩個現代佈局系統之一,還有CSS Grid。與CSS Grid(二維)相比,flexbox是一維佈局模型。它將基於行或列控制佈局,但不能同時控制佈局。flexbox的主要目標是允許專案填充其容器提供的整個空間,具體取決於您設定的一些規則。Flexbox不相容IE10以下,IE10以下可以使用如下方式:
- Table layouts
- Floats
- clearfix hacks
- display: table hacks
相容性
IE10以下不相容,一些瀏覽器需要使用-webkit或者display:-webkit-box相容處理。
使用flexbox
display:flexbox
複製程式碼
或者
display:inline-flexbox
複製程式碼
容器屬性
- flex-direction
- justify-content
- align-items
- flex-wrap
- flex-flow
行對齊或者列對齊
flex-direction決定容器以行對齊還是列對齊。
- flex-direction:row,行對齊,從左到右
- flex-direction:row-reverse,行對齊,從右到左
- flex-direction:column,列對齊,從上到下
- flex-direction:column-reverse,列對齊,從下到上
如下圖所示:
水平對齊或者垂直對齊
flex-direction預設是row,從左向右,當其屬性值為column時,是從上到下,可以使用justify-content和align-items改變水平和垂直對齊。
改變水平對齊方式
justify-content有5個屬性值:
- flex-start 左對齊
- flex-end 右對齊
- center 居中對齊
- space-between 首尾對齊容器左右側,中間間距相等
- space-around 每個元素的間距相等
改變垂直對齊方式
align-items有5個屬性值:
- flex-start 頂部對齊
- flex-end 底部對齊
- center 居中對齊
- baseline 基線對齊
- stretch 拉伸以適應容器
關於align-items:baseline,可以看看codepen:codepen.io/flaviocopes…
換行
預設情況下,flexbox容器中的專案保留在一行中,縮小它們以適合容器。
可以使用flex-wrap:wrap或者flex-wrap:wrap-reverse對容器中的元素進行換行處理。
一種簡寫方式:flex-flow:row wrap;即flex-direction:row && flex-wrap:wrap
適用於flexbox容器內每個元素的屬性
- order
- align-self
- flex-grow
- flex-shrink
- flex-basis
- flex
order-改變元素的順序,如下圖所示,可以指定某個元素的order值,以改變其位置,預設值為0
align-self-元素使用align-self覆蓋容器的align-items對當前元素的對齊方式
flex-grow || flex-shrink 如有必要,可以增加或縮小某個元素
flex-grow:預設值為0,當某個元素flex-grow為1,另一個為2,則為flex-grow:2的元素佔用flex-grow:1的空間的2倍。
flex-shrink:預設值為1,如果沒有顯示定義該屬性,將會自動按照預設值1在所有因子相加之後計算比率來進行空間收縮。
比如:有這麼一個容器,div>.box13+.box22父容器定義寬度為500px,子元素定義寬度為120px,box1的flex-shrink為1,.box2的flex-shrink為2,那麼子項相加之後即為 600 px,超出父容器 100px。那麼超出的 100px 需要被 A、B、C、D、E 消化 通過收縮因子,所以加權綜合可得 1001+1001+1001+1002+100*2=700px。
於是我們可以計算 A、B、C、D、E 將被移除的溢位量是多少:
A 被移除溢位量:(100*1/700)*100,即約等於14px
B 被移除溢位量:(100*1/700)*100,即約等於14px
C 被移除溢位量:(100*1/700)*100,即約等於14px
D 被移除溢位量:(100*2/700)*100,即約等於28px
E 被移除溢位量:(100*2/700)*100,即約等於28px
最後A、B、C、D、E的實際寬度分別為:120-14=106px, 120-14=106px, 120-14=106px, 120-28=92px,120-28=92px
複製程式碼
flex-basis-用於設定或檢索彈性盒伸縮基準值,預設值為auto,其與width的區別可以參考這篇文章:www.jianshu.com/p/17b1b445e…
flex:有三個屬性值
- flex-grow
- flex-shrink
- flex-basis
flex: 0 1 auto
分別對應flex-grow、flex-shrink、flex-basis
複製程式碼
結尾
友情獻上小遊戲,通過遊戲學習flexbox