亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS React Native FlexBox詳解及實例

2020-07-26 03:06:44
字體:
來源:轉載
供稿:網友

IOS React Native FlexBox詳解及資料整理,

# 前言

學習本系列內容需要具備一定 HTML 開發基礎,沒有基礎的朋友可以先轉至 HTML 學習

本人接觸 React Native 時間并不是特別長,所以對其中的內容和性質了解可能會有所偏差,在學習中如果有錯會及時修改內容,也歡迎萬能的朋友們批評指出,謝謝

文章第一版出自簡書,如果出現圖片或頁面顯示問題,煩請轉至 簡書 查看 也希望喜歡的朋友可以點贊,謝謝

什么是 FlexBox 布局

在 html 中,界面的搭建都是采用 CSS 的布局方式,CSS 是基于盒子模型,依賴于 display、position、float屬性,這對于一些比如 垂直居中 的特殊布局來說非常不方便

Flex 是一種全新的針對 Web 和移動開發的布局方式,它可以簡便、完整、響應式地實現各種頁面布局,并且目前的所有瀏覽器已經支持這種布局方式,所以不用考慮兼容性方面的問題

FlexBox 從字面上可以理解成:能夠很容易變化以適應外界條件變化的通用矩形容器,也就是我們常聽到的 彈性布局,它的宗旨就是 通過彈性的方式來第七和分布容器中內容的空間,使其能使用不同屏幕,為盒裝模型提供最大的靈活性(這類似于 iOS 開發中的AtuoLayout布局方式)

FlexBox 布局主要思想是:讓容器有能力讓其子項目改變寬度、高度甚至是順序,從而達到最佳填充可用空間的方式

React Native 中的 FlexBox 是這個規范的一個子集

綜上所述,FlexBox 就是用來解決 父盒子 和 子盒子 之間的約束關系,如下圖

父盒子和子盒子之間的約束關系

FlexBox 在開發中能夠解決下面等問題

  1. 浮動布局
  2. 水平和垂直居中
  3. 自動分配寬度
  4. 各種機型屏幕適配
  5. 動態分配子集的尺寸、位置等等

如下圖所示,在 CSS 中,常規的布局是基于塊和內聯流方向,而 Flex布局是基于 Flexflow流【容器默認存在兩根軸:水平的主軸(main axis)垂直的交叉軸(cross axis),主軸的開始位置(與邊框的交叉點)叫做 main start,結束的位置叫 main end;交叉軸的開始位置叫做 cross start,結束位置叫做 cross end。項目默認沿著主軸排列,單個項目占據的主軸空間叫做 main size,占據的交叉軸空間叫做 cross size】

FlexBox主軸與側軸的關系

根據伸縮項目排列方式的不同,主軸和側軸方向也會變化,如下圖所示

主軸從左向右排列

主軸從上向下排列

獲取主屏幕尺寸

為了后面更好的展示案例,我們先來看看如何獲取主屏幕的尺寸和分辨率

首先,我們需要先導入 Dimensions
// 導入類庫 var Dimensions = require('Dimensions');

接下來就可以在需要的地方使用 Dimensions 變量獲取屏幕的高度、寬度、分辨率等等數據

 export default class TestRN extends Component {    render() {      return (      <View style={styles.container}>        <Text>當前屏幕的寬度:{Dimensions.get('window').width}</Text>        <Text>當前屏幕的高度:{Dimensions.get('window').height}</Text>      </View>      );    }  }

設置樣式 // 樣式 const styles = StyleSheet.create({ container: { backgroundColor:'blue' }, });

效果:獲取屏幕尺寸

既然能拿到屏幕的尺寸,那么就能夠直接將主 View 的大小設置成屏幕的尺寸,使 View 填充整個屏幕

// 樣式  const styles = StyleSheet.create({    container: {      backgroundColor:'blue',      height:Dimensions.get('window').height,      width:Dimensions.get('window').width    },  });

效果:
使View尺寸等于屏幕尺寸

FlexBox 常用容器屬性

為了方便理解,我們先添加幾個視圖

// 導入類庫  var Dimensions = require('Dimensions');  // 入口  export default class TestRN extends Component {    render() {      return (      <View style={styles.container}>        <View style={styles.subViewStyle1}></View>        <View style={styles.subViewStyle2}></View>        <View style={styles.subViewStyle3}></View>      </View>    );  }}  // 樣式  const styles = StyleSheet.create({    container: {      backgroundColor:'blue',      height:Dimensions.get('window').height,      width:Dimensions.get('window').width    },    subViewStyle1: {      backgroundColor:'red',      height:60,      width:60,    },    subViewStyle2: {      backgroundColor:'yellow',      height:60,      width:60,    },    subViewStyle3: {      backgroundColor:'green',      height:60,      width:60,    },  });

