Flex布局新舊混合寫法詳解(兼容微信)

flex是個非常好用的屬性,如果說有什么可以完全代替 float和 position,那么肯定是非它莫屬了(雖然現(xiàn)在還有很多不支持 flex 的瀏覽器)。然而在移動開發(fā)中,本來絕大多數(shù)瀏覽器(包括安卓2.3以上的自帶瀏覽器)都支持的屬性亩码,偏偏有個例外,就是國產(chǎn)某某X5內(nèi)核神器(不知哪個版本的webkit野瘦,僅支持 display:box)描沟,自主研發(fā)這東西也不好多說什么了,下面入正題鞭光。
首先還是從兩個版本的語法開始講吧吏廉,這里還是假設(shè)flex容器為 .box ,子元素為 .item惰许。

<h3>舊語法篇</h3>
定義容器的display屬性

.box{
    display: -moz-box; /*Firefox*/
    display: -webkit-box; /*Safari,Opera,Chrome*/
    display: box;
}```

<h4>容器屬性</h4>
<b>1.box-pack 屬性</b>
box-pack定義子元素主軸對齊方式席覆。

.box{
-moz-box-pack: center; /Firefox/
-webkit-box-pack: center; /Safari,Opera,Chrome/
box-pack: center;
}```

box-pack屬性總共有4個值:

.box{
    box-pack: start | end | center | justify;
    /*主軸對齊:左對齊(默認(rèn)) | 右對齊 | 居中對齊 | 左右對齊*/
}```

<b>2.box-align 屬性</b>
box-align定義子元素交叉軸對齊方式。

.box{
-moz-box-align: center; /Firefox/
-webkit-box-align: center; /Safari,Opera,Chrome/
box-align: center;
}```

box-align屬性總共有5個值:

.box{
    box-align: start | end | center | baseline | stretch;
    /*交叉軸對齊:頂部對齊(默認(rèn)) | 底部對齊 | 居中對齊 | 文本基線對齊 | 上下對齊并鋪滿*/
}```

<b>3.box-direction 屬性</b>
box-direction定義子元素的顯示方向汹买。

.box{
-moz-box-direction: reverse; /Firefox/
-webkit-box-direction: reverse; /Safari,Opera,Chrome/
box-direction: reverse;
}```

box-direction屬性總共有3個值:

.box{
    box-direction: normal | reverse | inherit;
    /*顯示方向:默認(rèn)方向 | 反方向 | 繼承子元素的 box-direction*/
}```

4.box-orient 屬性
box-orient定義子元素是否應(yīng)水平或垂直排列佩伤。

.box{
-moz-box-orient: horizontal; /Firefox/
-webkit-box-orient: horizontal; /Safari,Opera,Chrome/
box-orient: horizontal;
}```

box-orient屬性總共有5個值:

.box{
    box-orient: horizontal | vertical | inline-axis | block-axis | inherit;
    /*排列方向:水平 | 垂直 | 行內(nèi)方式排列(默認(rèn)) | 塊方式排列 | 繼承父級的box-orient*/
}```

<b>5.box-lines 屬性</b>
box-lines定義當(dāng)子元素超出了容器是否允許子元素?fù)Q行。

.box{
-moz-box-lines: multiple; /Firefox/
-webkit-box-lines: multiple; /Safari,Opera,Chrome/
box-lines: multiple;
}```

box-lines屬性總共有2個值:

.box{
    box-lines: single | multiple;
    /*允許換行:不允許(默認(rèn)) | 允許*/
}```

<h4>子元素屬性</h4>
<b>1.box-flex 屬性</b>
box-flex定義是否允許當(dāng)前子元素伸縮晦毙。

.item{
-moz-box-flex: 1.0; /Firefox/
-webkit-box-flex: 1.0; /Safari,Opera,Chrome/
box-flex: 1.0;
}```

box-flex屬性使用一個浮點值:

.item{
    box-flex: <value>;
     /*伸縮:<一個浮點數(shù)生巡,默認(rèn)為0.0,即表示不可伸縮结序,大于0的值可伸縮障斋,柔性相對>*/
}```

<b>2.box-ordinal-group 屬性</b>
box-ordinal-group定義子元素的顯示次序纵潦,數(shù)值越小越排前徐鹤。

.item{
-moz-box-ordinal-group: 1; /Firefox/
-webkit-box-ordinal-group: 1; /Safari,Opera,Chrome/
box-ordinal-group: 1;
}```

box-direction屬性使用一個整數(shù)值:

.item{
    box-ordinal-group: <integer>;
    /*顯示次序:<一個整數(shù),默認(rèn)為1邀层,數(shù)值越小越排前>*/
}```
</br>

----
<h3>新版語法</h3>
定義容器的display屬性

.box{
display: -webkit-flex; /webkit/
display: flex;
}
/行內(nèi)flex/
.box{
display: -webkit-inline-flex; /webkit/
display:inline-flex;
}```

容器樣式

