热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ReactNative探索(四)Flexbox布局详解

相关文章ReactNative探索系列前言在Android开发中我们有很多种布局,比如Line

相关文章
React Native探索系列

前言

在Android开发中我们有很多种布局,比如LinearLayout和RelativeLayout,同样在React Native也有它的布局,这个布局就是Flexbox布局。在CSS、React Native和Android等都有它的身影。这一篇文章,我们就通过各种小例子来掌握React Native中的Flexbox布局。

1.Flexbox布局概述

Flexbox译为弹性布局(这里我们简称Flex),是CSS的一种布局方案,可以简单、完整、响应式的实现各种页面布局。不只是在CSS中应用,在React Native也使用了Flex,基本和CSS中的Flex类似。甚至在Android开发中我们也会用到Flex,谷歌提供了基于Flex的FlexboxLayout,以便于处理复杂的布局,因此,学习Flex布局对于Android开发也是有帮助的。
采用Flex布局的元素,称为Flex容器(flex container),简称容器,它的所有子元素则是Flex容器的成员称为Flex项目(flex item),简称项目。如下图所示。

容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置叫做main start,结束位置叫做main end。相似的,交叉轴的开始位置叫做cross start,结束位置叫做cross end。项目默认沿主轴排列,它在主轴上的长度叫做main size,交叉轴上的长度叫做cross size。

2.Flexbox容器属性

在CSS(React)中容器属性有6种,而在React Native中容器属性有5种,它们分别是:

  • flexDirection
  • justifyContent
  • alignItems
  • alignContent
  • flexWrap

下面通过小例子来分别介绍这些Flexbox容器属性。

flexDirection

flexDirection属性可以决定主轴的方向(即项目的排列方向),它有以下取值:

  • column(默认值):主轴为垂直方向,起点在顶端。
  • row:主轴为水平方向,起点在左端。
  • column-reverse:主轴为垂直方向,起点在下端。
  • row-reverse:主轴为水平方向,起点在右端。

