都知道html正常的文檔流是自上而下排列的,塊級元素會像下左圖同樣排列。可是項目中尤爲是移動端項目會有不少需求的排版方式是要求由左到右排列。雖然能夠經過dispaly:inline-block、float、position完成排版,可是須要對距離進行計算,計算起來十分麻煩。html
2009年W3C提出了一種新的方案--引入了彈性佈局flex方式,經過容器的軸線來排列項目,簡直是移動端開發的福音(雖然grid佈局更牛x,後面會總結)。本身也用了挺久的,可是有些參數記憶很模糊,每次用都要去百度一下,乾脆本身總結一下吧。前端
//常規寫法 .cover-common{ position: relative; } .cover-common .item{ position: absolute; left: 50%; top: 50%; margin-left:-50px; margin-top: -50px } //flex寫法 .cover-flex{ display: flex; justify-content: center; align-items: center }
上面是一個讓項目水平垂直居中的兩種寫法,能夠看到寫法簡潔不少,並且直接寫在容器上就行,不須要考慮具體的項目。web
那麼,什麼是flex尼?借用阮一峯老師的一張圖來看一下flex的一些概念:瀏覽器
一、flex container(容器):使用flex的元素就叫作容器,容器默認存在2條軸線,主軸線(main axis)和垂直的交叉軸線(cross axis)。軸線開始的位置被叫作main/cross start,結束的位置被叫作main/cross end。項目是沿着主軸線開始、結束方向排列的。ide
二、flex item(項目):容器內部的直屬第一層元素就叫作項目。工具
flex容器的屬性有不少,下面主要看幾個經常使用的:佈局
一、flex-direction:設置容器主軸線的方向 二、flex-wrap:設置是否換行,每換一行意味着會多一條主軸線 三、justify-content:設置主軸方向上的項目的對齊方式 四、align-items:設置交叉軸方向上項目的對齊方式 五、align-content:多軸線對齊方式 專門創建的學習Q-q-u-n ⑦⑧④-⑦⑧③-零①② 分享學習方法和須要注意的小細節,互相交流學習,不停更新最新的教程和學習技巧(從零基礎開始到WEB前端項目實戰教程,學習工具,全棧開發學習路線以及規劃)
用來設置容器的主軸方向和主軸線的起點。有以下4個屬性值,結果以下圖。學習
.box { flex-direction: row; //(默認值)主軸爲水平方向,起點在左側 flex-direction: row-reverse ;//主軸爲水平方向,起點在右側 flex-direction: column;//主軸爲垂直方向,起點在頂部 flex-direction: column-reverse;//主軸爲垂直方向,起點在底部 }
用來設置若是一條軸線上排滿了是否換行,是否在來一條軸線,有3個屬性值。flex
.box{ flex-wrap: nowrap; //(默認值)設置不換行,就擠着 flex-wrap: wrap;//換行,按順序第一行從交叉軸線起點端開始排列 flex-wrap: wrap-reverse;換行,可是被後來居上了,第一行從交叉軸線結束端開始排列 }
還有個flex-flow屬性:是flex-direction屬性和flex-wrap屬性的簡寫形式,取值分別是flex-direction的屬性值和flex-wrap的屬性值。
默認值爲flex-flow:row nowrap。spa
.box { flex-flow: <flex-direction> || <flex-wrap>; }
用來設置項目在主軸方向的排列方式。
.box { justify-content: flex-start;//(默認值)主軸線起點對齊 justify-content: flex-end ;//主軸線終點對齊 justify-content: center ;//主軸線中心對齊 justify-content: space-between; //主軸線兩端對齊,項目間距相等 justify-content: space-around;//項目兩側間距相等,因此項目間距是兩端間距2倍 justify-content: space-evenly //項目間距相等,與兩端間距也相等 }
用來設置項目在交叉軸上的排列對齊方式。
.box { align-items: flex-start ;//交叉軸的起點對齊 align-items: flex-end ;//交叉軸的終點對齊。 align-items: center ;//交叉軸居中對齊。 align-items: baseline ;//項目的第一行文字的基線對齊。 align-items: stretch;//若是項目未設置高度或設爲auto,將佔滿整個容器的高度。 }
用來設置多軸線的在交叉軸線上的對齊方式,只對多軸線起做用。
.box { align-content: flex-start ;//與交叉軸的起點對齊。 align-content: flex-end ;//與交叉軸的終點對齊 align-content: center ;//與交叉軸中心對齊 align-content: space-between ;//與交叉軸兩端對齊 align-content: space-around ;//每根軸線兩側的間隔都相等。因此,軸線之間的間隔比軸線與邊框的間隔大一倍。 align-content: stretch;(默認值)軸線佔滿整個交叉軸 }
除了對容器進行設置,對項目自己也能夠進行設置。
一、order:定義項目在容器中的排列順序 二、flex-grow:定義項目的放大比例 三、flex-shrink:定義了項目的縮小比例 四、flex-basis:定義了在分配多餘空間以前,項目佔據的主軸空間 五、align-self:容許單個項目有與其餘項目不同的對齊方式,可覆蓋align-items屬性 專門創建的學習Q-q-u-n ⑦⑧④-⑦⑧③-零①② 分享學習方法和須要注意的小細節,互相交流學習,不停更新最新的教程和學習技巧(從零基礎開始到WEB前端項目實戰教程,學習工具,全棧開發學習路線以及規劃)
定義項目的位置,默認值都爲0,值越小越靠前。因此要想不改變其餘項目的同時,往前面移動該項目,須要設置成負數。
.item { order:number; //default 0 }
用來定義項目的放大比例,也就是對剩餘空間的分配能力。默認值是0,表示不參與分配。若是是2則表示比1的多分配1倍。
.item { flex-grow: number; // default 0 }
定義項目的縮小比例,若是項目空間不足,將會默認縮小,默認值爲1.設置爲0則不會縮小,負數無效等價於1。若是設置成2時,壓縮效果翻倍。
.item { flex-shrink: number; // default 1 }
定義了在分配多餘空間以前,項目佔據的主軸空間(main size)。瀏覽器根據這個屬性,計算主軸是否有多餘空間。它的默認值爲auto,即項目的原本大小。感受沒什麼卵用...
.item { flex-basis: length | auto; // default auto }
flex-grow、flex-shrink、flex-basis三個屬性的縮寫。
.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ] }
用來設置單個項目交叉軸上的對齊方式,能覆蓋align-items的屬性值。默認值爲auto,其餘值則與align-items相同。
.item { align-self: auto | flex-start | flex-end | center | baseline | stretch; }
flex佈局是否是簡單又實用,理解容器、項目、主軸線、交叉軸線這幾個概念後就上手實用吧!