效果:
默認樣式

flexDirection(該屬性決定了項目排列的方向,也就是主軸的方向)row:主軸為水平方向,起點在左端

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'row'  },

效果:
主軸向水平方向延伸

row-reverse:主軸為水平方向,起點在右端

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'row-reverse'  },

效果:
水平方向,起點在右

column(默認):主軸為垂直方向,起點在上

container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'column'  },

效果:
主軸垂直,起點在上邊

column-reverse:主軸為垂直方向,起點在下

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'column-reverse'  },

效果:
主軸垂直,起點在下邊

justifyContent(定義伸縮項目在主軸線的對齊方式)flex-start(默認):伸縮項目向一行的起始位置靠齊

  container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置子項目在主軸上的對齊方式    justifyContent:'flex-start'  },

效果:
伸縮項目向一行的起始位置靠齊

flex-end:伸縮項目向一行的結束位置靠齊

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置子項目在主軸上的對齊方式    justifyContent:'flex-end'  },

效果:
伸縮項目向一行的結束位置靠齊

center:伸縮項目向一行的中間位置靠齊

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置子項目在主軸上的對齊方式    justifyContent:'center'  },

效果:
伸縮項目向一行的中間位置靠齊

space-between:兩端對齊,項目之間的間隔都相等

  container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置子項目在主軸上的對齊方式    justifyContent:'space-between'  },

效果:
兩端對齊,項目之間的間隔都相等

space-around:伸縮項目會平均分布在行內,兩端保留一半的空間

  container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置子項目在主軸上的對齊方式    justifyContent:'space-around'  },

效果:
伸縮項目會平均分布在行內,兩端保留一半的空間

alignItems(定義項目在交叉軸上如何對齊,可以把它看成側軸(垂直于主軸)的對齊方式)flex-start(默認):側軸軸的起點對齊

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置項目在側軸上如何對齊    alignItems:'flex-start'  },

效果:
側軸軸的起點對齊

flex-end:

  container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置項目在側軸上如何對齊    alignItems:'flex-end'  },

效果:
側軸的終點對齊

center:側軸的中點對齊

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置項目在側軸上如何對齊    alignItems:'center'  },

效果:
側軸的中點對齊

