一:理论知识点

1:什么是FlexBox布局?

弹性盒模型(The Flexible Box Module),又叫Flexbox,意为“弹性布局”,旨在通过弹性的方式来对齐和分布容器中内容的空间,使其能适应不同屏幕,为盒装模型提供最大的灵活性。

Flex布局主要思想是:让容器有能力让其子项目能够改变其宽度、高度(甚至是顺序),以最佳方式填充可用空间;

2:Flex布局基于flex-flow流

容器默认存在两根轴:水平的主轴(main axis垂直的交叉轴(cross axis。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。

项目默认沿主轴排列,单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

根据伸缩项目排列方式的不同,主轴和侧轴方向也有所变化

3:在React中,Flexbox有6种容器属性,6种项目属性。而在React Native中,有4个容器属性,2个项目属性,分别是:

容器属性:flexDirection   flexWrap   justifyContent  alignItems

项目属性:flex  alignSelf

3.1: flexDirection容器属性: `row | row-reverse | column | column-reverse`

该属性决定主轴的方向(即项目的排列方向)。

row:主轴为水平方向,起点在左端。

row-reverse:主轴为水平方向,起点在右端。

column(默认值):主轴为垂直方向,起点在上沿。

column-reverse:主轴为垂直方向,起点在下沿。

3.2:flexWrap容器属性: `nowrap | wrap | wrap-reverse`

默认情况下,项目都排在一条线(又称"轴线")上。flex-wrap属性定义,如果一条轴线排不下,如何换行。

3.2.1 nowrap(默认值):不换行

3.2.2 wrap:换行,第一行在上方

3.2.3 wrap-reverse:换行,第一行在下方。(和wrap相反)

3.3:justifyContent容器属性:`flex-start | flex-end | center | space-between | space-around`

定义了伸缩项目在主轴线的对齐方式

flex-start(默认值):伸缩项目向一行的起始位置靠齐。

flex-end:伸缩项目向一行的结束位置靠齐。

center:伸缩项目向一行的中间位置靠齐。

space-between:两端对齐,项目之间的间隔都相等。

space-around:伸缩项目会平均地分布在行里,两端保留一半的空间。

3.4:alignItems容器属性:`flex-start | flex-end | center | baseline | stretch`

定义项目在交叉轴上如何对齐,可以把其想像成侧轴(垂直于主轴)的“对齐方式”。

flex-start:交叉轴的起点对齐。

flex-end:交叉轴的终点对齐 。

center:交叉轴的中点对齐。

baseline:项目的第一行文字的基线对齐。

stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。

3.5:flex项目属性:

“flex-grow”、“flex-shrink”和“flex-basis”三个属性的缩写, 其中第二个和第三个参数(flex-shrink、flex-basis)是可选参数。默认值为“0 1 auto”。

宽度 = 弹性宽度 * ( flexGrow / sum( flexGorw ) )

3.6:alignSelf项目属性:

“auto | flex-start | flex-end | center | baseline | stretch”

align-self属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。

默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。

二:代码实例:

1:简单布局

import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native'; class ReactNativeProject extends Component {
render() {
return (
<View style={styles.container}>
<View style={styles.viewItem1}>
</View>
<View style={styles.viewItem2}>
</View>
<View style={styles.viewItem3}>
</View>
<View style={{flex:,backgroundColor:'#bbceee',flexDirection:'row'}}></View>
</View>
);
}
} const styles = StyleSheet.create({
container: {
flex:
},
viewItem1:{
flex:,
flexDirection:'row',
height:,
backgroundColor:'#FF33CC'
},
viewItem2:{
flex:,
flexDirection:'row',
height:,
marginTop:,
backgroundColor:'#00FFFF'
},
viewItem3:{
flex:,
flexDirection:'row',
height:,
backgroundColor:'#CCBBFF'
},
}); AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);

效果图:

说明:return返回只能是一个对象,所以在最外层包含的一个View,里面放置四个View,并对它们进行布局;

