React Native 系列(四)

前言

本系列是基于React Native版本号0.44.3写的。RN支持CSS中的布局属性,因此可以使用CSS布局属性,这里就不详细地讲解了,这篇文章的重点主要是讲述一下RN中的Flex布局。

CSS属性布局

视图边框

  • 何时使用? 想要设置自己周边有边框的时候
  • 注意点:一定要设置边框宽度
borderBottomWidth number 底部边框宽度
borderLeftWidth number 左边框宽度
borderRightWidth number 右边框宽度
borderTopWidth number 顶部边框宽度
borderWidth number 边框宽度
border<Bottom|Left|Right|Top>Color 各方向边框的颜色,<>表示连着一起,例如borderBottomColor
borderColor 边框颜色

尺寸

width number
height number

外边距

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

注意marginRightwidth冲突,如果设置了widthmarginRight无效。

内边距

padding number 内边距
paddingBottom number 下内边距
paddingHorizontal number 左右内边距
paddingLeft number 做内边距
paddingRight number 右内边距
paddingTop number 上内边距
paddingVertical number 上下内边距

这里想跟大家介绍一下网页中的盒子模型布局,看图说明一切:

相对定位和绝对定位

  • 边缘

    left number 左边缘
    right number 右边缘
    top number 上边缘
    bottom number 下边缘
  • 定位

    通过leftrighttopbottom边缘属性进行定位。
    absolute:绝对定位,参照父控件位置定位
    relative:相对定位,参照当前控件原始位置定位

Flex 布局

使用RN开发,一般都采用Flex布局,使用这套布局就非常快。

Flex 简介

Flex布局又叫弹性布局,会把组件看成一个容器,它的所有子组件都是它容器中的成员,通过Flex,就能迅速布局子成员。

Flex 主轴和侧轴

  • Flex中有两个重要的概念就是:主轴和侧轴
  • 主轴和侧轴之间的关系是相互垂直的
  • 主轴:决定子组件默认的布局方向:水平、竖直
  • 侧轴:决定子组件与主轴垂直的方向
    • 比如主轴水平,那么子组件默认水平布局排布,侧轴就是控制子组件在竖直方向上的布局

flexDirection属性

  • flexDirection:决定子组件主轴的方向,水平或者竖直
  • flexDirection共有4个值,在RN中默认是column
    row:主轴水平方向,从左往右。依次排列
    row-reverse:主轴水平方向,从右往左。依次排列
    column:主轴竖直方向,从上往下。依次排列
    column-reverse:主轴竖直方向,从下往上。依次排列

代码演练:

export default class RNDemoOne extends Component {
  render() {
    return (
      <View style={styles.container}>
          <Text style={styles.baseTextStyle}>1</Text>
          <Text style={styles.baseTextStyle}>2</Text>
          <Text style={styles.baseTextStyle}>3</Text>
          <Text style={styles.baseTextStyle}>4</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
      flex: 1,
      backgroundColor: ‘#F5FCFF‘,
      flexDirection: ‘row‘
  },

    baseTextStyle: {
      height: 50,
      width: 50,
        fontSize: 15,
        backgroundColor: ‘#FF3333‘,
        margin: 20,
        textAlign: ‘center‘,
    }
});

效果图:

  • row
  • row-reverse
  • column
  • column-reverse

flexWrap属性

  • flexWrap决定子控件在父视图类是否允许多行排列。
  • flexWrap共有两个值,默认为nowrap
nowrap 组件排列在一行,可能导致溢出
wrap 组件在一行显示不下时,会换行

将上述代码中<Text></Text>组件的宽度改为 75 。
效果:

  • nowrap
  • wrap

justifyContent

  • justifyContent设置主轴子组件具体布局,是靠左,还是居中等。
  • justifyContent共有5个值,默认为flex-start
flex-start: 子组件向主轴起点对齐,如果主轴水平,从左开始,如果主轴竖直,从上开始。

flex-end: 子组件向主轴终点对齐,如果主轴水平,从右开始,如果主轴竖直,从下开始。

center: 居中显示,注意:并不是让某一个子组件居中,而是整体效果居中。

space-between: 均匀分配,相邻元素间距相同。起点和终点靠边

space-around: 均匀分配,相邻元素间距相同。起点和终点间距是组件间间距的一半。

代码演练:

