Flex Box布局學(xué)習(xí)- 語法

上一篇疏之,我學(xué)習(xí)并整理了使用flex時(shí)仍律,需要注意的兼容性問題。那么今天就來學(xué)習(xí)一下有關(guān)flex語法的東西低零。

先看一下flex布局的總體圖婆翔,然后我們再慢慢學(xué)習(xí)。

flex布局屬性圖.png

背景


我本來覺得掏婶,我寫過許多的CSS樣式了啃奴,對flex的應(yīng)用也算嫻熟了,起碼經(jīng)常寫的布局气堕,我都能不費(fèi)勁兒的寫出來了纺腊,flex布局的相關(guān)東西我也看了不少,當(dāng)我看到這段代碼時(shí)茎芭,我發(fā)現(xiàn)自己會(huì)的那點(diǎn)東西揖膜,簡直不值得一提,不過沒關(guān)系梅桩,那么讓我從新學(xué)起壹粟,我就不信學(xué)不會(huì),掌握不了宿百。

.item-input textarea {
-webkit-box-flex: 1;
-webkit-flex: 1 0 220px;
-moz-box-flex: 1;
-moz-flex: 1 0 220px;
-ms-flex: 1 0 220px;
flex: 1 0 220px;
}


>上一篇《CSS之flex兼容性》中詳細(xì)介紹了趁仙,*兼容性*的由來,那么在這我就不多做解釋了垦页。直接開始學(xué)習(xí)這些語法雀费。

## 簡介

2009年,W3C提出了一種新的方案----Flex布局痊焊,可以簡便盏袄、完整、響應(yīng)式地實(shí)現(xiàn)各種頁面布局薄啥。目前辕羽,它已經(jīng)得到了所有瀏覽器的支持,這意味著垄惧,現(xiàn)在就能很安全地使用這項(xiàng)功能刁愿。

## Flex Box 是什么?

CSS3 彈性盒子(Flex Box)彈性盒子是 CSS3 的一種新的布局模式到逊。
CSS3 彈性盒( Flexible Box 或 flexbox)铣口,是一種當(dāng)頁面需要適應(yīng)不同的屏幕大小以及設(shè)備類型時(shí)確保元素?fù)碛星‘?dāng)?shù)男袨榈牟季址绞健?引入彈性盒布局模型的目的是提供一種更加有效的方式來對一個(gè)容器中的子元素進(jìn)行排列滤钱、對齊和分配空白空間。

任何一個(gè)容器都可以指定為Flex布局脑题。

**容器內(nèi)可以包含一個(gè)或者多個(gè)彈性子元素菩暗。彈性子元素通常在彈性盒子內(nèi)一行顯示。默認(rèn)情況下每個(gè)容器只有一行旭蠕。**

e.g.:

.box{
display: flex;
}
// 行內(nèi)元素也可以
.box{
display: inline-flex;
}

*<u>注意,設(shè)為Flex布局以后旷坦,子元素的float掏熬、clear和vertical-align屬性將失效。</u>*

## 基本概念

采用Flex布局的元素秒梅,稱為Flex容器(flex container)旗芬,簡稱"容器"。它的所有子元素自動(dòng)成為容器成員捆蜀,稱為Flex項(xiàng)目(flex item)疮丛,簡稱"子元素"。