我们先将flexDirection设置为row,代码如下所示。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( {
flex: 1, flexDirection: 'row', backgroundColor: 'ivory'}}> {
width: 60, height: 60, backgroundColor: 'powderblue'}}/> {
width: 60, height: 60, backgroundColor: 'skyblue'}}/> {
width: 60, height: 60, backgroundColor: 'dodgerblue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

运行效果如下图所示。

可以看出项目(子组件)是水平排列的,并且起点在左端。关于例子中的颜色设定可以查看官网文档。我们也可以将flexDirection设置为row-reverse,来查看效果:

可以看出Flex项目同样是水平排列的,只是起点在右端。

justifyContent

justifyContent属性用于定义项目在主轴上的对齐方式。它的取值有以下几种:

  • flex-start(默认值):项目与父容器在主轴的起点方向对齐。(比如flexDirection等于row时,项目与父容器左端对齐)
  • flex-end:项目与父容器在主轴的终点方向对齐(比如flexDirection等于row时,项目与父容器右端对齐)。
  • center:居中。
  • space-between: 两端对齐,并且项目间隔相等。
  • space-around:每个项目的两侧间隔相等,因此,项目之间的间隔是项目与父容器边缘间隔的2倍。

我们将justifyContent设置为flex-end,代码如下所示。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( {
flex: 1, flexDirection: 'row', justifyContent: 'flex-end', backgroundColor: 'ivory'}}> {
width: 60, height: 60, backgroundColor: 'powderblue'}}/> {
width: 60, height: 60, backgroundColor: 'skyblue'}}/> {
width: 60, height: 60, backgroundColor: 'dodgerblue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

效果如下所示。

接下来我们分别设置justifyContent为flex-startcenter,效果分别如下所示。

……

接下来我们分别设置justifyContent为space-betweenspace-around来查看它们有什么区别,效果分别如下所示。

……

上面左图是设置了space-between,可以看出最左边和最右边的项目都和父容器没有间隔,并且项目之间的间隔是相等的。右图的是space-around,最左边和最右边的项目都和父容器有间隔,并且项目之间的间隔是项目与父容器的间隔的2倍。

alignItems

alignItems用于定义项目在交叉轴上的对齐方式。它的取值有以下几种:

  • flex-start:项目与父容器在交叉轴的起点方向对齐。(比如flexDirection等于row时,项目与父容器上端对齐)
  • flex-end:项目与父容器在交叉轴的终点方向对齐。(比如flexDirection等于row时,项目与父容器下端对齐)
  • center:居中。
  • baseline :项目的第一行文字的基线对齐。
  • stretch:(默认值)如果项目未设置高度或者高度设为auto,项目将占满整个容器的高度,否则该取值不会生效。

将alignItems设置为flex-end,代码如下所示。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'flex-end', backgroundColor: 'ivory' }}> {
width: 60, height: 60, backgroundColor: 'powderblue'}}/> {
width: 60, height: 60, backgroundColor: 'skyblue'}}/> {
width: 60, height: 60, backgroundColor: 'dodgerblue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

效果如下图所示。

看到flex-end的效果,flex-start和center的效果也很容易知道。我们接下来将alignItems设置为stretch,需要注意的是,当项目没有设置高度或者高度设为auto时,stretch才会生效。这里为了验证效果,将所有项目的高度设置为auto。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', justifyContent: 'center', alignItems: 'stretch', backgroundColor: 'ivory' }}> {
width: 60, height: 'auto', backgroundColor: 'powderblue'}}/> {
width: 60, height: 'auto', backgroundColor: 'skyblue'}}/> {
width: 60, height: 'auto', backgroundColor: 'dodgerblue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

效果如下图所示。

可以看出,当alignItems设置为stretch时,项目会占满整个容器的高度。

alignContent

alignContent用于多行项目在交叉轴上的对齐方式。如果项目只有一行,该属性是不起作用的。它的取值有 flex-start 、flex-end 、 center 、space-between 、 space-around 和 stretch,只比justifyContent的取值多了一个stretch(默认值,含义和alignItems的stretch类似),alignContent的取值的含义和justifyContent的取值的含义类似,这里就不做举例了。

flexWrap

flexWrap用于设置如果一行排不下,如何换行。它的取值有以下几种:
- nowrap(默认):不换行。
- wrap:换行,第一行在上方。

我们将flexWrap设置为wrap,代码如下所示。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', alignItems: 'flex-start', flexWrap: 'wrap', backgroundColor: 'ivory' }}> {
width: 100, height: 60, backgroundColor: 'powderblue'}}/> {
width: 100, height: 60, backgroundColor: 'skyblue'}}/> {
width: 100, height: 60, backgroundColor: 'dodgerblue'}}/> {
width: 100, height: 60, backgroundColor: 'blue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

效果如下所示。


3.Flexbox项目属性

在React Native中项目属性有很多中,具体的可以参考:Layout Props。这里介绍flexGrow、flexShrink、flexBasis、flex和alignSelf。

flexGrow

flexGrow属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', alignItems: 'flex-start', backgroundColor: 'ivory' }}> {
width: 50, height: 50, flexGrow: 1, backgroundColor: 'powderblue'}}/> {
width: 50, height: 50, flexGrow: 2, backgroundColor: 'skyblue'}}/> {
width: 50, height: 50, flexGrow: 1, backgroundColor: 'dodgerblue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

我们将第二个项目flexGrow设置为2,其他的项目flexGrow设置为1,这样第二个项目所占的剩余空间是其他项目的两倍。如下图所示。

flexShrink

flexShrink属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', alignItems: 'flex-start', backgroundColor: 'ivory' }}> {
width: 120, height: 50, flexShrink: 1, backgroundColor: 'powderblue'}}/> {
width: 120, height: 50, flexShrink: 0, backgroundColor: 'skyblue'}}/> {
width: 120, height: 50, flexShrink: 1, backgroundColor: 'dodgerblue'}}/> {
width: 120, height: 50, flexShrink: 1, backgroundColor: 'blue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

我们将第二个项目的flexShrink设置为0,其他的项目都为1,这样当空间不足时,第二个项目不会缩小,如下图所示。


flexBasis

flexBasis属性定义了项目的初始宽度。它的默认值为auto,即项目的本来的宽度。我们知道width也可以用来设置项目的宽度,如果项目同时设置了width和flexBasis,那么flexBasis会覆盖width的值。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', alignItems: 'flex-start', backgroundColor: 'ivory' }}> {
width: 120, height: 50, flexBasis: 60, backgroundColor: 'powderblue'}}/> {
width: 120, height: 50, backgroundColor: 'skyblue'}}/> {
width: 120, height: 50, backgroundColor: 'dodgerblue'}}/> {
width: 120, height: 50, backgroundColor: 'blue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

效果如下图所示。


flex

如果我们每次都要设定flex-grow、flex-shrink和 flex-basis属性,显然有些麻烦,这时我们可以用flex 属性,它是 flex-grow、flex-shrink 和 flex-basis 属性的简写属性,默认值为0 1 auto,其中后两个属性可选。关于flex这里就不做举例了。

alignSelf

alignSelf属性和alignItems属性类似,只不过alignSelf作用于项目,它允许单个项目有与其他项目不一样的对齐方式,并且覆盖alignItems属性。alignSelf默认值为为auto,表示继承父元素的alignItems属性,如果没有父元素,则等同于stretch。alignSelf有五种取值:auto、flex-start、flex-end、center、baseline和stretch,除了多了auto,其他的取值都和alignItems的取值含义一样。

import React, {Component} from 'react'; import {AppRegistry, View} from 'react-native'; class FlexDirection extends Component { render() { return ( { flex: 1, flexDirection: 'row', alignItems: 'flex-start', backgroundColor: 'ivory' }}> {
width: 60, height: 60, alignSelf: 'flex-end', backgroundColor: 'powderblue'}}/> {
width: 60, height: 60, alignSelf: 'center', backgroundColor: 'skyblue'}}/> {
width: 60, height: 'auto', alignSelf: 'stretch', backgroundColor: 'dodgerblue'}}/> {
width: 60, height: 60, alignSelf: 'auto', backgroundColor: 'blue'}}/>
); } } AppRegistry.registerComponent('AwesomeProject', () => FlexDirection);