export default class RNDemoOne extends Component {
  render() {
    return (
      <View style={styles.container}>
          <Text style={styles.baseTextStyle}>1</Text>
          <Text style={styles.baseTextStyle}>2</Text>
          <Text style={styles.baseTextStyle}>3</Text>
          <Text style={styles.baseTextStyle}>4</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
      flex: 1,
      backgroundColor: ‘#F5FCFF‘,
      flexDirection: ‘row‘,
      flexWrap: ‘wrap‘,
      justifyContent: ‘flex-start‘
  },

    baseTextStyle: {
      height: 50,
      width: 50,
        fontSize: 15,
        backgroundColor: ‘#FF3333‘,
        marginTop: 20,
        textAlign: ‘center‘,
    }
});

效果:

  • flex-start
  • flex-end
  • center
  • space-between
  • space-around

alignItems

  • alignItems决定子组件侧轴方向上的布局
  • alignItems共有4个值,默认为stretch
flex-start: 侧轴方向上起点对齐
flex-end: 侧轴方向上终点对齐
center: 子组件侧轴居中
stretch: 子组件在侧轴方向被拉伸到与容器相同的高度或宽度

注意点:如果指定了宽或者高,这stretch对应的地方不能拉伸,比如指定了高度,这stretch在高度上就是那个指定的值。(由于贴了太多图,这里就不贴图了,各位可以自己编写代码运行看看效果。??)

alignSelf

  • alignSelf:自己定义自己的侧轴布局,用于一个组件设置

    • 当某个子组件不想参照默认的alignItems的时候,可以设置alignSelf,自己定义自己的侧轴布局
  • alignSelf共有5个值,默认为auto
auto:继承它的父容器的alignItems属性。如果没有父容器则为 "stretch"
flex-start:子组件向侧轴起点对齐
flex-end:子组件向侧轴终点对齐
center:子组件在侧轴居中
stretch:子组件在侧轴方向被拉伸到与容器相同的高度或宽度

代码演练:

export default class RNDemoOne extends Component {
  render() {
    return (
      <View style={styles.container}>
          <Text style={[styles.baseTextStyle, {alignSelf: ‘flex-start‘}]}>1</Text>
          <Text style={styles.baseTextStyle}>2</Text>
          <Text style={styles.baseTextStyle}>3</Text>
          <Text style={styles.baseTextStyle}>4</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
      flex: 1,
      backgroundColor: ‘#F5FCFF‘,
      flexDirection: ‘row‘,
      flexWrap: ‘wrap‘,
      justifyContent: ‘space-around‘,
      alignItems: ‘center‘
  },

    baseTextStyle: {
      height: 50,
      width: 50,
        fontSize: 15,
        backgroundColor: ‘#FF3333‘,
        marginTop: 20,
        textAlign: ‘center‘,
    }
});

flex

  • flex:决定子控件在主轴中占据几等分
  • flex:任意数字,所有子控件flex相加,自己flex占总共的多少,就有多少宽度

代码演练:

export default class RNDemoOne extends Component {
  render() {
    return (
      <View style={styles.container}>
          <Text style={[styles.baseTextStyle, styles.text1Style]}>1</Text>
          <Text style={[styles.baseTextStyle, styles.text2Style]}>2</Text>
          <Text style={[styles.baseTextStyle, styles.text3Style]}>3</Text>
          <Text style={[styles.baseTextStyle, styles.text4Style]}>4</Text>
      </View>
    );
  }
}

const styles = StyleSheet.create({
  container: {
      flex: 1,
      backgroundColor: ‘#F5FCFF‘,
      flexDirection: ‘row‘,
      flexWrap: ‘wrap‘,
      justifyContent: ‘space-around‘,
      alignItems: ‘center‘
  },

    baseTextStyle: {
      // height: 50,
      // width: 50,
        fontSize: 15,
        backgroundColor: ‘#FF3333‘,
        marginTop: 20,
        textAlign: ‘center‘,
    },

    text1Style: {
        flex: 1,
        backgroundColor: ‘red‘
    },

    text2Style: {
        flex: 1,
        backgroundColor: ‘orange‘
    },
    text3Style: {
        flex: 2,
        backgroundColor: ‘yellow‘
    },

    text4Style: {
        flex: 1,
        backgroundColor: ‘blue‘
    },
});

致谢

如果发现有错误的地方,欢迎各位指出,谢谢!

时间: 2024-12-23 18:03:07

React Native 系列(四)的相关文章

