Flex 布局的教程

來源:互聯網
上載者:User

標籤:css   活性   ret   rap   首碼   items   sel   center   elf   

前言:以前也經常用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-directionflex-wrapflex-flowjustify-contentalign-itemsalign-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(預設值):軸線佔滿整個交叉軸。

 項目屬性(子項目上的)

orderflex-growflex-shrinkflex-basisflexalign-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 = 2300pxson1的擴充量:(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 布局的教程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.