运行效果如下所示。

好了,关于Flexbox布局就讲到这,还有很多属性这里没有提到,比如:margin、padding、marginRight和maxWidth等等,这些属性我们一看名字就知道它的作用(Android开发者角度),因此这里就不多介绍了,更多的属性请查阅官方文档。

参考资料
官方文档
Flex 布局教程:语法篇—阮一峰
React-Native之flexbox布局篇

欢迎关注我的微信公众号,第一时间获得博客更新提醒,以及更多成体系的Android相关原创技术干货。
扫一扫下方二维码或者长按识别二维码,即可关注。



推荐阅读
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 安卓select模态框样式改变_微软Office风格的多端(Web、安卓、iOS)组件库——Fabric UI...
    介绍FabricUI是微软开源的一套Office风格的多端组件库,共有三套针对性的组件,分别适用于web、android以及iOS,Fab ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 20211101CleverTap参与度和分析工具功能平台学习/实践
    1.应用场景主要用于学习CleverTap的使用,该平台主要用于客户保留与参与平台.为客户提供价值.这里接触到的原因,是目前公司用到该平台的服务~2.学习操作 ... [详细]
  • javascript  – 概述在Firefox上无法正常工作
    我试图提出一些自定义大纲,以达到一些Web可访问性建议.但我不能用Firefox制作.这就是它在Chrome上的外观:而那个图标实际上是一个锚点.在Firefox上,它只概述了整个 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板
    本文介绍了在Xamarin XAML语言中如何在页面级别构建ControlTemplate控件模板的方法和步骤,包括将ResourceDictionary添加到页面中以及在ResourceDictionary中实现模板的构建。通过本文的阅读,读者可以了解到在Xamarin XAML语言中构建控件模板的具体操作步骤和语法形式。 ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 本文介绍了腾讯最近开源的BERT推理模型TurboTransformers,该模型在推理速度上比PyTorch快1~4倍。TurboTransformers采用了分层设计的思想,通过简化问题和加速开发,实现了快速推理能力。同时,文章还探讨了PyTorch在中间层延迟和深度神经网络中存在的问题,并提出了合并计算的解决方案。 ... [详细]
author-avatar
尖塔顶的Cat
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有