stretch(默認):如果項目沒有設置高度或設置為 auto,將占滿整個容器高度

 container: {    backgroundColor:'blue',    注釋掉高度    // height:Dimensions.get('window').height,    // width:Dimensions.get('window').width,    // 設置項目在側軸上如何對齊    alignItems:'stretch'  },


效果:
如果項目沒有設置高度或設置為 auto,將占滿整個容器高度

flexWrap(默認情況下,項目都排在一條軸線上,flex-wrap屬性定義如果一條軸線排不下,如何換行)nowrap(默認):不換行

 container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'row',    // 設置換行的方式    flexWrap:'nowrap'  },

效果:
不換行

wrap:換行,第一行在上方

container: {    backgroundColor:'blue',    height:Dimensions.get('window').height,    width:Dimensions.get('window').width,    // 設置主軸方向    flexDirection:'row',    // 設置換行的方式    flexWrap:'wrap'  },

效果:
換行,第一行在上方

FlexBox 常用元素屬性flex(flex-grow、flex-shrink、flex-basis三個屬性的縮寫,第二個參數和第三個參數是可選參數):默認值為 "0 1 auto"

寬度 = 彈性寬度 * (flexGrow / sum(flexGorw))(重要)

先來做一下實驗,看看flex到底是干嘛的,首先,我們先初始化一個新視圖,便于理解

 // 入口  export default class TestRN extends Component {    render() {      return (      <View style={styles.container}>        <View style={{backgroundColor:'red', height:60, width:60}}></View>        <View style={{backgroundColor:'green', height:60, width:60}}></View>        <View style={{backgroundColor:'yellow', height:60, width:60}}></View>      </View>      );    }  }  // 樣式  const styles = StyleSheet.create({    container: {      backgroundColor:'blue',      flex:1,      // 設置主軸方向為水平,起點在左      flexDirection:'row'    },  });

效果:
初始化視圖

現在我們給紅色項目設置 flex 為1,可以看到紅色項目的寬度填充了除去 綠色項目和黃色項目 的部分
<View style={{backgroundColor:'red', height:60, width:60, flex:1}}></View>

效果:
示例一

接著再給綠色項目也設置 flex 為1,可以看到紅色項目和綠色項目填充了 除黃色項目 的部分,并且紅色和綠色項目各占剩下空間的一半
<View style={{backgroundColor:'red', height:60, width:60, flex:1}}></View>

<View style={{backgroundColor:'green', height:60, width:60, flex:1}}></View>

效果:
示例二

現在我們再設置黃色項目的 flex 為2,可以看出,紅色和綠色所占的空間和等同于黃色項目,并且紅色和綠色平分了除黃色項目以外的空間,現在我們應該能理解上面公式的意思了吧(項目寬度 = 父項目的寬度 * (子項目自身比例 / 所有父項目內子項目的比例))


<View style={{backgroundColor:'red', height:60, width:60, flex:1}}></View>

<View style={{backgroundColor:'green', height:60, width:60, flex:1}}></View>

<View style={{backgroundColor:'yellow', height:60, width:60, flex:3}}></View>

效果:
示例三

但是不知道各位發現了沒有,雖然我們每個子項目都同時設置了高度和寬度,但是卻只有寬度改變,而高度則一直保持我們設置的狀態,是不是 flex屬性 只對寬度有效呢?接下來我們來修改下代碼,看看是不是真的如我們想象的這樣 ―――― 這里我們將綠色的高度去掉,可以看出,綠色項目的高度填充了整個父項目的高度


<View style={{backgroundColor:'red', height:60, width:60, flex:1}}></View>

<View style={{backgroundColor:'green', width:60, flex:1}}></View>

<View style={{backgroundColor:'yellow', height:60, width:60, flex:3}}></View>

效果:
示例四

總結以上的示例,可以看出,不管是否設置子項目的寬度,flex都會忽略寬度,按照上面的公式進行縮放,

如果我們設置了高度,那么 flex 會遵循我們所設置的高度,不去進行拉伸,反之將會對高度進行拉伸

根據 flex 的特性,如果沒有設置 View 的尺寸情況下,使用 flex 也可以讓 View 占滿整個屏幕

container: { backgroundColor:'blue', flex:1 },

alignSelf(允許單個項目有與其它項目不一樣的對齊方式,可覆蓋 align-items屬性)auto(默認):繼承父元素的alignItems屬性,如果沒有則切換為stretch
subViewStyle2: { backgroundColor:'yellow', height:60, width:60, alignSelf:'auto' },

效果:
繼承父元素的alignItems屬性,如果沒有則切換為stretch

flex-start:項目從側軸的起點開始
subViewStyle2: { backgroundColor:'yellow', height:60, width:60, alignSelf:'flex-start' },

效果:
項目從側軸的起點開始

flex-end:項目從側軸的終點開始
subViewStyle2: { backgroundColor:'yellow', height:60, width:60, alignSelf:'flex-end' },

效果:
項目從側軸的終點開始

center:項目以側軸的中心為參照
subViewStyle2: { backgroundColor:'yellow', height:60, width:60, alignSelf:'center' },

效果:
項目以側軸的中心為參照

stretch
subViewStyle2: { backgroundColor:'yellow', height:60, width:60, alignSelf:'stretch' },

效果:
Snip20161027_22.png

我們 FlexBox 的使用就先簡單介紹到這里,在后續的文章中,會在實際的開發場景中帶大家更多更細致地講解 FlexBox,如果你覺得哪里寫得不好或者有誤,麻煩留言或者用郵箱的方式聯系我,當然遇到問題也可以,最后如果喜歡我的文章,還請點個贊并關注,讀者的肯定是對我們筆者最大的鼓勵,謝謝!

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91精品国产91久久久久久久久| 国产精品99久久久久久久久久久久| 97超碰蝌蚪网人人做人人爽| 性欧美办公室18xxxxhd| 成人午夜一级二级三级| 欧美日本啪啪无遮挡网站| 热久久美女精品天天吊色| 久操成人在线视频| 国产精品稀缺呦系列在线| 97成人超碰免| 国内精品美女av在线播放| 欧美另类极品videosbest最新版本| 日韩久久精品成人| 亚洲国语精品自产拍在线观看| 97视频网站入口| 黑人巨大精品欧美一区二区一视频| 国产在线观看不卡| 中文字幕国产日韩| 国产午夜精品一区理论片飘花| 国产在线视频2019最新视频| 亚洲欧美在线免费| 亚洲精品短视频| 国产精品福利无圣光在线一区| 国产精品精品一区二区三区午夜版| 一区二区三区www| 亚洲第一综合天堂另类专| 国产欧美日韩中文字幕| 亚洲国产美女精品久久久久∴| 国产精品99久久久久久白浆小说| 欧美亚洲视频在线看网址| 亚洲国产毛片完整版| 538国产精品一区二区在线| 欧美日韩一区二区在线| 中文字幕视频一区二区在线有码| 欧美主播福利视频| 国产精品一区久久| 亚洲精品日韩欧美| 成人淫片在线看| 国产三级精品网站| 亚洲v日韩v综合v精品v| 欧美精品第一页在线播放| 菠萝蜜影院一区二区免费| 国产精品久久久久久久久久新婚| 久久精品人人做人人爽| 日韩精品在线播放| 日韩在线中文字| 亚洲r级在线观看| 9.1国产丝袜在线观看| 亚洲综合日韩中文字幕v在线| 日韩精品久久久久久福利| 欧美综合一区第一页| 97色在线观看| 久久久亚洲欧洲日产国码aⅴ| 国产精品91久久| 日韩成人黄色av| 一区三区二区视频| 在线视频欧美日韩精品| 欧美极品少妇xxxxx| 国产成人自拍视频在线观看| 91视频8mav| 97国产精品视频| 日韩中文字幕欧美| 性金发美女69hd大尺寸| 国产精品成人一区二区| 久久国产精品99国产精| 国语自产偷拍精品视频偷| 日韩免费观看在线观看| 性欧美办公室18xxxxhd| 久久精品国产电影| 精品丝袜一区二区三区| 欧美亚洲日本网站| 欧美性猛交xxxx乱大交| 亚洲视频一区二区三区| 麻豆精品精华液| 一区二区在线视频播放| 日韩欧美一区视频| 18性欧美xxxⅹ性满足| 91精品国产91| 精品少妇v888av| 亚洲黄一区二区| 日韩中文字幕网| 亚洲品质视频自拍网| 亚洲国产毛片完整版| 欧美一级成年大片在线观看| 成人免费视频97| 亚洲第一网中文字幕| 欧美日韩免费一区| 国产91精品最新在线播放| 中日韩美女免费视频网站在线观看| www欧美日韩| 欧美日产国产成人免费图片| 欧美成人免费全部| 91国语精品自产拍在线观看性色| 亚洲风情亚aⅴ在线发布| 久久久久久综合网天天| 8090成年在线看片午夜| 亚洲精选中文字幕| 国产色视频一区| 国产精品99久久久久久久久久久久| 欧美日韩亚洲一区二区三区| 91久久精品国产| 欧美在线不卡区| 欧美激情精品久久久久久黑人| 久久综合久久美利坚合众国| 亚洲影院污污.| 国产精品网站大全| 欧美有码在线观看视频| 91成人天堂久久成人| 国产精品高潮呻吟久久av黑人| 97视频国产在线| 久久久久久久国产| 亚洲精品www久久久| 国产一区二区在线免费视频| 久久精品国产亚洲| 日韩极品精品视频免费观看| 久久久久久久久久国产精品| 亚洲а∨天堂久久精品9966| 69**夜色精品国产69乱| 国产精品久久一| 91色琪琪电影亚洲精品久久| 日韩成人av一区| 92裸体在线视频网站| 日韩电视剧在线观看免费网站| 欧美大胆a视频| 国产精品69久久| 国产视频丨精品|在线观看| 欧美精品一区三区| 亚洲最大福利视频网站| 亚洲老头老太hd| 精品偷拍一区二区三区在线看| 97在线免费观看| 精品中文字幕在线观看| 少妇高潮久久77777| 欧美乱大交xxxxx另类电影| 久久久免费av| 色偷偷偷亚洲综合网另类| 国产在线拍偷自揄拍精品| 亚洲欧美日韩在线高清直播| 国外日韩电影在线观看| 欧美性猛交xxx| 97不卡在线视频| 久久精品成人欧美大片古装| 久久天天躁狠狠躁夜夜av| 欧美日韩第一视频| 国内外成人免费激情在线视频网站| 亚洲男人av在线| 日韩中文在线观看| 久久国产精品亚洲| 国产精品久久久久久久av大片| 亚洲第一精品夜夜躁人人爽| 亚洲欧美激情精品一区二区| 亚洲精品视频网上网址在线观看| 日韩成人中文字幕| 性亚洲最疯狂xxxx高清| 久久精品久久久久久| 国产精品久久久av久久久| 亚洲欧美中文字幕在线一区| 国产亚洲精品高潮| 波霸ol色综合久久| 国产精品日韩欧美大师| 亚洲欧美综合精品久久成人| 午夜精品三级视频福利| 精品亚洲男同gayvideo网站| 久久久久久久电影一区|