.box{
    flex-direction: row | row-reverse | column | column-reverse;
    /*主軸方向:左到右(默認(rèn)) | 右到左 | 上到下 | 下到上*/
    flex-wrap: nowrap | wrap | wrap-reverse;
    /*換行:不換行(默認(rèn)) | 換行 | 換行并第一行在下方*/
    flex-flow: <flex-direction> || <flex-wrap>;
    /*主軸方向和換行簡寫*/
    justify-content: flex-start | flex-end | center | space-between | space-around;
    /*主軸對齊方式:左對齊(默認(rèn)) | 右對齊 | 居中對齊 | 兩端對齊 | 平均分布*/
    align-items: flex-start | flex-end | center | baseline | stretch;
    /*交叉軸對齊方式:頂部對齊(默認(rèn)) | 底部對齊 | 居中對齊 | 上下對齊并鋪滿 | 文本基線對齊*/
    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    /*多主軸對齊:頂部對齊(默認(rèn)) | 底部對齊 | 居中對齊 | 上下對齊并鋪滿 | 上下平均分布*/
}```

子元素屬性

.item{
order: <integer>;
/排序:數(shù)值越小返敬,越排前,默認(rèn)為0/
flex-grow: <number>;
/* default 0 //放大:默認(rèn)0(即如果有剩余空間也不放大寥院,值為1則放大劲赠,2是1的雙倍大小,以此類推)/
flex-shrink: <number>;
/
default 1 //縮薪招弧:默認(rèn)1(如果空間不足則會縮小凛澎,值為0不縮小)/
flex-basis: <length> | auto;
/
default auto //固定大泄捞恪:默認(rèn)為0塑煎,可以設(shè)置px值,也可以設(shè)置百分比大小/
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
/
flex-grow, flex-shrink 和 flex-basis的簡寫臭蚁,默認(rèn)值為0 1 auto最铁,/
align-self: auto | flex-start | flex-end | center | baseline | stretch;
/
單獨對齊方式:自動(默認(rèn)) | 頂部對齊 | 底部對齊 | 居中對齊 | 上下對齊并鋪滿 | 文本基線對齊*/
}```

</br>


<h3>兼容寫法</h3>
首先是定義容器的 display屬性:

.box{
    display: -webkit-box; 
    /* 老版本語法: Safari, iOS, Android browser, older WebKit browsers. */
    display: -moz-box; 
    /* 老版本語法: Firefox (buggy) */
    display: -ms-flexbox; 
    /* 混合版本語法: IE 10 */
    display: -webkit-flex; /* 新版本語法: Chrome 21+ */
    display: flex; /* 新版本語法: Opera 12.1, Firefox 22+ */
}```

由于舊版語法并沒有列入W3C標(biāo)準(zhǔn)讯赏,所以這里不用寫 display:box ,下面的語法也是一樣的冷尉。
這里還要注意的是漱挎,如果子元素是行內(nèi)元素,在很多情況下都要使用 display:block 或 display:inline-block把行內(nèi)子元素變成塊元素(例如使用 box-flex屬性)雀哨,這也是舊版語法和新版語法的區(qū)別之一磕谅。

<b>子元素主軸對齊方式</b>

.box{
-webkit-box-pack: center;
-moz-justify-content: center;
-webkit-justify-content: center;
justify-content: center;
}```


這里舊版語法有4個參數(shù),而新版語法有5個參數(shù)震束,兼容寫法新版語法的 space-around是不可用的:

.box{
    box-pack: start | end | center | justify;
    /*主軸對齊:左對齊(默認(rèn)) | 右對齊 | 居中對齊 | 左右對齊*/
    justify-content: flex-start | flex-end | center | space-between | space-around;
    /*主軸對齊方式:左對齊(默認(rèn)) | 右對齊 | 居中對齊 | 兩端對齊 | 平均分布*/
}```

<b>子元素交叉軸對齊方式</b>

.box{
-webkit-box-align: center;
-moz-align-items: center;
-webkit-align-items: center;
align-items: center;
}```


這里的參數(shù)除了寫法不同怜庸,其實是功能是一樣的:

.box{
    box-align: start | end | center | baseline | stretch;
    /*交叉軸對齊:頂部對齊(默認(rèn)) | 底部對齊 | 居中對齊 | 文本基線對齊 | 上下對齊并鋪滿*/
    align-items: flex-start | flex-end | center | baseline | stretch;
    /*交叉軸對齊方式:頂部對齊(默認(rèn)) | 底部對齊 | 居中對齊 | 上下對齊并鋪滿 | 文本基線對齊*/
}```

<b>子元素的顯示方向</b>
子元素的顯示方向可通過 box-direction + box-orient + flex-direction實現(xiàn),下面請看實例:
左到右

.box{
-webkit-box-direction: normal;
-webkit-box-orient: horizontal;
-moz-flex-direction: row;
-webkit-flex-direction: row;
flex-direction: row;
}```


右到左

