5分鐘吃透React Native Flexbox

今天我們來聊聊Flexbox,它是前端的一個(gè)布局方式边翼。在React Native中是主流布局方式鱼响。如果你剛剛?cè)腴TReact Native,或者沒有多少前端的技術(shù)經(jīng)驗(yàn)讯私,亦或者對其半知半解热押,那么這篇文章將很好的幫助你參透Flexbox的整個(gè)全貌西傀。

purpose

通過這篇文章你將快速吃透整個(gè)Flexbox,因?yàn)閷τ贔lexbox你只需掌握以下幾點(diǎn)屬性即可桶癣。

  • flex
  • flexDirection
  • justifyContent
  • alignItems
  • flexWrap
  • alignSelf

flex

Flexbox使用的是彈性布局拥褂,它有個(gè)屬性flex用來控制它的彈性。有點(diǎn)類似與Android布局中的weight屬性牙寞。當(dāng)然與前端的css中的flex也有所不同饺鹃,它支持的類型是number不是string。它有三種狀態(tài):正數(shù)间雀、零與負(fù)數(shù)悔详。直接看代碼:

import React, {Component} from 'react';
import {StyleSheet, Text, View} from 'react-native';
 
export default class App extends Component<Props> {
  render() {
    return (
      <View style={styles.container}>
          <View style={styles.red}/>
          <View style={styles.blue}/>
          <View style={styles.orange}/>
      </View>
    );
  }
}
   
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  red: {
      flex: 1,
      width: 100,
      backgroundColor: 'red'
  },
  blue: {
      flex: 2,
      width: 100,
      backgroundColor: 'blue'
  },
  orange: {
      width: 100,
      height: 100,
      backgroundColor: 'orange'
  }
});

父容器使用flex:1來撐滿整個(gè)屏幕,orange是固定的一個(gè)view惹挟,而red與blue使用flex茄螃,通過flex的值進(jìn)行等比(1:2)分?jǐn)偸S嗟目臻g。來看下運(yùn)行效果连锯。

這是為正數(shù)的情況归苍,如果flex:0,控件的大小就會(huì)根據(jù)設(shè)置的width與height來固定顯示运怖。

如果flex:-1拼弃,如果空間足夠,控件的大小也會(huì)根據(jù)width與height來展示摇展;如果空間不足吻氧,會(huì)根據(jù)minWidth與minHeight來展示。

一般都不會(huì)使用flex:-1咏连,而且經(jīng)過測試盯孙,空間不足時(shí)minWidth與minHeight并不會(huì)生效。如果發(fā)現(xiàn)生效的方式請務(wù)必告知捻勉。

flexDirection

在Flexbox中有主軸與副軸之分镀梭,主軸控制child的排列方向,默認(rèn)為column踱启”ㄕ耍可以通過flexDirection屬性改變主軸方向。它有四個(gè)可選值分別為

  • row: child水平方向排列
  • column: child豎直方向排列(默認(rèn))
  • row-reverse: child水平方向反向排列
  • column-reverse: child豎直方向反向排列

在上面的demo基礎(chǔ)上改變style樣式:

const styles = StyleSheet.create({
  container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'center',
    alignItems: 'center',
    backgroundColor: '#F5FCFF',
  },
  red: {
      height: 100,
      width: 100,
      backgroundColor: 'red'
  },
  blue: {
      width: 100,
      height: 100,
      backgroundColor: 'blue'
  },
  orange: {
      width: 100,
      height: 100,
      backgroundColor: 'orange'
  }
});

分別改變container中flexDirection的值:row埠偿、row-reverse透罢、column、column-reverse

justifyContent

固定好主軸之后冠蒋,可以通過justifyContent來指定主軸方向child的排列方式羽圃,它有六個(gè)可選值

  • flex-start: child對齊主軸的起點(diǎn)(默認(rèn))
  • flex-end: child對齊主軸的終點(diǎn)
  • center: child居中對齊主軸
  • space-between: child在主軸方向相鄰child等間距對齊,首尾child與父容器對齊
  • space-around: child在主軸方向相鄰child等間距對齊抖剿,首尾child與父容器的間距相等且為相鄰child間距的一半
  • space-evenly: child在主軸方向均勻分布朽寞。相鄰間距與首尾間距相等
  container: {
    flex: 1,
    flexDirection: 'row',
    justifyContent: 'flex-start',
    backgroundColor: '#F5FCFF',
  }

依次改變container中的justifyContent:flex-start识窿、flex-end、center脑融、space-between喻频、space-around與space-evenly



alignItems

主軸固定之后,剩下的就是副軸肘迎,alignItems可以用來控制副軸上的child排列方式甥温。它有五個(gè)可選項(xiàng)分別為

  • flex-start: child對齊副軸起點(diǎn)(默認(rèn))
  • flex-end: child對齊副軸終點(diǎn)
  • center: child居中對齊副軸
  • stretch: child為彈性布局時(shí)(未設(shè)置副軸方向的大小或者為auto),拉伸對齊副軸
  • baseline: 有文本存在時(shí)妓布,child在副軸方向基于第一個(gè)文本基線對齊

改變container的style姻蚓,主軸設(shè)置為row,依次改變alignItems:flex-start匣沼、flex-end狰挡、center

  container: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'flex-start',
    backgroundColor: '#F5FCFF',
  }

