1. 程式人生 > >Flex 布局的教程

Flex 布局的教程

靈活性 item 決定 color 默認 快捷 cal 彈性布局 間隔

前言:以前也經常用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 布局以後,子元素的floatclearvertical-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-shrinkflex-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,的實際寬度為: 20016 = 184px; 30052 = 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 布局的教程