最后一个View的flex属性让它比起其它的权重要大,所以高度会是其它的对应倍数值,上面还分开两种写法,一种是在下面用样式属性编写,另一个是直接在布局里面写样式,注意它们的差别,建议分开写;里面四个子View我们都让它以flexDirection为row方式进行排列;

2:布局属性运用:

import React, { Component } from 'react';
import {
AppRegistry,
StyleSheet,
Text,
View
} from 'react-native'; class ReactNativeProject extends Component {
render() {
return (
<View style={styles.container}> <View style={styles.viewItem1}>
<View style={{flex:,height:,backgroundColor:'red'}}></View>
<View style={{flex:,height:,backgroundColor:'blue',alignSelf:'center'}}></View>
<View style={{flex:,height:,backgroundColor:'red',alignSelf:'flex-end'}}></View>
</View> <View style={styles.viewItem2}>
<View style={styles.viewItem2Child1}>
</View>
<View style={styles.viewItem2Child2}>
</View>
</View> <View style={styles.viewItem3}>
<View style={styles.viewItem3Child1}>
</View>
<View style={styles.viewItem3Child2}>
</View>
<View style={styles.viewItem3Child3}>
</View>
</View> <View style={{flex:,backgroundColor:'#bbceee',flexDirection:'row'}}>
<View style={{flex:,height:,flexDirection:'row',justifyContent:'center',marginTop:}}>
<View style={{width:,backgroundColor:'red'}}></View>
<View style={{width:,backgroundColor:'blue'}}></View>
</View>
</View>
</View>
);
}
} const styles = StyleSheet.create({
container: {
flex:
},
viewItem1:{
flex:,
flexDirection:'row',
height:,
backgroundColor:'#FF33CC'
},
viewItem2:{
flex:,
flexDirection:'row',
height:,
marginTop:,
backgroundColor:'#00FFFF', flexWrap:'wrap'
},
viewItem2Child1:
{
width:,
height:,
backgroundColor:'green'
},
viewItem2Child2:
{
width:,
height:,
backgroundColor:'red'
},
viewItem3:{
flex:,
flexDirection:'row',
height:,
backgroundColor:'#CCBBFF'
},
viewItem3Child1:{
flex:,
backgroundColor:'#00ffbb'
},
viewItem3Child2:{
flex:,
backgroundColor:'#aabbdd'
},
viewItem3Child3:
{
flex:,
backgroundColor:'#0000ff'
}
}); AppRegistry.registerComponent('ReactNativeProject', () => ReactNativeProject);

在实例1的基础上,对其它属性进一步运用;效果图如下:

第一个View包含三个View,主要是实现针对alignSelf属性的运用;

第二个View包含二个View,两个View的宽度之合大于屏幕宽度,主要是实现针对flexWrap属性的运用;

第三个View包含三个View,主要是针对flex的运用

第四个View包含有两个View,主要是针对justifyContent跟属性marginTop的运用;

三:其它知识点:

1:获取当前屏幕的宽度、高度、分辨率

import Dimensions from 'Dimensions';

var { width, height, scale } = Dimensions.get('window');

render() {
return (
<View>
<Text>
屏幕的宽度:{width + '\n'}
屏幕的高度:{height + '\n'}
屏幕的分辨率:{scale + '\n'}
</Text>
</View>
);
}

2:默认宽度

我们都知道块级标签如果不设置宽度,通常都是独占一行的,在React Native中的组件中需要设置flexDirection:'row',才能在同一行显示,flex的元素如果不设置宽度,都会百分之百的占满父容器。

3:水平、垂直居中

当alignItems、justifyContent传center时与flexDirection的关系:

想理解这个很简单,看我上班讲的alignItems、justifyContent,心里想着主轴和次轴就可以理解,justifyContent是主轴方向居中,而alignItems是次轴方向居中,flexDirection默认为column,所以误区会认为alignItems为水平居中,justifyContent为垂直居中。

4:padding和margin

