React Native布局詳細(xì)指南

一款好的APP離不了一個(gè)漂亮的布局贾陷,本文章將向大家分享React Native中的布局方式FlexBox邪驮。 在React Native中布局采用的是FleBox(彈性框)進(jìn)行布局。
FlexBox提供了在不同尺寸設(shè)備上都能保持一致的布局方式贫橙。FlexBox是CSS3彈性框布局規(guī)范喘帚,目前還處于最終征求意見稿 (Last Call Working Draft)階段畅姊,并不是所有的瀏覽器都支持Flexbox。但大家在做React Native開發(fā)時(shí)大可不必?fù)?dān)心FlexBox的兼容性問題吹由,因?yàn)榧热籖eact Native選擇用FlexBox布局若未,那么React Native對(duì)FlexBox的支持自然會(huì)做的很好。

寬和高

在學(xué)習(xí)FlexBox之前首先要清楚一個(gè)概念“寬和高”倾鲫。一個(gè)組件的高度和寬度決定了它在屏幕上的尺寸粗合,也就是大小。

像素?zé)o關(guān)

在React Native中尺寸是沒有單位的乌昔,它代表了設(shè)備獨(dú)立像素隙疚。

<View style={ {width:100,height:100,margin:40,backgroundColor:'gray'}}> 
  <Text style={ {fontSize:16,margin:20}}>尺寸</Text>
</View>

上述代碼,運(yùn)行在Android上時(shí)磕道,View的長和寬被解釋成:100dp 100dp單位是dp供屉,字體被解釋成16sp 單位是sp,運(yùn)行在iOS上時(shí)尺寸單位被解釋稱了pt,這些單位確保了布局在任何不同dpi的手機(jī)屏幕上顯示不會(huì)發(fā)生改變伶丐;

和而不同

值得一提的是悼做,React Native中的FlexBox 和Web CSSS上FlexBox工作方式是一樣的。但有些地方還是有些出入的哗魂,如:

React Native中的FlexBox 和Web CSSS上FlexBox的不同之處
  • flexDirection: React Native中默認(rèn)為flexDirection:'column'
    肛走,在Web CSS中默認(rèn)為flex-direction:'row'

  • alignItems: React Native中默認(rèn)為alignItems:'stretch'
    ,在Web CSS中默認(rèn)align-items:'flex-start'

  • flex: 相比Web CSS的flex接受多參數(shù)录别,如:flex: 2 2 10%;
    朽色,但在 React Native中flex只接受一個(gè)參數(shù)

  • 不支持屬性:align-contentflex-basis组题,order葫男,flex-basisflex-flow往踢,flex-grow腾誉,flex-shrink

以上是React Native中的FlexBox 和Web CSSS上FlexBox的不同之處,記住這幾點(diǎn)峻呕,你可以像在Web CSSS上使用FlexBox一樣利职,在React Native中使用FlexBox。

Layout Props

Flex in React Native

以下屬性是React Native所支持的Flex屬性瘦癌。

父視圖屬性(容器屬性):

  • flexDirection enum(‘row’, ‘column’,’row-reverse’,’column-reverse’)
  • flexWrap enum(‘wrap’, ‘nowrap’)
  • justifyContent enum(‘flex-start’, ‘flex-end’, ‘center’, ‘space-between’, ‘space-around’)
  • alignItems enum(‘flex-start’, ‘flex-end’, ‘center’, ‘stretch’)

主軸和側(cè)軸(橫軸和豎軸)

在學(xué)習(xí)上述屬性之前猪贪,讓我們先了解一個(gè)概念:主軸和側(cè)軸
主軸和側(cè)軸
主軸和側(cè)軸

主軸即水平方向的軸線,可以理解成橫軸讯私,側(cè)軸垂直于主軸热押,可以理解為豎軸。

flexDirection

flexDirection enum('row', 'column','row-reverse','column-reverse')
flexDirection屬性定義了父視圖中的子元素沿橫軸或側(cè)軸方片的排列方式斤寇。

  • row: 從左向右依次排列
  • row-reverse: 從右向左依次排列
  • column(default): 默認(rèn)的排列方式桶癣,從上向下排列
  • column-reverse: 從下向上排列

Usage:

<View style={ {flexDirection:'row-reverse',backgroundColor:"darkgray",marginTop:20}}> 
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>1</Text> 
  </View> 
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>2</Text> 
  </View> 
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>3</Text> 
  </View> 
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>4</Text> 
  </View> 
</View>
flexDirection
flexDirection

flexWrap

