Flex 布局的教程
前言:以前也經常用flex布局,但是最近看到別人使用的時候,發覺以前自己還是不夠理解這個,重新看了一遍http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
一、Flex 布局是什麽?
Flex 是 Flexible Box 的縮寫,意為"彈性布局",用來為盒狀模型提供很大靈活性。
所有容器都可以指定為flex布局
.box{ display: flex; }
行內元素也可以
.box{ display:inline- flex; }
如果是Webkit 內核的瀏覽器,加上-webkit
前綴
.box{ display: -webkit-flex; /* Safari */ display: flex; }
ps:設為 Flex 布局以後,子元素的float
、clear
和vertical-align
屬性將失效。
二、基本概念
采用 Flex 布局的元素,稱為 Flex 容器(flex container),簡稱"容器"。其他概念我就不詳述了。
三、容器的屬性
以下6個屬性設置在容器上。
flex-direction flex-wrap flex-flow justify-content align-items align-content
flex-direction屬性
flex-direction
屬性決定主軸的方向(即項目的排列方向)。
.box { flex-direction: row | row-reverse | column | column-reverse; }
row(默認值):主軸為水平方向,起點在左端。 row-reverse:主軸為水平方向,起點在右端。 column:主軸為垂直方向,起點在上沿。 column-reverse:主軸為垂直方向,起點在下沿。
flex-wrap屬性
.box{ flex-wrap: nowrap | wrap | wrap-reverse; } nowrap(默認):不換行 wrap:換行,第一行在上方。 wrap-reverse:換行,第一行在下方。
flex-flow
flex-flow屬性是flex-direction屬性和flex-wrap屬性的簡寫形式,默認值為row nowrap。 .box { flex-flow: <flex-direction> || <flex-wrap>; }
justify-content屬性
.box { justify-content: flex-start | flex-end | center | space-between | space-around; }
flex-start
(默認值):左對齊flex-end
:右對齊center
: 居中space-between
:兩端對齊,項目之間的間隔都相等。space-around
:每個項目兩側的間隔相等。所以,項目之間的間隔比項目與邊框的間隔大一倍
align-items屬性
.box { align-items: flex-start | flex-end | center | baseline | stretch; }
flex-start
:交叉軸的起點對齊。flex-end
:交叉軸的終點對齊。center
:交叉軸的中點對齊。baseline
: 項目的第一行文字的基線對齊。stretch
(默認值):如果項目未設置高度或設為auto,將占滿整個容器的高度。
align-content屬性
ps:align-content
屬性定義了多根軸線的對齊方式。如果項目只有一根軸線,該屬性不起作用。(跟上面一樣)
.box { align-content: flex-start | flex-end | center | space-between | space-around | stretch; }
flex-start
:與交叉軸的起點對齊。flex-end
:與交叉軸的終點對齊。center
:與交叉軸的中點對齊。space-between
:與交叉軸兩端對齊,軸線之間的間隔平均分布。space-around
:每根軸線兩側的間隔都相等。所以,軸線之間的間隔比軸線與邊框的間隔大一倍。stretch
(默認值):軸線占滿整個交叉軸。
項目屬性(子元素上的)
order flex-grow flex-shrink flex-basis flex align-self
order屬性
ps:order
屬性定義項目的排列順序。數值越小,排列越靠前,默認為0。
.item { order: <integer>; }
flex屬性
flex
屬性是flex-grow
, flex-shrink
和 flex-basis
的簡寫,默認值為0 1 auto
。後兩個屬性可選。
.item { flex: none | [ <‘flex-grow‘> <‘flex-shrink‘>? || <‘flex-basis‘> ] }
該屬性有兩個快捷值:auto
(1 1 auto
) 和 none (0 0 auto
)。
建議優先使用這個屬性,而不是單獨寫三個分離的屬性,因為瀏覽器會推算相關值。
css3 flex屬性flex-grow、flex-shrink、flex-basis學習筆記
最近在研究css3的flex。遇到的flex:1;這一塊,很是很糾結,flex-grow、flex-shrink、flex-basis始終搞不清,最經搜集了大量的介紹,應該能算是明白了。 網上大部分解釋是 flex-grow 是擴展比率 flex-shrink 是收縮比率 flex-basis 伸縮基準值 假設flex盒子父級寬度固定為800px; Flex-grow、Flex-shrink、Flex-basis 是Flex屬性的分寫模式; 如 .box { flex: 4 3 100px; } 等於 .box { flex-grow: 4; flex-shrink: 3; flex-basis: 100px; } 看以下例子 <div class="flex-parent"> <div class="flex-son"></div> <div class="flex-son"></div> <div class="flex-son"></div> </div> <style type="text/css"> .flex-parent { width: 800px; } </style> 第一種情況 flex-parent 是父級,而且他的寬度是固定為800px,不會改變; 開始設置子級flex屬性; <style type="text/css"> .flex-son:nth-child(1){ flex: 3 1 200px; } .flex-son:nth-child(2){ flex: 2 2 300px; } .flex-son:nth-child(3){ flex: 1 3 500px; } </style> flex-basis總和加起來為1000px; 那麽 1000px > 800px (父級的寬度);子元素勢必要壓縮;溢出了200px; son1 = (flex-shrink) * flex-basis; son2 = (flex-shrink) * flex-basis; ….. sonN = (flex-shrink) * flex-basis; 如果flex-basis的總和加起來大於父級寬度,子級被壓縮,最後的選擇是flex-shrink來進行壓縮計算 加權值 = son1 + son2 + …. + sonN; 那麽壓縮後的計算公式就是 壓縮後寬度 w = (子元素flex-basis值 * (flex-shrink)/加權值) * 溢出值 所以最後的加權值是 1*200 + 2*300 + 3*500 = 2300px son1的擴展量:(200 * 1/ 2300) * 200,即約等於17px; son2的擴展量:(300 * 2/ 2300) * 200,即約等於52px; son3的擴展量:(500 * 3/ 2300) * 200,即約等於130px; 最後son1、son2、son3,的實際寬度為: 200 – 16 = 184px; 300 – 52 = 248px; 500 – 130 = 370px; 第二種情況 上面的例子已經說明,繼續看第二個例子,同樣上面的例子,我們改下父級寬度為1200px; flex-basis的總和為 1000px,小於父級寬度,將有200px的剩余寬度; 既然有剩余,我們就不要加權計算,剩余的寬度將根據flex-grow,值得總和進行百分比,那麽200px就會根據份數比來分配剩余的空間; 剩余後寬度 w = (子元素flex-grow值 /所有子元素flex-grow的總和) * 剩余值 總分數為 total = 1 + 2 + 3; son1的擴展量:(3/total) * 200,即約等於100px; son2的擴展量:(2/total) * 200,即約等於67px; son3的擴展量:(1/total) * 200,即約等於33px; 最後son1、son2、son3,的實際寬度為: 200 + 100 = 300px; 300 + 67 = 367px; 500 + 33 = 533px; 總結 所以以上兩種情況下,第二種flex-basis和flex-shrink是不列入計算公式的;第一種flex-grow是不列入計算公式的 ok,上面的兩種情況總結完畢,但是很多時候我們的父級是不固定的,那麽怎麽辦,其實很簡單了,對照上面的公式,前提是已經設置了flex-basis值得元素,如果寬度的隨機值小於flex-basis的時候就按第一種計算,反之第二種;明白了吧。 但是在實際中,我們有些子元素不想進行比例分配,永遠是固定的,那麽flex就必須設置為none; 否則設置的寬度(width)將無效; flex: 1, 則其計算值為 flex: 1 1 0%; flex: auto, 則其計算值為 flex: 1 1 auto; flex: none, 則其計算值為 flex: 0 0 auto; 根據上面的公式 flex:1的時候第一種方式其實是無效的,因為加權值是0,所以只能是第二種方式計算; flex:none的時候,兩種都失效,自己元素不參與父級剩余還是溢出的分配,flex:none的應用場景還是很多的;
ps:剩下屬性就不講了,大家可以去http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html
Flex 布局的教程