margin是指从自身边框到另一个容器边框之间的距离,就是容器外距离。在CSS中padding是指自身边框到自身内部另一个容器边框之间的距离,就是容器内距离,下面这张是CSS的效果图,只是名字不一样(marginTop),原理都是一样;

5:关于样式

(1)普通内联样式:{{}},第一层{}是表达式,第二层{}是js对象;

<View style={{fontSize:40, width:80,}}> </View>

(2)调用样式表:{样式类.属性}

<View style={styles.container}></View>

(3)样式表和内联样式共存:{[]}

<View style={[styles.container, {fontSize:40, width:80}]}>

(4)多个样式表:{[样式类1, 样式类2]}

<View style={[styles.container, styles.color]}>

6:React Native样式属性列表

"alignItems",

"alignSelf",

"backfaceVisibility",

"backgroundColor",

"borderBottomColor",

"borderBottomLeftRadius",

"borderBottomRightRadius",

"borderBottomWidth",

"borderColor",

"borderLeftColor",

"borderLeftWidth",

"borderRadius",

"borderRightColor",

"borderRightWidth",

"borderStyle",

"borderTopColor",

"borderTopLeftRadius",

"borderTopRightRadius",

"borderTopWidth",

"borderWidth",

"bottom",

"color",

"flex",

"flexDirection",

"flexWrap",

"fontFamily",

"fontSize",

"fontStyle",

"fontWeight",

"height",

"justifyContent",

"left",

"letterSpacing",

"lineHeight",

"margin",

"marginBottom",

"marginHorizontal",

"marginLeft",

"marginRight",

"marginTop",

"marginVertical",

"opacity",

"overflow",

"padding",

"paddingBottom",

"paddingHorizontal",

"paddingLeft",

"paddingRight",

"paddingTop",

"paddingVertical",

"position",

"resizeMode",

"right",

"rotation",

"scaleX",

"scaleY",

"shadowColor",

"shadowOffset",

"shadowOpacity",

"shadowRadius",

"textAlign",

"textDecorationColor",

"textDecorationLine",

"textDecorationStyle",

"tintColor",

"top",

"transform",

"transformMatrix",

"translateX",

"translateY",

"width",

"writingDirection"

四:问题

1:当出现下面这张图一般是JS代码出错了,要么是样式或者布局不正确引起;

最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,每天都会更新一些深度内容,在这里如果你感兴趣也可以关注一下(嘿对美女跟知识感兴趣),当然可以关注后输入:github 会有我的微信号,如果有问题你也可以在那找到我;当然不感兴趣无视此信息;

React Native知识1-FlexBox 布局内容的更多相关文章

  1. 3、手把手教React Native实战之flexbox布局

    flexbox是Flexible Box的缩写,弹性盒子布局  主流的浏览器都支持 flexbox布局是伸缩容器(container)和伸缩项目(item)组成 Flexbox布局的主体思想是元素可以 ...

  2. 4、手把手教React Native实战之flexbox布局(伸缩属性)

    ###伸缩项目的属性 1.order 定义项目的排列顺序,数值越小,排列越靠前,默认值为0,语法为:order:整数值 2.flex-grow 定义伸缩项目的放大比例,默认值为0,即表示如果存在剩余空 ...

  3. React Native入门 认识Flexbox布局

    Flexbox布局是由W3C在09年提出的在Web端取代CSS盒子模型的一种布局方式. ReactNative实现了Flexbox布局的大部分功能. Flexbox布局所使用的属性,基本可以分为两大类 ...

  4. React Native知识

    http://www.cnblogs.com/wujy/tag/React%20Native/    React Native知识12-与原生交互 React Native知识11-Props(属性) ...

  5. React Native知识2-Text组件

    Text用于显示文本的React组件,并且它也支持嵌套.样式,以及触摸处理.在下面的例子里,嵌套的标题和正文文字会继承来自styles.baseText的fontFamily字体样式,不过标题上还附加 ...

  6. React Native知识12-与原生交互

    一:原生传递参数给React Native 1:原生给React Native传参 原生给JS传数据,主要依靠属性. 通过initialProperties,这个RCTRootView的初始化函数的参 ...

  7. React Native知识6-NavigatorIOS组件

    NavigatorIOS包装了UIKit的导航功能,可以使用左划功能来返回到上一界面.本组件并非由Facebook官方开发组维护.这一组件的开发完全由社区主导.如果纯js的方案能够满足你的需求的话,那 ...

  8. React Native知识5-Touchable类组件

    React Native 没有像web那样可以给元素绑定click事件,前面我们已经知道Text组件有onPress事件,为了给其他组件 也绑定点击事件,React Native提供了3个组件来做这件 ...

  9. React Native知识4-Image组件

    一个用于显示多种不同类型图片的React组件,包括网络图片.静态资源.临时的本地图片.以及本地磁盘上的图片(如相册)等 一:属性 1:onLayout function 当元素挂载或者布局改变的时候调 ...