最后將alignItems設(shè)置為stretch,并且改變r(jià)ed的height释涛,red會(huì)被拉伸

  container: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'stretch',
    backgroundColor: '#F5FCFF',
  },
  red: {
      width: 100,
      height: 'auto',
      backgroundColor: 'red'
  }

alignItems: baseline圆兵,并不是文本的正中心,而是文本View的容器底部枢贿。在上面基礎(chǔ)上添加一個(gè)Text,讓文本自身居中展示刀脏。

  container: {
    flex: 1,
    flexDirection: 'row',
    alignItems: 'baseline',
    backgroundColor: '#F5FCFF',
  },
  text: {
      width: 80,
      height: 80,
      fontSize: 20,
      color: 'white',
      marginTop: 110,
      backgroundColor: 'black',
      textAlign: 'center',
      textAlignVertical: 'center'
  }

flexWrap

如果再增加一個(gè)View局荚,由于空間不足它會(huì)展示不全。這時(shí)可以使用flexWrap屬性愈污,它可以支持自動(dòng)換行展示耀态。

  • nowrap: 不換行(默認(rèn))
  • wrap: 自動(dòng)換行

在container中添加flexWrap屬性,并且再添加一個(gè)green view

  container: {
    flex: 1,
    flexDirection: 'row',
    flexWrap: 'wrap',
    justifyContent: 'flex-start',
    backgroundColor: '#F5FCFF',
  },
  green: {
      width: 100,
      height: 100,
      backgroundColor: 'green'
  }

alignSelf

alignSelf屬性類似于alignItems暂雹,它也是控制副軸上的排列規(guī)則首装,不同的是它使用的對象是child自己。它可以改變父容器alignItems的屬性控制的child排列規(guī)則杭跪,在副軸上實(shí)現(xiàn)自己的排列規(guī)則仙逻。默認(rèn)值為auto,繼承父容器的alignItems屬性涧尿。因此它也有五個(gè)可選值:flex-start系奉、flex-end、center姑廉、stretch與baseline缺亮。例如我們?yōu)閞ange添加alignSelf,其它的child不變桥言,都繼承父容器的alignItems: flex-start

  orange: {
      width: 100,
      height: 100,
      backgroundColor: 'orange',
      alignSelf: 'flex-end'
  }

其它的可選值就不一一說明萌踱,可以參考alignItems

other

最后還有三個(gè)比較冷門屬性葵礼,這里就不詳細(xì)一一代碼與貼圖,簡單的說下它們的作用并鸵,相同點(diǎn)是它們都是在child中使用鸳粉,與alignSelf的作用域一樣。

  • flexBasis: 設(shè)置主軸方向上的初始值能真,默認(rèn)為auto赁严。如果與width或者h(yuǎn)eight同時(shí)存在,則會(huì)覆蓋它們的值
  • flexGrow: 設(shè)置chid的放大比例粉铐,類似于flex疼约,空間充足時(shí)自動(dòng)按比例放大,默認(rèn)為0
  • flexShrink: 設(shè)置chid的縮小比例蝙泼〕贪空間不足時(shí)自動(dòng)按比例縮小,默認(rèn)為0

有關(guān)Flexbox汤踏,縱觀全文只需掌握開頭所列的六種屬性织鲸,React Native中的絕大多數(shù)布局也就不成問題。現(xiàn)在對于Flexbox是否清晰了許多呢溪胶?趕緊親自去試試吧~

精選文章

ViewDragHelper之手勢操作神器
自定義Android注解Part1:注解變量
Android Architecture Components Part2:LiveData
ConstraintLayout使用匯總

感覺不錯(cuò)的可以來一波關(guān)注搂擦,掃描下方二維碼,關(guān)注公眾號(hào)哗脖,及時(shí)獲取最新知識(shí)技巧瀑踢。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市才避,隨后出現(xiàn)的幾起案子橱夭,更是在濱河造成了極大的恐慌,老刑警劉巖桑逝,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棘劣,死亡現(xiàn)場離奇詭異,居然都是意外死亡楞遏,警方通過查閱死者的電腦和手機(jī)茬暇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來橱健,“玉大人而钞,你說我怎么就攤上這事【械矗” “怎么了臼节?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我网缝,道長巨税,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任粉臊,我火速辦了婚禮草添,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扼仲。我一直安慰自己远寸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布屠凶。 她就那樣靜靜地躺著驰后,像睡著了一般。 火紅的嫁衣襯著肌膚如雪矗愧。 梳的紋絲不亂的頭發(fā)上灶芝,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機(jī)與錄音唉韭,去河邊找鬼夜涕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛属愤,可吹牛的內(nèi)容都是我干的女器。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼住诸,長吁一口氣:“原來是場噩夢啊……” “哼晓避!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起只壳,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎暑塑,沒想到半個(gè)月后吼句,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡事格,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年惕艳,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驹愚。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡远搪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出逢捺,到底是詐尸還是另有隱情谁鳍,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站倘潜,受9級(jí)特大地震影響绷柒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜涮因,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一废睦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧养泡,春花似錦嗜湃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至输硝,卻和暖如春今瀑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背点把。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工橘荠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人郎逃。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓哥童,卻偏偏與公主長得像,于是被迫代替她去往敵國和親褒翰。 傳聞我的和親對象是個(gè)殘疾皇子贮懈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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