![basic](http://upload-images.jianshu.io/upload_images/2041009-d5f2aed4e59b5416.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**容器默認(rèn)存在兩根軸:**
<u>水平的主軸(main axis)和垂直的交叉軸(cross axis)辆它。主軸的開始位置(與邊框的交叉點(diǎn))叫做main start誊薄,結(jié)束位置叫做main end;交叉軸的開始位置叫做cross start锰茉,結(jié)束位置叫做cross end呢蔫。
項(xiàng)目默認(rèn)沿主軸排列。單個(gè)項(xiàng)目占據(jù)的主軸空間叫做main size飒筑,占據(jù)的交叉軸空間叫做cross size片吊。</u>


## 容器的屬性

### 1. flex-direction屬性
flex-direction屬性決定主軸的方向(即子元素的排列方向)。

.box {
flex-direction: column-reverse | column | row | row-reverse ;
}

![flex-direction.png](http://upload-images.jianshu.io/upload_images/2041009-11dccceb5c388ce2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

它有4個(gè)值:

* row(默認(rèn)值):主軸為水平方向协屡,起點(diǎn)在左端俏脊。
* row-reverse:主軸為水平方向,起點(diǎn)在右端肤晓。
* column:主軸為垂直方向爷贫,起點(diǎn)在上沿。
* column-reverse:主軸為垂直方向材原,起點(diǎn)在下沿沸久。
### 2. justify-content屬性 
`justify-content`屬性定義了項(xiàng)目在主軸上的對齊方式。

.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}

![flex-direction1.png](http://upload-images.jianshu.io/upload_images/2041009-790c37f67c9f4f84.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

它可能取5個(gè)值余蟹,具體對齊方式與軸的方向有關(guān)卷胯。下面假設(shè)主軸為從左到右。

* flex-start(默認(rèn)值):左對齊
* flex-end:右對齊
* center: 居中
* space-between:兩端對齊威酒,項(xiàng)目之間的間隔都相等窑睁。
* space-around:每個(gè)項(xiàng)目兩側(cè)的間隔相等挺峡。所以,項(xiàng)目之間的間隔比項(xiàng)目與邊框的間隔大一倍担钮。

### 3. align-items屬性 
align-items屬性定義項(xiàng)目在交叉軸上如何對齊橱赠。

.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}

![align-items.png](http://upload-images.jianshu.io/upload_images/2041009-482855763e84059f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

它可能取5個(gè)值。具體的對齊方式與交叉軸的方向有關(guān)箫津,下面假設(shè)交叉軸從上到下狭姨。

* flex-start:交叉軸的起點(diǎn)對齊。
* flex-end:交叉軸的終點(diǎn)對齊苏遥。
* center:交叉軸的中點(diǎn)對齊饼拍。
* baseline: 項(xiàng)目的第一行文字的基線對齊。
* stretch(默認(rèn)值):如果項(xiàng)目未設(shè)置高度或設(shè)為auto田炭,將占滿整個(gè)容器的高度师抄。

### 4. flex-wrap屬性
默認(rèn)情況下,項(xiàng)目都排在一條線(又稱"軸線")上教硫。flex-wrap屬性定義叨吮,如果一條軸線排不下,如何換行瞬矩,以及它的換行方式茶鉴。

.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}

它可能取三個(gè)值:

* nowrap(默認(rèn)):不換行。

![nowrap.png](http://upload-images.jianshu.io/upload_images/2041009-9c4905858390a65b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* wrap:換行景用,第一行在最上方蛤铜。

![wrap.jpg](http://upload-images.jianshu.io/upload_images/2041009-6e99f57b41fcaf92.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

* wrap-reverse:換行,第一行在最下方丛肢。

![wrap-reverse.jpg](http://upload-images.jianshu.io/upload_images/2041009-ebc2e49e723efc61.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
### 5.  align-content屬性
 align-content屬性用于修改flex-wrap屬性的行為围肥。類似于align-item,但它不是設(shè)置彈性元素的對齊,而是設(shè)置各個(gè)行的對齊蜂怎。
如果彈性元素只有一行穆刻,該屬性不起作用。

.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}

![align-content.png](http://upload-images.jianshu.io/upload_images/2041009-a726e10048d78e67.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

該屬性可能取6個(gè)值:

* flex-start:與交叉軸的起點(diǎn)對齊杠步。
* flex-end:與交叉軸的終點(diǎn)對齊氢伟。
* center:與交叉軸的中點(diǎn)對齊。
* space-between:與交叉軸兩端對齊幽歼,軸線之間的間隔平均分布朵锣。
* space-around:每根軸線兩側(cè)的間隔都相等。所以甸私,軸線之間的間隔比軸線與邊框的間隔大一倍诚些。
* stretch(默認(rèn)值):軸線占滿整個(gè)交叉軸。

## 彈性子元素的屬性

以下6個(gè)屬性設(shè)置在彈性子元素上。

* order
* flex-grow
* flex-shrink
* flex-basis
* flex
* align-self

### 1. order屬性
order屬性定義項(xiàng)目的排列順序诬烹。數(shù)值越小砸烦,排列越靠前,默認(rèn)為0绞吁。

.item {
order: <integer>;
}

![order.png](http://upload-images.jianshu.io/upload_images/2041009-08febe61b63ed0d1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

### 2. flex屬性

#### 1. flex-grow屬性

flex-grow屬性賦予子元素在必要時(shí)伸展的能力幢痘,可指定一個(gè)不帶單位的數(shù)值,作為父容器剩余空間的比例家破,它表示子元素在flex容器中可以分配多少可用的空間颜说。

如果所有聲明了flex-grow的子元素都指定flex-grow為1,那么父容器剩余的空間將會(huì)平均的分配到這些子元素上汰聋。如果其中一個(gè)flex-grow指定為2脑沿,那么容器將會(huì)試圖為其分配一個(gè)空間,這個(gè)空間2倍于那些flex-grow為1的子元素马僻。 

需要注意的是,我們說的剩余空間注服,是指除子元素內(nèi)容以外的父容器可用空間韭邓,另外,父容器并不保證所有情況下都能均勻分配溶弟,但至少它會(huì)這樣嘗試女淑。

flex-grow的值不能為負(fù)。 

每個(gè)彈性子元素沒有設(shè)置寬度辜御,是自由伸展的鸭你,那么子元素的寬度就是本身flex item1所占的寬度。如eg.1

![flow-grow.png](http://upload-images.jianshu.io/upload_images/2041009-666333d078397b54.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

容器寬度:200

彈性子元素寬度:100

html:
<div class="flex-container">
  <div class="flex-item" style="flex-grow: 1;">flex item</div>
  <div class="flex-item" style="flex-grow: 2;">flex item</div>
  <div class="flex-item" style="flex-grow: 1;">flex item</div>
</div>
如果每個(gè)彈性子元素設(shè)置寬度100擒权,那么子元素的寬度就是100袱巨,除去子元素后的部分按flex-grow比例進(jìn)行分配。

![flex-grow2.png](http://upload-images.jianshu.io/upload_images/2041009-46cb48f6608f2c9d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

#### 2. flex-shrink屬性

flex-shrink屬性表示一個(gè)子元素在必要時(shí)是否收縮自己來適應(yīng)當(dāng)前的Flexbox碳抄,默認(rèn)值是1愉老。

注意:flex-shrink不能為負(fù)值。 

flex-shrink適合使用在固定尺寸的子元素上剖效,默認(rèn)情況下嫉入,固定大小的子元素并非始終保持設(shè)定的值,比如在父容器太小時(shí)璧尸,就會(huì)壓縮子元素來適應(yīng)咒林,如果我們不想這些子元素被壓縮,就可以使用flex-shrink爷光,并設(shè)置其值為0垫竞。 

eg1:

```html
<div class="flex-container">
    <div class="flex-item" style="flex-shrink: 2;">flex item1</div>
  <div class="flex-item" style="flex-shrink: 1;">flex item2</div>
  <div class="flex-item" style="">flex item3</div>
</div>
flex-shrink.png

容器寬度:200

彈性子元素寬度:100

收縮比例為:2:1:1

所以:1003-200=100,超出100蛀序,按比例劃分件甥,就是item1被移除溢出量=100/(2+1+1) * 2=50;item2被移除溢出量=100/(2+1+1) * 1;item3被溢出量=100/(2+1+1)1捌议。

eg2:

如果其中有一個(gè)元素設(shè)置了flex-shrink: 0;則其寬度不會(huì)收縮,其他部分按比例收縮即可引有。

3. flex-basis 屬性

flex-basis屬性告訴父容器瓣颅,在剩余空間被分配之前先定義子元素的默認(rèn)尺寸,可以指定為百分比或rem等長度單位或者auto關(guān)鍵字譬正。

如果設(shè)置為0宫补,那么父容器分配分配之前,對每個(gè)子元素的默認(rèn)尺寸都視之為0曾我,剩余空間也就是父容器的全部空間粉怕,其結(jié)果是,直接按照flex-grow值的比例分配子元素整體的大惺愠病贫贝;

如果設(shè)置為auto,那么父容器會(huì)將每個(gè)子元素中的內(nèi)容作為子元素默認(rèn)尺寸蛉谜,然后再計(jì)算剩余空間稚晚,最后把剩余空間按照flex-grow值的比例平均分配到子元素除內(nèi)容以外的空間,也就是”padding”型诚。

[圖片上傳失敗...(image-732e68-1524620541028)]

4. flex屬性

flex屬性是flex-grow, flex-shrink 和 flex-basis的簡寫客燕,默認(rèn)值為0 1 auto。后兩個(gè)屬性可選。

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

該屬性有兩個(gè)快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建議優(yōu)先使用這個(gè)屬性声登,而不是單獨(dú)寫三個(gè)分離的屬性,因?yàn)闉g覽器會(huì)推算相關(guān)值傍妒。

3. align-self屬性

align-self屬性允許單個(gè)項(xiàng)目有與其他項(xiàng)目不一樣的對齊方式,可覆蓋align-items屬性摸柄。默認(rèn)值為auto拍顷,表示繼承父元素的align-items屬性,如果沒有父元素塘幅,則等同于stretch昔案。

.item {
  align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
align-self.png

屬性值各個(gè)值解釋 - 自己的解釋

一般大家都會(huì)看到好多個(gè)屬性的取值中都有flex-startflex-end电媳、center踏揣、space-betweenspace-around這幾個(gè)取值范圍匾乓。那么下面就詳細(xì)解釋一下每個(gè)取值的含義捞稿。因?yàn)橹翱偸歉鱾€(gè)屬性值組合起來用的,很是混亂。
剛開始看阮一峰老師的講解時(shí)娱局,有個(gè)地方自己理解錯(cuò)了彰亥, 所以特意自己截圖來說明一下∷テ耄可能有小伙伴和我一樣也理解錯(cuò)了任斋。

各屬性圖解

比如上圖,只是看這個(gè)圖耻涛,我就會(huì)認(rèn)為废酷,設(shè)置為center屬性就會(huì)展示成上圖中center的這個(gè)樣子,其實(shí)這樣的理解是有一點(diǎn)點(diǎn)偏差的抹缕。

以justify-content 屬性為例進(jìn)行說明澈蟆。
justify-content:內(nèi)容對齊(justify-content)屬性應(yīng)用在彈性容器上,把彈性項(xiàng)沿著彈性容器的主軸線(main axis)對齊卓研。

1. flex-start

彈性項(xiàng)目向行頭緊挨著填充趴俘。這個(gè)是默認(rèn)值。第一個(gè)彈性項(xiàng)的main-start外邊距邊線被放置在該行的main-start邊線奏赘,而后續(xù)彈性項(xiàng)依次平齊擺放寥闪。也就是左對齊
---w3c的解釋

左對齊的意思就是說志珍,從main-start邊線,一個(gè)緊挨著一個(gè)向右排列垛叨,中間沒有空隙的伦糯。例如,下圖:


flex-start.png

2. flex-end

彈性項(xiàng)目向行尾緊挨著填充嗽元。第一個(gè)彈性項(xiàng)的main-end外邊距邊線被放置在該行的main-end邊線敛纲,而后續(xù)彈性項(xiàng)依次平齊擺放。
---w3c的解釋

如下圖所示:

flex-end.png

3. center

彈性項(xiàng)目居中緊挨著填充剂癌。(如果剩余的自由空間是負(fù)的淤翔,則彈性項(xiàng)目將在兩個(gè)方向上同時(shí)溢出)。
---w3c的解釋

如下圖所示:

center.png

]

4. space-between

彈性項(xiàng)目平均分布在該行上佩谷。如果剩余空間為負(fù)或者只有一個(gè)彈性項(xiàng)旁壮,則該值等同于flex-start。否則谐檀,第1個(gè)彈性項(xiàng)的外邊距和行的main-start邊線對齊抡谐,而最后1個(gè)彈性項(xiàng)的外邊距和行的main-end邊線對齊,然后剩余的彈性項(xiàng)分布在該行上桐猬,相鄰項(xiàng)目的間隔相等麦撵。
---w3c的解釋

如下圖所示:

space-between.png

5. space-around

彈性項(xiàng)目平均分布在該行上,兩邊留有一半的間隔空間。如果剩余空間為負(fù)或者只有一個(gè)彈性項(xiàng)免胃,則該值等同于center音五。否則,彈性項(xiàng)目沿該行分布羔沙,且彼此間隔相等(比如是20px)躺涝,同時(shí)首尾兩邊和彈性容器之間留有一半的間隔(1/2*20px=10px)。

如下圖:

space-around.png

所以最上面?zhèn)€那個(gè)綜合的圖片中撬碟,其實(shí)是為了看起來更加方便诞挨,是給每個(gè)子元素添加了外邊距,外邊距算作每個(gè)元素的樣式呢蛤。所以看起來是上面?zhèn)€綜合圖的樣子惶傻。

參考

友情提示:初學(xué)者不易記全所有的屬性和值的左右,鼠標(biāo)放在屬性名上即可顯示相應(yīng)屬性的作用其障。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末银室,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子励翼,更是在濱河造成了極大的恐慌蜈敢,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汽抚,死亡現(xiàn)場離奇詭異抓狭,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)造烁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門否过,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人惭蟋,你說我怎么就攤上這事苗桂。” “怎么了告组?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵煤伟,是天一觀的道長。 經(jīng)常有香客問我木缝,道長便锨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任我碟,我火速辦了婚禮鸿秆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘怎囚。我一直安慰自己卿叽,他們只是感情好桥胞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著考婴,像睡著了一般贩虾。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上沥阱,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天缎罢,我揣著相機(jī)與錄音,去河邊找鬼考杉。 笑死策精,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的崇棠。 我是一名探鬼主播咽袜,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼枕稀!你這毒婦竟也來了询刹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤萎坷,失蹤者是張志新(化名)和其女友劉穎凹联,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體哆档,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蔽挠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了瓜浸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片澳淑。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖斟叼,靈堂內(nèi)的尸體忽然破棺而出偶惠,到底是詐尸還是另有隱情春寿,我是刑警寧澤朗涩,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站绑改,受9級(jí)特大地震影響谢床,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜厘线,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一识腿、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧造壮,春花似錦渡讼、人聲如沸骂束。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽展箱。三九已至,卻和暖如春蹬昌,著一層夾襖步出監(jiān)牢的瞬間混驰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國打工皂贩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留栖榨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓明刷,卻偏偏與公主長得像婴栽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子遮精,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容