【REACT NATIVE 系列教程之二】创建自定义组件&&导入与使用示例

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2219.html 在上一篇  [REACT NATIVE 系列教程之一]触摸事件的两种形式与四种TOUCHABLE组件详解 中的最后介绍了如何使用Touchable的四种组件进行监听触摸事件.  那么紧接着我们利用Touchable来包装一个带图片的Button组件,且设计成可接受很多自定义参数. 一:创建我们自定义

菜鸟窝React Native 系列教程-1.移动端开发趋势与未来

菜鸟窝React Native 系列教程-1.移动端开发趋势与未来 课程持续更新中..... 我是RichardCao,现任新美大酒店旅游事业群的Android Developer.如果你也有兴趣录制RN视频,请加入下面QQ群找我. 下载地址:https://pan.baidu.com/s/1c1XmE56 密码:shhw 首发地址:菜鸟窝-ReactNative学习板块 交流QQ群:576089067 课程目录:菜鸟窝React Native 系列教程

【REACT NATIVE 系列教程之十三】利用LISTVIEW与TEXTINPUT制作聊天/对话框&&获取组件实例常用的两种方式

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2346.html 本篇Himi来利用ListView和TextInput这两种组件实现对话.聊天框. 首先需要准备的有几点:(组件的学习就不赘述了,简单且官方有文档) 1. 学习下 ListView: 官方示例:http://reactnative.cn/docs/0.27/tutorial.html#content

【REACT NATIVE 系列教程之十二】REACT NATIVE(JS/ES)与IOS(OBJECT-C)交互通信

一用到跨平台的引擎必然要有引擎与各平台原生进行交互通信的需要.那么Himi先讲解React Native与iOS之间的通信交互. 本篇主要分为两部分讲解:(关于其中讲解的OC语法等不介绍,不懂的请自行学习) 1. React Native 访问iOS 2. iOS访问React Native     一:React Native 访问iOS 1. 我们想要JS调用OC函数,就要实现一个"RCTBridgeModule"协议的Objective-C类 所以首先我们先创建一个oc新类,  

【REACT NATIVE 系列教程之十一】插件的安装、使用与更新(示例:REACT-NATIVE-TAB-NAVIGATOR)

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2294.html 本篇主要来详细介绍如何安装.升级插件及讲解一个react-native-tab-navigator的示例. 首先推荐一个插件网站:https://www.npmjs.com     (此插件属于半官方维护的) 本文举例使用的插件:react-native-tab-navigator ,选项卡形式的导

【REACT NATIVE 系列教程之七】统一ANDROID与IOS两个平台的程序入口&&区分平台的组件简介

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2260.html       本篇介绍两个细节:       1. 关于如何将index.android.js 与index.ios.js统一管理起来.       2.  Platform 组件的简单介绍与使用   一:将index.android.js 与index.ios.js统一管理起来. 由于React本身

【REACT NATIVE 系列教程之一】触摸事件的两种形式与四种TOUCHABLE组件详解

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2203.html 本文是RN(React Native)系列教程第一篇,当然也要给自己的群做个广告:   React Native @Himi :126100395  刚创建的群,欢迎一起学习.讨论.进步. 本文主要讲解两点: 1.   PanResponder:触摸事件,用以获取用户手指所在屏幕的坐标(x,y)或触

React Native 系列(七)

前言 本系列是基于React Native版本号0.44.3写的.几乎所有的App都使用了ListView这种组件,这篇文章将学习RN中ListView的平铺样式和分组样式. ListView平铺样式 ListView内部是通过ListViewDataSource这个对象显示数据的,因此使用ListView的时候需要创建一个ListViewDataSource对象. ListViewDataSource构造方法创建对象的时候可以选择性出入4个参数,描述怎么提取cell,怎么刷新cell 这些参数

React Native 系列(九)

前言 本系列是基于React Native版本号0.44.3写的.很多的App都使用了Tab标签组件,例如QQ,微信等等,就是切换不同的选项,显示不同的内容.那么这篇文章将介绍RN中的Tab标签组件. Tab标签 什么是Tab标签?(ps:我是这样叫的),就拿微信来说吧,底部有4个选项卡,点击不同的按钮切换不同的内容.在RN中有两个组件负责实现这样的效果,它们是: TabBarIOS TabNavigator TabBarIOS 和NavigatorIOS相似,看名字就知道该组件只适用于iOS,