FlexBox 布局基本用法
1、什么是FlexBox
Flexbox是
Flexible Box
的縮寫卵皂,意為'彈性布局'惯吕,它為盒狀模型提供了很大的靈活性倒庵,讓任何一個(gè)容器都可以指定為Flex布局任何一個(gè)容器都可以指定為Flex布局
2、基本概念和屬性
使用Flex布局的元素因块,稱為Flex容器(flex Container)橘原,簡(jiǎn)稱'容器'。它的所有子元素自動(dòng)成為容器的成員涡上,稱為Flex項(xiàng)目(flex Item)
先了解下標(biāo)準(zhǔn)的盒子模型:
下面主要講解Flex的Container
屬性 和 Item
屬性
下面給出一張F(tuán)lexBox布局的示例圖:
從上面的示例圖中可以看出趾断,F(xiàn)lex容器默認(rèn)存在兩根軸:水平方向的主軸(main axis),與主軸垂直方向的交叉軸(cross axis)吩愧。主軸的排布方向是從左至右芋酌,交叉軸的排布方向是從上至下,F(xiàn)lex容器中的Item元素默認(rèn)是按照主軸方向進(jìn)行排序雁佳,Item占據(jù)主軸空間稱為main size
脐帝,Item占據(jù)交叉軸空間稱為cross size
注意:
本篇FlexBox基本使用教程主要是針對(duì)
web
端布局進(jìn)行講解的同云,React Native
開發(fā)中使用的FlexBox布局和web端用法基本上一致,但是還是有些差異性堵腹,主要差異大致分為如下幾點(diǎn)炸站,后面的屬性講解中對(duì)于React Native
和web
端的差異,主要的差異會(huì)通過小括號(hào)
單獨(dú)的注釋說明
- 屬性名不同:在
web
端多個(gè)單詞之間是以中劃線連接(例如:flex-direction)疚顷,在React Native
中是以駝峰命名(flexDirection) - 默認(rèn)值不同:例如在
web
端默認(rèn)主軸方向?yàn)闄M向(flex-direction: column)旱易,在React Native
中默認(rèn)的主軸方向?yàn)樨Q直方向(flexDirection: row) - 有些FlexBox的屬性在
web
端是生效的,但是在React Native
中不生效的荡含,例如:(flex-flow )
3咒唆、Flex容器(Container)屬性
容器屬性主要有下列6個(gè):
- flex-direction(在RN中屬性名稱為:flexDirection)
- flex-wrap(在RN中屬性名稱為:flexWrap)
- flex-flow(RN中暫時(shí)用不到此屬性)
- justify-content(在RN中屬性名稱為:justifyContent)
- align-items(在RN中屬性名稱為:alignItems)
- align-content(在RN中暫時(shí)用不到此屬性)
下面我們分別來講解這6個(gè)容器屬性的使用方式和作用
3.1 flex-direction
flex-direction
作用:用來決定容器的主軸方向
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
flex-direction
屬性有四個(gè)取值:
- row:主軸為水平方向,起點(diǎn)在左端
- row-reverse:主軸為水平方向释液,起點(diǎn)在右端
- column:主軸為豎直方向全释,起點(diǎn)在上沿
- column-reverse:主軸為豎直方向,起點(diǎn)在下沿
注意:在React Native
中误债,當(dāng)沒有設(shè)置容器的主軸方向時(shí)浸船,默認(rèn)容器主軸方向?yàn)椋?code>flex-direction: column,也就是說寝蹈,當(dāng)我們的容器的主軸的排布方向?yàn)樨Q直方向時(shí)李命,這時(shí)我們可以省略不寫flex-direction
屬性
3.2 flex-wrap
默認(rèn)情況下,容器中的Item元素都排列在一條軸線上箫老,flex-wrap屬性定義了如果在一條軸線上排列不下所有的Item元素封字,可以進(jìn)行換行排列
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
flex-wrap
屬性有三個(gè)取值:
- nowrap(默認(rèn)值):不換行
- wrap:換行,第一行在上方
- wrap-reverse:換行耍鬓,第一行在下方
3.3 flex-flow
flex-flow
屬性是flex-direction
屬性和flex-wrap
屬性的簡(jiǎn)寫形式阔籽,默認(rèn)值為row nowrap
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}
3.4 justify-content
justify-content
屬性定義了Item在主軸方向上的對(duì)齊方式
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
justify-content
屬性有5個(gè)取值,具體對(duì)齊方式與軸的方向有關(guān)牲蜀。下面假設(shè)主軸方向?yàn)閺淖蟮接?/p>
- flex-start(默認(rèn)值):左對(duì)齊
- flex-end:右對(duì)齊
- center:居中
- space-between:兩端對(duì)齊笆制,Item之間的間隔都相等
- space-around:每個(gè)Item兩側(cè)的間隔相等。Item之間的間隔比Item與邊框的間隔大一倍
3.5 align-items
align-items
屬性定義Item在交叉軸上的對(duì)齊方式
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
align-items
屬性有5個(gè)取值涣达,具體的對(duì)齊方式與交叉軸的方向有關(guān)在辆,下面假設(shè)交叉軸方向從上到下
- flex-start:(默認(rèn)值)交叉軸的起點(diǎn)對(duì)齊
- flex-end:交叉軸的終點(diǎn)對(duì)齊
- center:交叉軸的中點(diǎn)對(duì)齊
- baseline: 項(xiàng)目的第一行文字的基線對(duì)齊
- stretch:如果項(xiàng)目未設(shè)置高度或設(shè)為auto,將占滿整個(gè)容器的高度
3.6 align-content
align-content
屬性定義了多根軸線的對(duì)齊方式度苔,如果項(xiàng)目只有一根軸線匆篓,該屬性不起作用
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
align-content
屬性有6個(gè)取值
- flex-start:(默認(rèn)值)與交叉軸的起點(diǎn)對(duì)齊
- flex-end:與交叉軸的終點(diǎn)對(duì)齊
- center:與交叉軸的中點(diǎn)對(duì)齊
- space-between:與交叉軸兩端對(duì)齊,軸線之間的間隔平均分布
- space-around:每根軸線兩側(cè)的間隔都相等寇窑,軸線之間的間隔比軸線與邊框的間隔大一倍
- stretch:軸線占滿整個(gè)交叉軸
4奕删、項(xiàng)目(Item)屬性
Flex容器中的Item元素有以下6個(gè)屬性
- order(RN中不生效)
- flex-grow(RN中不生效)
- flex-shrink(RN中不生效)
- flex-basis(RN中不生效)
- flex(RN中使用
flex: 1
:當(dāng)只有一個(gè)元素使用flex:1 則這個(gè)元素將充滿整個(gè)屏幕,當(dāng)有多個(gè)元素使用flex: 1 則這多個(gè)元素平分屏幕空間大小) - align-self
4.1 order
order
屬性定義了Item的排列順序疗认,數(shù)值越小完残,排列越靠前伏钠,默認(rèn)為0
.item {
order: <integer>;
}
4.2 flex-grow
flex-grow
屬性定義了Item的放大比例,默認(rèn)為0谨设,即如果存在剩余空間熟掂,也不放大
.item {
flex-grow: <number>; /* default 0 */
}
如果所有Item的flex-grow
屬性都為1,則它們將等分剩余空間(如果有的話)扎拣,如果一個(gè)Item的flex-grow
屬性為2赴肚,其他Item都為1,則前者占據(jù)的剩余空間將比其他Item多一倍
4.3 flex-shrink
flex-shrink
屬性定義了Item的縮小比例二蓝,默認(rèn)為1誉券,即如果空間不足,該Item將縮小
.item {
flex-shrink: <number>; /* default 1 */
}
如果所有Item的flex-shrink屬性都為1刊愚,當(dāng)空間不足時(shí)踊跟,都將等比例縮小,如果一個(gè)Item的flex-shrink屬性為0鸥诽,其他Item都為1商玫,則空間不足時(shí),前者不縮小牡借。負(fù)值對(duì)該屬性無效
4.4 flex-basis
flex-basis
屬性定義了在分配多余空間之前拳昌,Item占據(jù)的主軸空間(main size),瀏覽器根據(jù)這個(gè)屬性钠龙,計(jì)算主軸是否有多余空間炬藤。它的默認(rèn)值為auto,即Item的本來大小
.item {
flex-basis: <length> | auto; /* default auto */
}
它可以設(shè)為跟width或height屬性一樣的值(比如350px)碴里,則Item將占據(jù)固定空間
4.5 flex
flex
屬性是flex-grow
沈矿,flex-shrink
和 flex-basis
的簡(jiǎn)寫,默認(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)值
4. 6 align-self
align-self
屬性允許單個(gè)Item有與其他Item不一樣的對(duì)齊方式帝火,可覆蓋align-items的屬性。默認(rèn)值為auto湃缎,表示繼承父元素的align-items屬性犀填,如果沒有父元素,則等同于stretch
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
align-self
屬性有6個(gè)取值嗓违,除了增加一個(gè)auto屬性九巡,其他都與align-items
屬性完全一致,具體的對(duì)齊方式與交叉軸的方向有關(guān)蹂季,下面假設(shè)交叉軸方向從上到下
- flex-start:(默認(rèn)值)交叉軸的起點(diǎn)對(duì)齊
- flex-end:交叉軸的終點(diǎn)對(duì)齊
- center:交叉軸的中點(diǎn)對(duì)齊
- baseline: 項(xiàng)目的第一行文字的基線對(duì)齊
- stretch:如果項(xiàng)目未設(shè)置高度或設(shè)為auto冕广,將占滿整個(gè)容器的高度
- auto
FlexBox布局在React Native開發(fā)中的使用
在React Native開發(fā)中最多用到的FlexBox布局中的屬性如下:
- flex
- flexDirection
- justifyContent
- alignItems
- alignSelf
- flexWrap
更多文章
- 作者React Native開源項(xiàng)目OneM【500+ star】地址(按照企業(yè)開發(fā)標(biāo)準(zhǔn)搭建框架完成開發(fā)的):https://github.com/guangqiang-liu/OneM:歡迎小伙伴們 star
- 作者簡(jiǎn)書主頁:包含60多篇RN開發(fā)相關(guān)的技術(shù)文章http://www.reibang.com/u/023338566ca5 歡迎小伙伴們:多多關(guān)注疏日,多多點(diǎn)贊