.box{
    -webkit-box-pack: end;
    -webkit-box-direction: reverse;
    -webkit-box-orient: horizontal;
    -moz-flex-direction: row-reverse;
    -webkit-flex-direction: row-reverse;
    flex-direction: row-reverse;
}```

這里補充說明一點: box 寫法的 box-direction只是改變了子元素的排序垢村,并沒有改變對齊方式割疾,需要新增一個 box-pack來改變對齊方式。
[![box-orient: vertical](http://upload-images.jianshu.io/upload_images/2643476-f3e499d2953b6e2e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx02.png)
上到下

.box{
-webkit-box-direction: normal;
-webkit-box-orient: vertical;
-moz-flex-direction: column;
-webkit-flex-direction: column;
flex-direction: column;
}```


下到上

.box{
    -webkit-box-pack: end;
    -webkit-box-direction: reverse;
    -webkit-box-orient: vertical;
    -moz-flex-direction: column-reverse;
    -webkit-flex-direction: column-reverse;
    flex-direction: column-reverse;
}```

[![box-orient: vertical](http://upload-images.jianshu.io/upload_images/2643476-9ae1d01a0a96cc9c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx04.png)
是否允許子元素伸縮

.item{
-webkit-box-flex: 1.0;
-moz-flex-grow: 1;
-webkit-flex-grow: 1;
flex-grow: 1;
}```

.item{
    -webkit-box-flex: 1.0;
    -moz-flex-shrink: 1;
    -webkit-flex-shrink: 1;
    flex-shrink: 1;
}```

[![fx15](http://upload-images.jianshu.io/upload_images/2643476-462c974e6ef07c63.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx15.png)
上面是允許放大嘉栓,box語法中 box-flex如果不是0就表示該子元素允許伸縮宏榕,而flex是分開的,上面 flex-grow是允許放大(默認(rèn)不允許)侵佃,下面的 flex-shrink是允許縮新橹纭(默認(rèn)允許)。box-flex默認(rèn)值為0馋辈,也就是說抚芦,在默認(rèn)的情況下,在兩個瀏覽器中的表現(xiàn)是不一樣的:
[![flex](http://upload-images.jianshu.io/upload_images/2643476-bacf3c45a0557505.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx11.png)
這里還有一點迈螟,就是新舊語法的算法是不一樣的叉抡,假設(shè) box-flex的值不等于0,舊語法中答毫,如果有多余的空間褥民,box-flex的值越大,說明空白部分的占比越多洗搂,反之亦然:
[![flex](http://upload-images.jianshu.io/upload_images/2643476-d86d65e5e9da1371.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx13.png)
而新版的語法中消返,放大的比例是直接按 flex-grow的值來分配的,flex-grow的縮放會覆蓋 flex-shrink:0
耘拇,看例子:
[![flex](http://upload-images.jianshu.io/upload_images/2643476-2c7e7697bb55ca6b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx14.png)
參數(shù):

.item{
box-flex: <value>;
/伸縮:<一個浮點數(shù)撵颊,默認(rèn)為0.0,即表示不可伸縮惫叛,大于0的值可伸縮倡勇,柔性相對>/
flex-grow: <number>;
/* default 0 //放大:默認(rèn)0(即如果有剩余空間也不放大,值為1則放大挣棕,2是1的雙倍大小译隘,以此類推)/
flex-shrink: <number>;
/
default 1 //縮星浊拧:默認(rèn)1(如果空間不足則會縮小,值為0不縮泄淘拧)*/
}```

子元素的顯示次序

.item{
    -webkit-box-ordinal-group: 1;
    -moz-order: 1;
    -webkit-order: 1;
    order: 1;
}```

[![flex](http://upload-images.jianshu.io/upload_images/2643476-41e8a7b1948f8716.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://source.ccwebsite.com/wp-content/uploads/2015/11/fx16.png)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末题篷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子厅目,更是在濱河造成了極大的恐慌番枚,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件损敷,死亡現(xiàn)場離奇詭異葫笼,居然都是意外死亡,警方通過查閱死者的電腦和手機拗馒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門路星,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诱桂,你說我怎么就攤上這事洋丐。” “怎么了挥等?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵友绝,是天一觀的道長。 經(jīng)常有香客問我肝劲,道長迁客,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任辞槐,我火速辦了婚禮掷漱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘催蝗。我一直安慰自己切威,他們只是感情好育特,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布丙号。 她就那樣靜靜地躺著,像睡著了一般缰冤。 火紅的嫁衣襯著肌膚如雪犬缨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天棉浸,我揣著相機與錄音怀薛,去河邊找鬼。 笑死迷郑,一個胖子當(dāng)著我的面吹牛枝恋,可吹牛的內(nèi)容都是我干的创倔。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼焚碌,長吁一口氣:“原來是場噩夢啊……” “哼畦攘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起十电,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤知押,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鹃骂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體台盯,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年畏线,在試婚紗的時候發(fā)現(xiàn)自己被綠了静盅。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡寝殴,死狀恐怖温亲,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情杯矩,我是刑警寧澤栈虚,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站史隆,受9級特大地震影響魂务,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泌射,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一粘姜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熔酷,春花似錦孤紧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至躺酒,卻和暖如春押蚤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背羹应。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工揽碘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓雳刺,卻偏偏與公主長得像劫灶,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掖桦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

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