随机推荐

  1. 关于SubSonic3.0插件使用SubSonic.Query.Select查询时,字段类型为tinyint时列丢失问题的Bug修复

    下午在写代码时,突然发现一个列名为Enable的字段怎么也查询不出来,开始以为可能这个名称是关键字,所以给过滤掉了,所以就将名称修改为IsEnable,问题还是一样......将名称又改为IsEnab ...

  2. javascript中异步和闭包产生的困惑

    这里我不打算大谈特谈什么是异步,什么是闭包,这些内容在博客园都已经写的够多的了,但是这些内容出现的多,并不代表所有初学者都已经撑握了,所以我还是打算,用一个比较常见的示例来分析一下,或许能让对这个问题 ...

  3. make things simple

    以前看过一篇文章,具体内容不记得了,只记得它的结论了:懒是人类进步的源动力.当时觉得结论有点新颖,文中列举了大量的实例证明这个结论,其中重点强调了计算机学科.我本身从事算是计算机相关的工作,对文中的部 ...

  4. 使用Spire.Barcode程序库生成二维码

    使用Spire.Barcode程序库生成二维码 某天浏览网页发现了一个二维码的程序库.它的描述说他可以扫描二维码图像.我很感兴趣,想试试他是不是会有用.所以我就用了些方法扫描二维码图像来测试一下.结果 ...

  5. spring笔记--依赖注入之针对不同类型变量的几种注入方式

    控制反转和依赖注入讲的都是一个概念,只不过是站在了不同的角度,所谓的依赖注入: 是指在运行期,由外部容器动态地将依赖对象注入到组件中.当spring容器启动后,spring容器初始化,创建并管理bea ...

  6. 【JUC】JDK1.8源码分析之ConcurrentSkipListSet(八)

    一.前言 分析完了CopyOnWriteArraySet后,继续分析Set集合在JUC框架下的另一个集合,ConcurrentSkipListSet,ConcurrentSkipListSet一个基于 ...

  7. Rafy 领域实体框架示例(1) - 转换传统三层应用程序

    Rafy 领域实体框架发布后,虽然有帮助文档,许多朋友还是反映学习起来比较复杂,希望能开发一个示例程序,展示如何使用 Rafy 领域实体框架所以,本文通过使用 Rafy 领域实体框架来改造一个传统的三 ...

  8. HighchartsNET快速图表控件-开源

    前言: HighchartsNET快速图表控件,基于Highcharts的asp.net web控件.只需几行代码你就能快速生成一个图表. 从此不再担心图表复杂.简单几行代码就可以搞定,节省大量工作时 ...

  9. [Q&A] VS 连接 SQLServer 时未找到或无法访问服务器

    异常信息: 参考解决方法: 1:检查下面两处服务器名是否一致并正确 (VS上) (SQL Server 2008 R2上) 2:VS 在下图位置处对实例名称的设定对于该异常无影响 3:确认在服务中启动 ...

  10. T-SQL 循环表的一种方式

    原文来自:https://www.lesg.cn/netdaima/sqlservert-sql/2016-463.html SsqlServer 中循环表有几种方式 1.临时表 2.游标 3-. 下 ...