幾個(gè)問題
- 一個(gè)彈性布局可以由哪幾方面決定匀归?
-
flex
布局在web
端與react-native
端表現(xiàn)一樣嗎鳞疲? -
react-native
中的flex:1
樣式的含義?
1. 簡介
2009
年,W3C
提出了一種新的方案——Flex
布局均抽,可以簡便、完整其掂、響應(yīng)式地實(shí)現(xiàn)各種頁面布局油挥。目前,它已經(jīng)得到了幾乎所有瀏覽器的支持款熬,成為未來布局的首選方案深寥。
2. 基本概念
-
Flex
是Flexible Box
的縮寫,意為"彈性布局"贤牛,用來為盒狀模型提供最大的靈活性惋鹅。任何一個(gè)容器都可以指定為Flex
布局。設(shè)為Flex
布局以后殉簸,子元素的float
闰集、clear
和vertical-align
屬性將失效。 -
用Flex
布局的元素般卑,稱為Flex
容器(flex container
)武鲁,簡稱"容器"。它的所有子元素自動(dòng)成為容器成員蝠检,稱為Flex
項(xiàng)目(flex item
)沐鼠,簡稱"項(xiàng)目"。 - 容器默認(rèn)存在兩根軸:水平的主軸(
main axis
)和垂直的交叉軸(cross axis
)。項(xiàng)目默認(rèn)沿主軸排列饲梭。
Flex
布局關(guān)鍵因素: ①主軸與交叉軸方向; ②兩個(gè)方向?qū)R方式; ③兩個(gè)方向伸縮情況;④是否換行乘盖。
3. 容器屬性
3.1 7個(gè)容器屬性
- 容器屬性表
屬性 | 含義 |
---|---|
display: flex |
定義flex布局 |
flex-direction |
定義主軸與交叉軸方向 |
flex-wrap |
定義主軸方向是否換行 |
flex-flow |
定義主軸與交叉軸方向、是否換行 |
justify-content |
定義項(xiàng)目在主軸方向?qū)R方式 |
align-items |
定義項(xiàng)目在交叉軸方向對齊方式及伸縮情況 |
align-content |
定義多根軸線在交叉軸方向的對齊方式 |
- 常用屬性
flex-direction
排拷、justify-content
侧漓、align-items
3.2 display: flex屬性
- 設(shè)置
flex
布局
(1)Web
端視圖
(2)RN
端視圖
-
RN
端與Web
端差異
(1)Web
端
需要設(shè)置display: flex
主軸方向默認(rèn)水平向右。
(2)RN
端
元素的display
屬性取值為flex
和none
监氢,默認(rèn)為flex
布蔗。
主軸方向默認(rèn)豎直向下。
3.3 flex-direction屬性
- 定義主軸與交叉軸方向
flex-direction: row | row-reverse | column | column-reverse;
①row
(默認(rèn)值)主軸方向水平向右浪腐,交叉軸方向豎直向下纵揍。
②row-reverse
主軸方向水平向左,交叉軸方向豎直向下议街。
③column
主軸方向豎直向下泽谨,交叉軸方向水平向右。
④column-reverse
主軸方向豎直向上特漩,交叉軸方向水平向右吧雹。
2.RN
端與Web
端差異
RN
端默認(rèn)值為column
。
3.4 flex-wrap屬性
- 定義主軸方向是否換行
flex-wrap: nowrap | wrap | wrap-reverse;
①nowrap
(默認(rèn))不換行涂身。
②wrap
換行雄卷,第一行在上方。
③wrap-reverse
換行蛤售,第一行在下方丁鹉。 -
RN
端與Web
端差異
RN
端屬性取值沒有wrap-reverse
。
3.5 flex-flow屬性
- 定義主軸與交叉軸方向悴能、是否換行
flex-flow
屬性是flex-direction
屬性和flex-wrap
屬性的簡寫形式揣钦,默認(rèn)值為row nowrap
。 -
RN
端與Web
端差異
RN
端不支持此屬性漠酿。
3.6 justify-content屬性
- 定義項(xiàng)目在主軸方向?qū)R方式
justify-content: flex-start | flex-end | center | space-between | space-around;
①flex-start
(默認(rèn)值)向主軸起點(diǎn)方向?qū)R
②flex-end
向主軸終點(diǎn)方向?qū)R
③center
向主軸中點(diǎn)方向?qū)R
④space-between
兩端對齊冯凹,間隔相等
⑤space-around
兩側(cè)間隔相等,項(xiàng)目間隔是項(xiàng)目與邊框間隔的2倍 - 此屬性
RN
端與Web
端無差異
3.7 align-items屬性
- 定義項(xiàng)目在交叉軸方向?qū)R方式及伸縮情況
align-items: flex-start | flex-end | center | baseline | stretch;
①flex-start
向交叉軸起點(diǎn)方向?qū)R
②flex-end
向交叉軸終點(diǎn)方向?qū)R
③center
向交叉軸中點(diǎn)方向?qū)R
④baseline
項(xiàng)目的第一行文字的基線對齊
⑤stretch
(默認(rèn)值)如果項(xiàng)目未設(shè)置高度或設(shè)為auto炒嘲,將占滿整個(gè)容器的高度
注釋:stretch
為默認(rèn)屬性值谈竿,即項(xiàng)目在交叉軸方向若未設(shè)置尺寸,則占滿容器尺寸摸吠;若已設(shè)置尺寸,則等于設(shè)置尺寸嚎花,既不可被拉伸又不可被壓縮寸痢。
當(dāng)align-items
屬性為其他屬性值時(shí),無論項(xiàng)目在交叉軸方向是否設(shè)置尺寸紊选,都以自身尺寸為準(zhǔn)啼止,既不可被壓縮道逗,又不可被拉伸。 -
RN
端與Web
端差異
RN
端baseline
屬性值的表現(xiàn)為項(xiàng)目底邊對齊献烦。
3.8 align-content屬性
- 定義多根軸線在交叉軸方向的寬度及對齊方式
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
①flex-start
與交叉軸的起點(diǎn)對齊滓窍。
②flex-end
與交叉軸的終點(diǎn)對齊。
③center
與交叉軸的中點(diǎn)對齊巩那。
④space-between
與交叉軸兩端對齊吏夯,軸線之間的間隔平均分布
⑤space-around
每根軸線兩側(cè)的間隔都相等。所以即横,軸線之間的間隔比軸線與邊框的間隔大一倍
⑥stretch
(默認(rèn)值)軸線占滿整個(gè)交叉軸噪生。
注釋: 無論項(xiàng)目軸線有一根或多根時(shí),align-items
屬性都生效东囚。只有當(dāng)項(xiàng)目軸線有多根時(shí)跺嗽,該屬性才生效。 -
RN
端與Web
端差異
RN
端默認(rèn)屬性值為flex-start
页藻。
4.項(xiàng)目屬性
4.1 6個(gè)項(xiàng)目屬性
屬性 | 含義 |
---|---|
order |
定義項(xiàng)目在主軸方向的排列順序 |
flex-grow |
定義項(xiàng)目在主軸方向的放大比例 |
flex-shrink |
定義項(xiàng)目在主軸方向的縮小比例 |
flex-basis |
定義在分配多余空間之前桨嫁,項(xiàng)目占據(jù)的主軸空間 |
flex |
定義項(xiàng)目在主軸方向的伸縮情況 |
align-self |
定義單個(gè)項(xiàng)目在交叉軸方向的對齊方式及伸縮情況 |
4.2 order屬性
- 定義項(xiàng)目在主軸方向的排列順序
order: <integer>;
注釋:數(shù)值越小,排列越靠前份帐,默認(rèn)為0
璃吧。 -
RN
端與Web
端差異
RN
端不支持order
屬性。
4.3 flex-grow屬性
- 定義項(xiàng)目在主軸方向的放大比例
flex-grow: <number>;
注釋:①默認(rèn)為0
, 即如果存在剩余空間弥鹦,也不放大肚逸。②如果所有項(xiàng)目的flex-grow
屬性都為1
,則它們將等分剩余空間(如果有的話)彬坏。如果一個(gè)項(xiàng)目的flex-grow
屬性為2朦促,其他項(xiàng)目都為1
,則前者占據(jù)的剩余空間將比其他項(xiàng)多一倍栓始。即:放大寬度 = 彈性寬度 * (flex-grow/sum(flex-grow))
注意: 剩余空間的分配比例只與flex-grow
的屬性值有關(guān)务冕,與各個(gè)項(xiàng)目的初始尺寸無關(guān)。 - 此屬性
RN
端與Web
端無差異
4.4 flex-shrink屬性
- 定義項(xiàng)目在主軸方向的縮小比例
flex-shrink: <number>;
注釋: ①默認(rèn)為1
幻赚,即如果空間不足禀忆,該項(xiàng)目將縮小。②如果所有項(xiàng)目的flex-shrink
屬性都為1
落恼,當(dāng)空間不足時(shí)箩退,都將等比例縮小。如果一個(gè)項(xiàng)目的flex-shrink
屬性為0
佳谦,其他項(xiàng)目都為1
戴涝,則空間不足時(shí),前者不縮小。
2.RN
端與Web
端差異
RN
端默認(rèn)屬性值為0
,當(dāng)空間不足時(shí),項(xiàng)目不縮小壁榕。
總結(jié):Web
端默認(rèn)不放大但縮小棚点,RN端默認(rèn)不放大且不縮小。
4.5 flex-basis屬性
- 定義在分配多余空間之前,項(xiàng)目占據(jù)的主軸空間
flex-basis: <length> | auto;
注釋:①瀏覽器在該屬性值的基礎(chǔ)上進(jìn)行縮放。②默認(rèn)值為auto
,即項(xiàng)目的本來大小蓄拣。③可以設(shè)置為與width
或height
屬性一樣的值。 - 此屬性
RN
端與Web
端無差異
4.6 flex屬性
-
flex
屬性是flex-grow
,flex-shrink
和flex-basis
的簡寫申窘,默認(rèn)值為0 1 auto
弯蚜。后兩個(gè)屬性可選。
快捷值:auto (1 1 auto)
剃法、none (0 0 auto)
碎捺。
注釋:①auto
為常用屬性值,即項(xiàng)目在主軸方向可伸縮贷洲。②外邊距不可伸縮收厨。
②可設(shè)置某個(gè)項(xiàng)目的寬度為固定百分比,其余項(xiàng)目平均分配剩余空間优构。
.item{flex:auto}
.item1{flex:0 0 60%}
③可設(shè)置某個(gè)項(xiàng)目的寬度為固定像素诵叁,其余項(xiàng)目平均分配剩余空間。
.item{flex:auto}
.item1{flex:0 0 100px}
-
RN
端與Web
端差異
(1)flex
屬性的表現(xiàn)與Web
端不同钦椭,取值只能為數(shù)字拧额。
(2)flex
屬性并不簡單是flex-grow/shrink/basis
的簡化
(3)flex
默認(rèn)值為0
,表示項(xiàng)目保持原始尺寸彪腔,且總是不可伸縮侥锦。
(4) 若flex
取值為-1
,則表示項(xiàng)目保持原始尺寸德挣,但當(dāng)容器尺寸不夠時(shí)恭垦,縮小到minWidth
或minHeight
。
(5) 若flex
取值為n(n>=1)
格嗅,則按照flex
值的比例分配剩余空間番挺,剩余空間指的是容器尺寸減去flex
值為0
或-1
項(xiàng)目的尺寸。
4.7 align-self屬性
- 定義單個(gè)項(xiàng)目在交叉軸方向的對齊方式及伸縮情況
align-self: auto | flex-start | flex-end | center | baseline | stretch;
注釋: ①默認(rèn)值為auto
屯掖,表示繼承父元素的align-items
屬性玄柏,如果沒有父元素,則等同于stretch
贴铜。②該屬性可能取6
個(gè)值禁荸,除了auto
右蒲,其他都與align-items
屬性完全一致。
注意: 子未設(shè)置align-self
屬性赶熟,則繼承父的align-items
屬性。子設(shè)置align-self
屬性陷嘴,可以覆蓋父的align-items
屬性映砖。 - 此屬性
RN
端與Web
端無差異
5. Flex常用屬性匯總(Web端)
注釋:
Flex
布局關(guān)鍵因素:①主軸與交叉軸方向;②兩個(gè)方向?qū)R方式;③兩個(gè)方向伸縮情況。④是否換行灾挨。
6.參考資料
Flex 布局語法篇
Flex布局實(shí)例篇
Flex布局演示
ReactNative/LayoutPropTypes