基礎(chǔ)篇章:React Native之Flexbox的講解(Height and Width)

今天在講解Flexbox之前,我們先講解一下高度和寬度的問(wèn)題。因?yàn)镠eight and Width的問(wèn)題很簡(jiǎn)單儡毕,就不單獨(dú)寫(xiě)一篇文章了交排。順帶說(shuō)一下即可划滋。

Height and Width

一個(gè)組件的高度和寬度,決定了它在屏幕上顯示的大小埃篓。

固定尺寸

最簡(jiǎn)單的設(shè)置組件的尺寸的方法就是通過(guò)添加一個(gè)固定的寬度和高度处坪。所有尺寸大小在React Native沒(méi)有單位的,代表著獨(dú)立的像素密度。

官網(wǎng)例子

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

class FixedDimensionsBasics extends Component {
  render() {
    return (
      <View>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 100, height: 100, backgroundColor: 'skyblue'}} />
        <View style={{width: 150, height: 150, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

AppRegistry.registerComponent('AwesomeProject', () => FixedDimensionsBasics);

效果圖:


這樣設(shè)置尺寸大小的方式,比較適合于要求不同的屏幕上顯示相同大小的View或者組件同窘。寫(xiě)固定的尺寸大小玄帕,死值。

彈性寬高

我們可以在組件樣式中使用flex讓組件根據(jù)可用空間動(dòng)態(tài)的收縮和擴(kuò)展想邦。通常情況下我們可以使用flex: 1裤纹,告訴某個(gè)組件來(lái)填充剩余的所有的空間,如果是多個(gè)組件的話丧没,則是所有的這些組件去平分父容器中的剩余的所有空間鹰椒。。如果這些并列的子組件的flex值不一樣骂铁,則誰(shuí)的值更大吹零,誰(shuí)占據(jù)剩余空間的比例就更大(跟我們android中weight的用法差不多)。

官網(wǎng)例子

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

class FlexDimensionsBasics extends Component {
  render() {
    return (
      // Try removing the `flex: 1` on the parent View.
      // The parent will not have dimensions, so the children can't expand.
      // What if you add `height: 300` instead of `flex: 1`?
      <View style={{flex: 1}}>
        <View style={{flex: 1, backgroundColor: 'powderblue'}} />
        <View style={{flex: 2, backgroundColor: 'skyblue'}} />
        <View style={{flex: 3, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

AppRegistry.registerComponent('AwesomeProject', () => FlexDimensionsBasics);

效果圖:


關(guān)于高度和寬度就講這些吧拉庵,其實(shí)內(nèi)容都是翻譯與官網(wǎng)的docs灿椅,地址:
https://facebook.github.io/react-native/docs/height-and-width.html#height-and-width

Flexbox

一個(gè)組件可以使用Flexbox指定其子組件或元素之間的布局。Flexbox旨在為不同的屏幕上提供一致的布局钞支。

通常情況下茫蛹,我們結(jié)合使用flexDirection、alignItems和 justifyContent三個(gè)樣式屬性就已經(jīng)能夠?qū)崿F(xiàn)我們所需的布局烁挟。

注意:Flexbox在React Native的工作原理和使用方式與css在web上的方式基本一樣婴洼,當(dāng)然也有一些例外:比如flexDirection的默認(rèn)值是column而不是row,alignItems的默認(rèn)值是stretch而不是flex-start撼嗓,以及flex只能指定一個(gè)數(shù)字值柬采。

Flex Direction

向一個(gè)組件的樣式中添加Flex Direction可以決定一個(gè)布局的主軸。子元素應(yīng)該沿著水平方向(row)排列且警,還是沿著豎直方向(column)排列呢粉捻?默認(rèn)值是豎直(column)方向。

官網(wǎng)例子

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

class FlexDirectionBasics extends Component {
  render() {
    return (
      // Try setting `flexDirection` to `column`.
      <View style={{flex: 1, flexDirection: 'row'}}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

AppRegistry.registerComponent('AwesomeProject', () => FlexDirectionBasics);

效果圖:


Justify Content

向組件的樣式中添加Justify Content可以決定其子元素沿著主軸的排列方式斑芜。子元素應(yīng)該分布在主軸的開(kāi)始端肩刃,還是中間,最后杏头,還是均勻分布盈包?可用的選項(xiàng)有:flex-start、center醇王、flex-end呢燥、space-around以及space-between。

  • flex-start:彈性盒子元素將與行起始位置對(duì)齊寓娩。該行的第一個(gè)子元素的主起始位置的邊界將與該行的主起始位置的邊界對(duì)齊疮茄,同時(shí)所有后續(xù)的伸縮盒項(xiàng)目與其前一個(gè)項(xiàng)目對(duì)齊滥朱。
  • flex-end:彈性盒子元素將與行結(jié)束位置對(duì)齊。該行的第一個(gè)子元素的主結(jié)束位置的邊界將與該行的主結(jié)束位置的邊界對(duì)齊力试,同時(shí)所有后續(xù)的伸縮盒項(xiàng)目與其前一個(gè)項(xiàng)目對(duì)齊。
  • center:彈性盒子元素將與行中間位置對(duì)齊排嫌。該行的子元素將相互對(duì)齊并在行中居中對(duì)齊畸裳,同時(shí)第一個(gè)元素與行的主起始位置的邊距等同與最后一個(gè)元素與行的主結(jié)束位置的邊距(如果剩余空間是負(fù)數(shù),則保持兩端相等長(zhǎng)度的溢出)淳地。
  • space-between:彈性盒子元素會(huì)均勻分布在行里怖糊。如果最左邊的剩余空間是負(fù)數(shù),或該行只有一個(gè)子元素颇象,則該值等效于'flex-start'伍伤。在其它情況下,第一個(gè)元素的邊界與行的主起始位置的邊界對(duì)齊遣钳,同時(shí)最后一個(gè)元素的邊界與行的主結(jié)束位置的邊距對(duì)齊扰魂,而剩余的伸縮盒項(xiàng)目則平均分布,并確保兩兩之間的空白空間相等蕴茴。
  • space-around:彈性盒子元素會(huì)均勻分布在行里劝评,兩端保留子元素與子元素之間間距大小的一半。如果最左邊的剩余空間是負(fù)數(shù)倦淀,或該行只有一個(gè)伸縮盒項(xiàng)目蒋畜,則該值等效于'center'。在其它情況下撞叽,伸縮盒項(xiàng)目則平均分布姻成,并確保兩兩之間的空白空間相等,同時(shí)第一個(gè)元素前的空間以及最后一個(gè)元素后的空間為其他空白空間的一半愿棋。

官網(wǎng)例子

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

class JustifyContentBasics extends Component {
  render() {
    return (
      // Try setting `justifyContent` to `center`.
      // Try setting `flexDirection` to `row`.
      <View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'space-between',
      }}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

AppRegistry.registerComponent('AwesomeProject', () => JustifyContentBasics);

效果圖:


Align Items

向組件的樣式(style)中添加alignItems可以決定其子元素沿著次軸(就是與主軸垂直的軸科展,比如若主軸方向?yàn)閞ow,則次軸方向?yàn)閏olumn)的排列方式初斑。子元素是應(yīng)該靠近次軸的開(kāi)始端還是中間辛润,還是末端,亦或是拉伸來(lái)填補(bǔ)呢见秤?可用選項(xiàng)有:flex-start砂竖、center、flex-end以及stretch鹃答。

  • flex-start:彈性盒子元素的次軸起始位置的邊界緊靠該行的次軸起始邊界乎澄。
  • flex-end:彈性盒子元素的次軸起始位置的邊界緊靠住該行的次軸結(jié)束邊界。
  • center:彈性盒子元素在該行的次軸)上居中放置测摔。(如果該行的尺寸小于彈性盒子元素的尺寸置济,則會(huì)向兩個(gè)方向溢出相同的長(zhǎng)度)解恰。
  • stretch:如果指定次軸大小的屬性值為'auto',則其值會(huì)使項(xiàng)目的邊距盒的尺寸盡可能接近所在行的尺寸浙于,但同時(shí)會(huì)遵照'min/max-width/height'屬性的限制护盈。

注意:要使stretch選項(xiàng)生效的話,子元素在次軸方向上不能有固定的尺寸羞酗。在下面的例子中:只有將子元素樣式中的width: 50去掉之后腐宋,alignItems: 'stretch'才能生效。

官網(wǎng)例子

import React, { Component } from 'react';
import { AppRegistry, View } from 'react-native';

class AlignItemsBasics extends Component {
  render() {
    return (
      // Try setting `alignItems` to 'flex-start'
      // Try setting `justifyContent` to `flex-end`.
      // Try setting `flexDirection` to `row`.
      <View style={{
        flex: 1,
        flexDirection: 'column',
        justifyContent: 'center',
        alignItems: 'center',
      }}>
        <View style={{width: 50, height: 50, backgroundColor: 'powderblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'skyblue'}} />
        <View style={{width: 50, height: 50, backgroundColor: 'steelblue'}} />
      </View>
    );
  }
};

AppRegistry.registerComponent('AwesomeProject', () => AlignItemsBasics);

效果圖:


文章翻譯并參考于Flexbox官方文檔檀轨,地址:
https://facebook.github.io/react-native/docs/flexbox.html

好了胸竞,到這里關(guān)于Flexbox的講解就講到這里了,關(guān)于Flexbox運(yùn)用参萄,上面的例子只是冰山一角卫枝,要想真正熟練掌握,還得靠自己親自動(dòng)手去寫(xiě)讹挎,去實(shí)踐校赤,才能夠真正來(lái)理解各個(gè)屬性的意思。趕緊動(dòng)手去實(shí)踐吧淤袜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痒谴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铡羡,更是在濱河造成了極大的恐慌积蔚,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烦周,死亡現(xiàn)場(chǎng)離奇詭異尽爆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)读慎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)漱贱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人夭委,你說(shuō)我怎么就攤上這事幅狮。” “怎么了株灸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵崇摄,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我慌烧,道長(zhǎng)逐抑,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任屹蚊,我火速辦了婚禮厕氨,結(jié)果婚禮上进每,老公的妹妹穿的比我還像新娘。我一直安慰自己命斧,他們只是感情好田晚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著国葬,像睡著了一般肉瓦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胃惜,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音哪雕,去河邊找鬼船殉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛斯嚎,可吹牛的內(nèi)容都是我干的利虫。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼堡僻,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼糠惫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起钉疫,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤硼讽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后牲阁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體固阁,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年城菊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了备燃。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凌唬,死狀恐怖并齐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情客税,我是刑警寧澤况褪,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站霎挟,受9級(jí)特大地震影響窝剖,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜酥夭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一赐纱、第九天 我趴在偏房一處隱蔽的房頂上張望脊奋。 院中可真熱鬧,春花似錦疙描、人聲如沸诚隙。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)久又。三九已至,卻和暖如春效五,著一層夾襖步出監(jiān)牢的瞬間地消,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工畏妖, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脉执,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓戒劫,卻偏偏與公主長(zhǎng)得像半夷,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迅细,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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