最近項目中涉及到手機端開發,那麼flex佈局是必不可少的,這裏我來從新梳理一下
flex佈局也被成爲伸縮盒佈局,在flex佈局模型中,flex容器的子元素能夠在x軸或y軸上進行佈局,而且子元素能夠伸縮他們的大小,當容器中還有空間它們會伸展以填充容器未使用的空間,當容器空間縮小的時候,他們也會跟着縮小。bootstrap
主軸與交叉軸,主軸由flex-direction來定義,交叉軸是主軸的垂直方向的軸app
- flex-direction:row
- flex-direction:column
伸縮盒佈局的應用很簡單,只須要爲容器元素添加display: flex;便可框架
<article class="container_1"> <section>one</section> <section> two <br> two_1 <br> two_2 <br> two_3 <br> </section> <section>three</section> </article> <style> body { margin: 0; padding: 0; } .container_1 { display: flex; justify-content: flex-start; /*平分容器,內容居中*/ /*justify-content: space-around; */ /*平分容器,內容顯示在邊緣,其他被空白佔*/ /*justify-content: space-between;*/ /*內容居中*/ /*justify-content: center;*/ } .container_1 > section:nth-child(1){ background-color: lightblue; } .container_1 > section:nth-child(2){ background-color: pink; } .container_1 > section:nth-child(3){ background-color: lightgreen; } .container_1 > section:nth-child(4){ background-color: orange; } </style>
用於定義與主軸垂直方向上子元素的顯示方式佈局
定義主軸方向,默認主軸爲X周,該屬性的取值爲 rowflex
定義是否能夠換行,默認值爲nowrapspa
是flex-direction 與 flex-wrap的速寫形式。例如3d
flex-flow: row wrap;
這兩個屬性定義在flex item上,flex-basis定義了在分配多餘空間以前,flex item佔據的主軸空間,默認值爲auto,與width相似。 flex-grow定了分配多餘空間的的規則,例如code
<style> .container_1 { margin: 0 auto; width: 600px; display: flex; flex-flow: row nowrap; } .container_1 > section:nth-child(1){ background-color: lightblue; flex-basis: 100px; flex-grow: 1; } .container_1 > section:nth-child(2){ background-color: pink; flex-basis: 100px; flex-grow: 2; } .container_1 > section:nth-child(3){ background-color: lightgreen; flex-basis: 100px; flex-grow:1; } </style> <article class="container_1"> <section>flex is a new value added to the CSS display property. Along with inline-flex it causes the element that it applies to to become a flex container, and the element's children to each become a flex item. The items then participate in flex layout</section> <section> two <br> two_1 <br> two_2 <br> two_3 <br> </section> <section>flex is a </section> </article>
從上面的樣式上,咱們能夠看出,每一個section的flex-basis 基礎寬度爲100px,flex容器總寬度爲600px,這樣,剩下的空白區域也就是300px,那麼這300像素如何風格呢?這時候就要看沒有flex item的flex-grow取值,該值默認爲auto,可是咱們這裏是這麼指定的,第一個第三個section爲1,第二個section爲2,也就是說第一個第三個section各佔1/4,也就是75px,第二個section佔2/4,也就是150px。因此最後第一個第三個section佔175px,第二個section佔250px.blog
flex-shrink 一樣應用到flex item元素上,與flex-grow做用相反,flex-grow表示當flex-basis的和小於flex容器寬度的時候,如何分配剩餘空間進行寬度的增加。而flex-shrink表示當flex-basis的和大於flex容器寬度的時候,按照哪一種比例進行縮小three
<style> .container_1 { margin: 0 auto; width: 600px; display: flex; flex-flow: row nowrap; } .container_1 > section:nth-child(1){ background-color: lightblue; flex-basis: 300px; flex-grow: 1; flex-shrink: 1; } .container_1 > section:nth-child(2){ background-color: pink; flex-basis: 300px; flex-grow: 2; flex-shrink: 2; } .container_1 > section:nth-child(3){ background-color: lightgreen; flex-basis: 300px; flex-grow:1; flex-shrink: 1; } .container_1 > section:nth-child(4){ background-color: orange; } </style>
flex容器的寬度爲600px;而flex item加起來爲900px,爲了能佔滿flex容器,flex item必須縮小300px; 那麼誰應該縮小呢?這時候要看每一個flex item上flex-shrink的定義,而後計算出比例
通常狀況下,咱們不多使用flex-basis,flex-grow,flex-shrink,而是使用它們的速寫形式flex。
flex: flex-grow flex-shrink flex-basis
例如
.container_1 > section:nth-child(1){ background-color: lightblue; flex-basis: 1 1 300px; } .container_1 > section:nth-child(2){ background-color: pink; flex-basis:2 2 300px; } .container_1 > section:nth-child(3){ background-color: lightgreen; flex-basis:1 1 300px; }
在實際開發過程當中,咱們常常會應用到網格佈局,通常採用的是float技術,而後封裝成一個網格框架進行應用,例如bootstrap的網格佈局。可是網格佈局也有一些缺陷,好比,它具備兩個維度,行與列,再有些項目中咱們但願咱們的item是一維的,例如:
<style> body { margin: 0; padding: 0; } .container_1 { display: flex; flex-flow: row wrap; justify-content: space-around; } .container_1 > section { margin: .5em; flex: 1 1 200px; background-color: orange; } </style> <article class="container_1"> <section> one <br> one <br> one <br> one <br> </section> <section>two</section> <section>three</section> <section>four</section> <section>five</section> <section>six</section> <section>seven</section> <section> one <br> one <br> one <br> one <br> </section> <section>two</section> <section>three</section> <section>four</section> <section>five</section> <section>six</section> <section>seven</section> </article>
固然,有些同窗以爲這樣可能和需求不相匹配了,由於咱們的代碼中flex item的寬度會發生變化,這時候只須要 flex: 0 1 200px;便可,