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

flex 是個很是好用的屬性,若是說有什麼能夠徹底代替 floatposition ,那麼確定是非它莫屬了(雖然如今還有不少不支持 flex 的瀏覽器)。然而國內不少瀏覽器對 flex 的支持都不是很好,這裏針對微信內置瀏覽器寫了一套兼容寫法。下面入正題。css

首先仍是從兩個版本的語法開始講吧,這裏仍是假設 flex 容器爲 .box ,子元素爲 .itemgit

舊語法篇

定義容器的 display 屬性

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

容器屬性

1. box-pack 屬性

box-pack 定義子元素主軸對齊方式。github

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

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

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

2. box-align 屬性

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;
    /*交叉軸對齊:頂部對齊(默認) | 底部對齊 | 居中對齊 | 文本基線對齊 | 上下對齊並鋪滿*/
}

3. box-direction 屬性

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;
    /*顯示方向:默認方向 | 反方向 | 繼承子元素的 box-direction*/
}

4. box-orient 屬性

box-orient 定義子元素是否應水平或垂直排列。flex

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

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

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

5. box-lines 屬性

box-lines 定義當子元素超出了容器是否容許子元素換行。

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

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

.box{
    box-lines: single | multiple;
    /*容許換行:不容許(默認) | 容許*/
}

子元素屬性

1. box-flex 屬性

box-flex 定義是否容許當前子元素伸縮。

.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>;
    /*伸縮:<一個浮點數,默認爲0.0,即表示不可伸縮,大於0的值可伸縮,柔性相對>*/
}

2.box-ordinal-group 屬性

box-ordinal-group 定義子元素的顯示次序,數值越小越排前。

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

box-direction 屬性使用一個整數值:

.item{
    box-ordinal-group: <integer>;
    /*顯示次序:<一個整數,默認爲1,數值越小越排前>*/
}

新版語法

定義容器的 display 屬性

.box{
    display: -webkit-flex; /*webkit*/
    display: flex;
}

/*行內flex*/
.box{
    display: -webkit-inline-flex; /*webkit*/
    display:inline-flex;
}

容器樣式

.box{
    flex-direction: row | row-reverse | column | column-reverse;
    /*主軸方向:左到右(默認) | 右到左 | 上到下 | 下到上*/

    flex-wrap: nowrap | wrap | wrap-reverse;
    /*換行:不換行(默認) | 換行 | 換行並第一行在下方*/

    flex-flow: <flex-direction> || <flex-wrap>;
    /*主軸方向和換行簡寫*/

    justify-content: flex-start | flex-end | center | space-between | space-around;
    /*主軸對齊方式:左對齊(默認) | 右對齊 | 居中對齊 | 兩端對齊 | 平均分佈*/

    align-items: flex-start | flex-end | center | baseline | stretch;
    /*交叉軸對齊方式:頂部對齊(默認) | 底部對齊 | 居中對齊 | 上下對齊並鋪滿 | 文本基線對齊*/

    align-content: flex-start | flex-end | center | space-between | space-around | stretch;
    /*多主軸對齊:頂部對齊(默認) | 底部對齊 | 居中對齊 | 上下對齊並鋪滿 | 上下平均分佈*/
}

子元素屬性

.item{
    order: <integer>;
    /*排序:數值越小,越排前,默認爲0*/

    flex-grow: <number>; /* default 0 */
    /*放大:默認0(即若是有剩餘空間也不放大,值爲1則放大,2是1的雙倍大小,以此類推)*/

    flex-shrink: <number>; /* default 1 */
    /*縮小:默認1(若是空間不足則會縮小,值爲0不縮小)*/

    flex-basis: <length> | auto; /* default auto */
    /*固定大小:默認爲0,能夠設置px值,也能夠設置百分比大小*/

    flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
    /*flex-grow, flex-shrink 和 flex-basis的簡寫,默認值爲0 1 auto,*/

    align-self: auto | flex-start | flex-end | center | baseline | stretch;
    /*單獨對齊方式:自動(默認) | 頂部對齊 | 底部對齊 | 居中對齊 | 上下對齊並鋪滿 | 文本基線對齊*/
}

兼容寫法

首先是定義容器的 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 標準,因此這裏不用寫 display:box ,下面的語法也是同樣的。

這裏還要注意的是,若是子元素是行內元素,在不少狀況下都要使用 display: block 或 display: inline-block 把行內子元素變成塊元素(例如使用 box-flex 屬性),這也是舊版語法和新版語法的區別之一。

子元素主軸對齊方式

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

box-pack

這裏舊版語法有 4 個參數,而新版語法有 5 個參數,兼容寫法新版語法的 space-around 是不可用的:

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

    justify-content: flex-start | flex-end | center | space-between | space-around;
    /*主軸對齊方式:左對齊(默認) | 右對齊 | 居中對齊 | 兩端對齊 | 平均分佈*/
}

子元素交叉軸對齊方式

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

box-align

這裏的參數除了寫法不一樣,實際上是功能是同樣的:

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

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

子元素的顯示方向

子元素的顯示方向可經過 box-direction + box-orient + flex-direction 實現,下面請看實例:

左到右

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

flex-direction

右到左

.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

上到下

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

box-orient: vertical

下到上

.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

是否容許子元素伸縮

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

flex

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

fx15

上面是容許放大,box語法中 box-flex 若是不是 0 就表示該子元素容許伸縮,而 flex 是分開的,上面 flex-grow 是容許放大(默認不容許),下面的 flex-shrink 是容許縮小(默認容許)。box-flex 默認值爲 0 ,也就是說,在默認的狀況下,在兩個瀏覽器中的表現是不同的:

flex

這裏還有一點,就是新舊語法的算法是不同的,假設 box-flex 的值不等於 0 ,舊語法中,若是有多餘的空間,box-flex 的值越大,說明空白部分的佔比越多,反之亦然:

flex

而新版的語法中,放大的比例是直接按 flex-grow 的值來分配的,flex-grow 的縮放會覆蓋 flex-shrink: 0,看例子:

flex

參數:

.item{
    box-flex: <value>;
    /*伸縮:<一個浮點數,默認爲0.0,即表示不可伸縮,大於0的值可伸縮,柔性相對>*/

    flex-grow: <number>; /* default 0 */
    /*放大:默認0(即若是有剩餘空間也不放大,值爲1則放大,2是1的雙倍大小,以此類推)*/

    flex-shrink: <number>; /* default 1 */
    /*縮小:默認1(若是空間不足則會縮小,值爲0不縮小)*/
}

子元素的顯示次序

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

flex

不足之處請多指點,本文不斷更新。

SASS 版的 Gist 地址

原文地址:Flex佈局新舊混合寫法詳解(兼容微信)
文章做者:何啓邦
版權聲明:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證) 轉載請註明出處

相關文章
相關標籤/搜索