flexWrap enum('wrap', 'nowrap')
flexWrap屬性定義了子元素在父視圖內(nèi)是否允許多行排列,默認(rèn)為nowrap娘锁。

  • nowrap flex的元素只排列在一行上牙寞,可能導(dǎo)致溢出。
  • wrap flex的元素在一行排列不下時(shí)莫秆,就進(jìn)行多行排列间雀。

Usage:

<View style={{flexWrap:'wrap',flexDirection:'row',backgroundColor:"darkgray",marginTop:20}}>
  ···
</View>
flexWrap
flexWrap

justifyContent

justifyContent enum('flex-start', 'flex-end', 'center', 'space-between', 'space-around')
justifyContent屬性定義了瀏覽器如何分配順著父容器主軸的彈性(flex)元素之間及其周圍的空間,默認(rèn)為flex-start镊屎。

  • flex-start(default) 從行首開始排列惹挟。每行第一個(gè)彈性元素與行首對(duì)齊,同時(shí)所有后續(xù)的彈性元素與前一個(gè)對(duì)齊缝驳。
  • flex-end 從行尾開始排列连锯。每行最后一個(gè)彈性元素與行尾對(duì)齊归苍,其他元素將與后一個(gè)對(duì)齊。
  • center 伸縮元素向每行中點(diǎn)排列运怖。每行第一個(gè)元素到行首的距離將與每行最后一個(gè)元素到行尾的距離相同霜医。
  • space-between 在每行上均勻分配彈性元素。相鄰元素間距離相同驳规。每行第一個(gè)元素與行首對(duì)齊,每行最后一個(gè)元素與行尾對(duì)齊署海。
  • space-around 在每行上均勻分配彈性元素吗购。相鄰元素間距離相同。每行第一個(gè)元素到行首的距離和每行最后一個(gè)元素到行尾的距離將會(huì)是相鄰元素之間距離的一半砸狞。

Usage:

<View style={ {justifyContent:'center',flexDirection:'row',backgroundColor:"darkgray",marginTop:20}}>
  ···
</View>
justifyContent
justifyContent

alignItems

alignItems enum('flex-start', 'flex-end', 'center', 'stretch')
alignItems屬性以與justify-content相同的方式在側(cè)軸方向上將當(dāng)前行上的彈性元素對(duì)齊捻勉,默認(rèn)為stretch。

  • flex-start 元素向側(cè)軸起點(diǎn)對(duì)齊刀森。
  • flex-end 元素向側(cè)軸終點(diǎn)對(duì)齊踱启。
  • center 元素在側(cè)軸居中。如果元素在側(cè)軸上的高度高于其容器研底,那么在兩個(gè)方向上溢出距離相同埠偿。
  • stretch 彈性元素被在側(cè)軸方向被拉伸到與容器相同的高度或?qū)挾取?/li>

Usage:

<View style={ {justifyContent:'center',flexDirection:'row',backgroundColor:"darkgray",marginTop:20}}>
  ···
</View>
alignItems
alignItems

子視圖屬性

  • alignSelf enum(‘a(chǎn)uto’, ‘flex-start’, ‘flex-end’, ‘center’, ‘stretch’)
  • flex number

alignSelf

alignSelf enum('auto', 'flex-start', 'flex-end', 'center', 'stretch')
alignSelf屬性以屬性定義了flex容器內(nèi)被選中項(xiàng)目的對(duì)齊方式。注意:alignSelf 屬性可重寫靈活容器的 alignItems 屬性榜晦。

  • auto(default) 元素繼承了它的父容器的 align-items 屬性冠蒋。如果沒有父容器則為 “stretch”。
  • stretch 元素被拉伸以適應(yīng)容器乾胶。
  • center 元素位于容器的中心抖剿。
  • flex-start 元素位于容器的開頭。
  • flex-end 元素位于容器的結(jié)尾识窿。

Usage:

<View style={ {alignSelf:'baseline',width:60,height: 20,backgroundColor:"darkcyan",margin:5}}> 
  <Text style={ {fontSize:16}}>1</Text>
</View>
...
alignItems
alignItems

flex

flex number
flex 屬性定義了一個(gè)可伸縮元素的能力斩郎,默認(rèn)為0。 >
Usage:

<View style={ {flexDirection:'row',height:40, backgroundColor:"darkgray",marginTop:20}}> 
  <View style={ {flex:1,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>flex:1</Text> 
  </View> 
  <View style={ {flex:2,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>flex:2</Text> 
  </View> 
  <View style={ {flex:3,backgroundColor:"darkcyan",margin:5}}> 
    <Text style={ {fontSize:16}}>flex:3</Text> 
  </View> 
</View>
flex
flex

其他布局 in React Native

以下屬性是React Native所支持的除Flex以外的其它布局屬性喻频。

視圖邊框

  • borderBottomWidth number 底部邊框?qū)挾?/li>
  • borderLeftWidth number 左邊框?qū)挾?/li>
  • borderRightWidth number 右邊框?qū)挾?/li>
  • borderTopWidth number 頂部邊框?qū)挾?/li>
  • borderWidth number 邊框?qū)挾?/li>
  • border<Bottom
    Left
    Right
    Top>Color 個(gè)方向邊框的顏色

borderColor 邊框顏色

尺寸

  • width number
  • height number

外邊距

  • margin number 外邊距
  • marginBottom number 下外邊距
  • marginHorizontal number 左右外邊距
  • marginLeft number 左外邊距
  • marginRight number 右外邊距
  • marginTop number 上外邊距
  • marginVertical number 上下外邊距

內(nèi)邊距

  • padding number 內(nèi)邊距
  • paddingBottom number 下內(nèi)邊距
  • paddingHorizontal number 左右內(nèi)邊距
  • paddingLeft number 做內(nèi)邊距
  • paddingRight number 右內(nèi)邊距
  • paddingTop number 上內(nèi)邊距
  • paddingVertical number 上下內(nèi)邊距

邊緣

  • left number 屬性規(guī)定元素的左邊緣缩宜。該屬性定義了定位元素左外邊距邊界與其包含塊左邊界之間的偏移。
  • right number 屬性規(guī)定元素的右邊緣半抱。該屬性定義了定位元素右外邊距邊界與其包含塊右邊界之間的偏移
  • top number 屬性規(guī)定元素的頂部邊緣脓恕。該屬性定義了一個(gè)定位元素的上外邊距邊界與其包含塊上邊界之間的偏移。
  • bottom number 屬性規(guī)定元素的底部邊緣窿侈。該屬性定義了一個(gè)定位元素的下外邊距邊界與其包含塊下邊界之間的偏移炼幔。

定位(position)

position enum(‘a(chǎn)bsolute’, ‘relative’)屬性設(shè)置元素的定位方式,為將要定位的元素定義定位規(guī)則史简。

  • absolute:生成絕對(duì)定位的元素乃秀,元素的位置通過 “l(fā)eft”, “top”, “right” 以及 “bottom” 屬性進(jìn)行規(guī)定肛著。
  • relative:生成相對(duì)定位的元素,相對(duì)于其正常位置進(jìn)行定位跺讯。因此枢贿,”left:20” 會(huì)向元素的 LEFT 位置添加 20 像素。

參考
A Complete Guide to Flexbox
Using CSS flexible boxes
Layout with Flexbox
Layout Props

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刀脏,一起剝皮案震驚了整個(gè)濱河市局荚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愈污,老刑警劉巖耀态,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異暂雹,居然都是意外死亡首装,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門杭跪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來仙逻,“玉大人,你說我怎么就攤上這事涧尿∠捣睿” “怎么了?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵姑廉,是天一觀的道長喜最。 經(jīng)常有香客問我,道長庄蹋,這世上最難降的妖魔是什么瞬内? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮限书,結(jié)果婚禮上虫蝶,老公的妹妹穿的比我還像新娘。我一直安慰自己倦西,他們只是感情好能真,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著扰柠,像睡著了一般粉铐。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卤档,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天蝙泼,我揣著相機(jī)與錄音,去河邊找鬼劝枣。 笑死汤踏,一個(gè)胖子當(dāng)著我的面吹牛织鲸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播溪胶,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼搂擦,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了哗脖?” 一聲冷哼從身側(cè)響起瀑踢,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎才避,沒想到半個(gè)月后丘损,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡工扎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了衔蹲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肢娘。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舆驶,靈堂內(nèi)的尸體忽然破棺而出橱健,到底是詐尸還是另有隱情,我是刑警寧澤沙廉,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布拘荡,位于F島的核電站,受9級(jí)特大地震影響撬陵,放射性物質(zhì)發(fā)生泄漏珊皿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一巨税、第九天 我趴在偏房一處隱蔽的房頂上張望蟋定。 院中可真熱鬧,春花似錦草添、人聲如沸驶兜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抄淑。三九已至,卻和暖如春驰后,著一層夾襖步出監(jiān)牢的瞬間肆资,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工灶芝, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留迅耘,地道東北人贱枣。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像颤专,于是被迫代替她去往敵國和親纽哥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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