Flex 佈局的教程

前言:之前也常常用flex佈局,可是最近看到別人使用的時候,發覺之前本身仍是不夠理解這個,從新看了一遍http://www.ruanyifeng.com/blog/2015/07/flex-grammar.htmlcss

1、Flex 佈局是什麼?

Flex 是 Flexible Box 的縮寫,意爲"彈性佈局",用來爲盒狀模型提供很大靈活性。html

全部容器均可以指定爲flex佈局css3

.box{
  display: flex;
}

行內元素也能夠web

.box{
  display:inline- flex;
}

若是是Webkit 內核的瀏覽器,加上-webkit前綴瀏覽器

.box{
  display: -webkit-flex; /* Safari */
  display: flex;
}

ps:設爲 Flex 佈局之後,子元素的floatclearvertical-align屬性將失效。佈局

2、基本概念

採用 Flex 佈局的元素,稱爲 Flex 容器(flex container),簡稱"容器"。其餘概念我就不詳述了。學習

3、容器的屬性

如下6個屬性設置在容器上。flex

flex-direction
flex-wrap
flex-flow
justify-content
align-items
align-content

flex-direction屬性spa

flex-direction屬性決定主軸的方向(即項目的排列方向)。code

.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-growflex-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; 最後son一、son二、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; 最後son一、son二、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

相關文章
相關標籤/搜索