Flex佈局新舊混合寫法詳解(相容微信)
flex是個非常好用的屬性,如果說有什麼可以完全代替 float
和 position
,那麼肯定是非它莫屬了(雖然現在還有很多不支援 flex
的瀏覽器)。然而在移動開發中,本來絕大多數瀏覽器(包括安卓2.3以上的自帶瀏覽器)都支援的屬性,偏偏有個例外,就是國產某某X5核心神器(不知哪個版本的webkit,僅支援 display:box
),自主研發這東西也不好多說什麼了,下面入正題。
首先還是從兩個版本的語法開始講吧,這裡還是假設flex容器為 .box
,子元素為 .item
。
舊語法篇
定義容器的display屬性
.box{
display: -moz-box; /*Firefox*/
display: -webkit-box; /*Safari,Opera,Chrome*/
display: box;
}
容器屬性
1.box-pack 屬性
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;
/*主軸對齊:左對齊(預設) | 右對齊 | 居中對齊 | 左右對齊*/
}
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定義子元素是否應水平或垂直排列。
.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;
/*排列方向:水平 | 垂直 | 行內方式排列(預設) | 塊方式排列 | 繼承父級的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;
}
這裡舊版語法有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{
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;
}
右到左
.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{
-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;
}
是否允許子元素伸縮
.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;
}
上面是允許放大,box語法中 box-flex
如果不是0就表示該子元素允許伸縮,而flex是分開的,上面 flex-grow
是允許放大(預設不允許),下面的 flex-shrink
是允許縮小(預設允許)。box-flex
預設值為0,也就是說,在預設的情況下,在兩個瀏覽器中的表現是不一樣的:
這裡還有一點,就是新舊語法的演算法是不一樣的,假設 box-flex
的值不等於0,舊語法中,如果有多餘的空間,box-flex
的值越大,說明空白部分的佔比越多,反之亦然:
而新版的語法中,放大的比例是直接按 flex-grow
的值來分配的,flex-grow
的縮放會覆蓋 flex-shrink:0
,看例子:
引數:
.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佈局新舊混合寫法詳解(相容微信)
文章作者:Heleth
版權宣告:自由轉載-非商用-非衍生-保持署名(創意共享3.0許可證) 轉載請註明出處
相關文章
- 常用flex樣式類最全相容寫法詳解Flex
- 詳解CSS的Flex佈局CSSFlex
- flex 佈局:語法Flex
- CSS例項詳解:Flex佈局CSSFlex
- Flutter系列之Flex佈局詳解FlutterFlex
- Flex 佈局語法教程Flex
- 微信小程式CSS之Flex佈局微信小程式CSSFlex
- flex佈局語法+例項Flex
- Flex 佈局教程:語法篇Flex
- css--flex彈性佈局詳解和使用CSSFlex
- 寫給自己看的 Flex 佈局Flex
- Flex佈局語法與實踐Flex
- flex 佈局Flex
- Flex佈局Flex
- flex佈局不相容ie怎麼設定Flex
- flex佈局(彈性佈局)Flex
- 微信小程式前置課程:flex佈局(二)微信小程式Flex
- 小程式Flex 佈局教程:語法篇Flex
- CSS-Flex 佈局教程:語法篇CSSFlex
- 浮動佈局 和 flex佈局Flex
- css flex佈局CSSFlex
- flex佈局原理Flex
- 寫給 Android 開發的小程式佈局指南,Flex 佈局!AndroidFlex
- 圖解CSS3-flex佈局圖解CSSS3Flex
- Flutter佈局——Flex、FittedBox、Stack、Container佈局教程【超詳細】FlutterFlexAI
- CSS Flex 佈局的 flex-direction 屬性講解CSSFlex
- CSS3 Flex 彈性佈局例項程式碼詳解CSSS3Flex
- 重溫 Flex 佈局Flex
- Flex佈局應用Flex
- flex佈局屬性Flex
- 淺談Flex佈局Flex
- flex佈局實戰Flex
- html的flex佈局?HTMLFlex
- flex佈局筆記Flex筆記
- flex佈局學習Flex
- flex佈局——轉載Flex
- ReactNative flex 佈局ReactFlex
- CSS display: flex佈局CSSFlex