React Native布局之FlexBox

简介:

概述

FlexBox(弹性框布局):英文全称the flexible box Module,FlexBox旨在提供了在不同尺寸设备上都能保持一致的布局方式。
其主要思想是:让容器有能力让其子项目能够改变其宽度|高度|顺序,以最佳方式填充可用空间。在布局中,首先得确定主轴方向(flexDirection),主轴组件的对齐方式(justifyContent),侧轴组件的对齐方式(alignItems),通过以上四点可以基本确定布局。
注:FlexBox是CSS3弹性框布局规范,目前还处于最终征求意见稿 (Last Call Working Draft)阶段,并不是所有的浏览器都支持Flexbox。

在学习FlexBox之前首先要清楚一个概念“宽和高”。一个组件的高度和宽度决定了它在屏幕上的尺寸,显示的效果。

FlexBox属性

为了更好的理解与应用FlexBox,我们先看一下FlexBox所具有的属性。

主轴和侧轴(横轴和竖轴)

在学习属性之前,让我们先了解一个概念:主轴和侧轴。
这里写图片描述

如图:主轴即水平方向的轴线,可以理解成横轴,侧轴垂直于主轴,可以理解为竖轴。

flexDirection
该属性确定了主轴方向。

属性名 说明
row(默认) 主轴方向为水平,起点在左端
row- reverse 主轴方向为水平,起点在右端
column 主轴方向为垂直,起点在上端
column-reverse 主轴方向为垂直,起点在下端

justifyContent
该属性确定了组件在主轴方向上的对齐方式。

属性名 说明
flex-start(默认) 组件沿着主轴方向的起始位置靠齐
flex-end 组件沿着主轴方向的结束位置靠齐,和flex-start相反
space-between 组件在主轴方向上两端对齐,其中的间隔相等
space-around 组件会平均分配在主轴方向上,两端保留一定的位置空间

alignItems
该属性确定了组件在侧轴方向上的对齐方式。

属性名 说明
flex-start 组件沿着侧轴上的起点对齐
flex-end 组件沿着侧轴上的终点对齐
center 组价在侧轴方向上居中对齐
stretch(默认) 组件在侧轴方向上占满

flexWrap
该属性主要用作换行,默认情况下,项目都排列在一条线上,放不下的部分则不放置,flexWap就是定义是否换行的。。

属性名 说明
nowrap(默认) 不换行
wrap 换行,第一行在上方
wrap-reverse 换行,第一行在下方

代码示例

<View style={ {flexDirection:'row-reverse',backgroundColor:"darkgray",marginTop:20}}>
    <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>1</Text>
  </View>
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>2</Text>
  </View>
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>3</Text>
  </View>
  <View style={ {width:40,height:40,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>4</Text>
  </View>
  </View>

这里写图片描述

宽和高

在React Native中尺寸是没有单位的,它代表了设备独立像素。有点类似于Android的设备像素。
如:

<View style={ {width:100,height:100,margin:40,backgroundColor:'gray'}}>
        <Text style={ {fontSize:16,margin:20}}>尺寸</Text>
</View>

上诉代码:运行在Android上时,View的长和宽被解释成:100dp 100dp单位是dp,字体被解释成16sp 单位是sp,运行在iOS上时尺寸单位被解释称了pt,这些单位确保了布局在任何不同dpi的手机屏幕上显示不会发生改变。

RN的FlexBox和css的FlexBox的异同

虽然React Native中的FlexBox 和Web CSSS上FlexBox工作方式是一样的。但是在某些方面还是有细微区别的:

  • flexDirection: React Native中默认为flexDirection:'column',在Web CSS中默认为flex-direction:'row'
  • alignItems: React Native中默认为alignItems:'stretch',在Web CSS中默认align-items:'flex-start'
  • flex: React Native中flex只接受一个参数,而Web Css的flex可以接受多参数,如:flex: 2 2 10%
  • RN不支持属性:align-content,flex-basis,order,flex-basis,flex-flow,flex-grow,flex-shrink

React Native

React Native布局属性

以下属性是React Native所支持的Flex属性。

父视图属性(容器属性):

  • flexDirection enum('row', 'column','row-reverse','column-reverse')
  • flexWrap enum('wrap', 'nowrap')
  • justifyContent enum('flex-start', 'flex-end', 'center',
    'space-between', 'space-around')
  • alignItems enum('flex-start', 'flex-end', 'center', 'stretch')

justifyContent

该属性定义了浏览器如何分配顺着父容器主轴的弹性(flex)元素之间及其周围的空间,默认为flex-start。

属性名 说明
flex-start(默认) 从行首开始排列。每行第一个弹性元素与行首对齐,同时所有后续的弹性元素与前一个对齐
flex-end 从行尾开始排列。每行最后一个弹性元素与行尾对齐,其他元素将与后一个对齐。
center 伸缩元素向每行中点排列。每行第一个元素到行首的距离将与每行最后一个元素到行尾的距离相同。
space-between 在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素与行首对齐,每行最后一个元素与行尾对齐。
space-around 在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素到行首的距离和每行最后一个元素到行尾的距离将会是相邻元素之间距离的一半。

代码示例:

<View          style={ {justifyContent:'center',flexDirection:'row',backgroundColor:"darkgray",marginTop:20}}>
···
</View>

这里写图片描述

alignItems

属性以与justify-content相同的方式在侧轴方向上将当前行上的弹性元素对齐,默认为stretch。
属性请参照本文开头的讲解。
代码示例:

<View          style={ {justifyContent:'center',flexDirection:'row',backgroundColor:"darkgray",marginTop:20}}>
···
</View>

这里写图片描述

子视图属性

alignSelf

该属性以属性定义了flex容器内被选中项目的对齐方式。注意:alignSelf 属性可重写灵活容器的 alignItems 属性。

属性名 说明
auto(默认) 元素继承了它的父容器的 align-items 属性。如果没有父容器则为 "stretch"
stretch 元素被拉伸以适应容器
center 元素位于容器的中心
flex-start 元素位于容器的开头
flex-end 元素位于容器的结尾

代码示例:

<View style={ {alignSelf:'baseline',width:60,height:    20,backgroundColor:"darkcyan",margin:5}}>
   <Text style={ {fontSize:16}}>1</Text>
</View>

这里写图片描述

flex

该属性定义了一个可伸缩元素的能力,默认为0。类似于比重这么一个概念(因其位于父视图下面,所以比重相当于所占的百分比)。

代码示例:

<View style={ {flexDirection:'row',height:40, backgroundColor:"darkgray",marginTop:20}}>
  <View style={ {flex:1,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>flex:1</Text>
  </View>
  <View style={ {flex:2,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>flex:2</Text>
  </View>
  <View style={ {flex:3,backgroundColor:"darkcyan",margin:5}}>
    <Text style={ {fontSize:16}}>flex:3</Text>
  </View>          
</View>

这里写图片描述

其他属性

视图边框

属性名 说明
borderBottomWidth 底部边框宽度
borderLeftWidth 左边框宽度
borderRightWidth 右边框宽度
borderTopWidth 顶部边框宽度
borderWidth 边框宽度
border(Bottom|Left|Right|Top)Color 边框颜色

外边框

属性名 说明
margin 外边距
marginBottom 下外边距
marginHorizontal 左右外边距
marginLeft 左外边距
marginRight 右外边距
marginTop 上外边距
marginVertical 上下外边距

内边框

属性名 说明
padding 内边距
paddingBottom 下内边距
paddingHorizontal 左右内边距
paddingLeft 左内边距
paddingRight 右内边距
paddingTop 上内边距
paddingVertical 上下内边距

边缘

属性名 说明
left 元素的左边缘
right 元素的右边缘
top 元素的上边缘
bottom 元素的下边缘

元素定位

属性名 说明
absolute 生成绝对定位的元素,元素的位置通过 "left", "top", "right" 以及 "bottom" 属性进行规定
relative 生成相对定位的元素,相对于其正常位置进行定位
目录
相关文章
|
1月前
|
移动开发 前端开发 数据可视化
React 拖拽布局组件 Drag & Drop Layout
本文介绍了如何在React中构建拖拽布局组件,涵盖基础知识、常见问题及解决方案。首先解释了拖拽操作的三个阶段:开始、过程中和结束。接着推荐了几个常用的拖拽库,如`react-beautiful-dnd`,并详细展示了如何使用该库创建基础拖拽组件,包括安装依赖、初始化容器和处理拖拽结束事件。文章还探讨了常见问题,如拖拽不生效、性能优化、嵌套拖拽和跨浏览器兼容性,并提供了进阶技巧,如自定义样式、多列布局和集成其他UI组件。通过这些内容,读者可以掌握构建高效拖拽布局的方法。
60 16
|
6月前
|
前端开发
使用 React Router v6 进行布局
【8月更文挑战第27天】
75 1
|
7月前
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
8月前
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
99 0
|
8月前
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
167 1
|
8月前
|
开发框架 前端开发 JavaScript
移动应用开发中的跨平台策略:Flutter与React Native的比较
在移动应用领域,跨平台解决方案已成为开发者追求高效、成本效益和广泛覆盖的关键。本文深入探讨了两种领先的跨平台框架——Flutter和React Native,从技术架构、性能、社区生态及实际应用案例四个维度进行全面对比分析。通过这一比较,旨在为移动应用开发者提供选择合适框架的参考依据,帮助他们根据项目需求做出明智的决策。
|
8月前
|
前端开发 iOS开发 Android开发
React Native跨平台开发实战:从零到一
学习React Native跨平台开发,首先安装Node.js和React Native CLI,设置Android/iOS环境。使用CLI创建项目,如`npx react-native init MyProject`。运行应用:`npx react-native run-android`或`run-ios`。编写组件,如在App.js中创建Hello World。添加样式,安装第三方库如react-native-vector-icons,使用react-navigation进行路由和导航。
144 2
|
9月前
|
前端开发 JavaScript Android开发
使用React Native开发跨平台移动应用的技术详解
【5月更文挑战第22天】本文详述了使用React Native开发跨平台移动应用的技术,该框架由Facebook推出,基于JavaScript,支持iOS和Android。React Native通过JNI/JSI实现JavaScript到原生代码的转换,提供高效性能和原生体验。其优势包括跨平台性、原生体验、开发速度及社区支持。开发流程涉及环境搭建、项目创建、编码、调试与测试,以及构建与发布。注意事项包括性能优化、平台适配、利用第三方库和持续学习。React Native为开发者构建高质量跨平台应用提供了便捷途径,未来潜力无限。
|
9月前
|
开发框架 移动开发 前端开发
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
【5月更文挑战第14天】Uniapp和React Native是热门的跨平台移动开发框架。Uniapp以其一套代码多端运行、丰富的组件生态和较低的学习曲线受到青睐,适合快速开发简单应用。React Native基于React,拥有活跃社区和优秀性能,适合复杂应用。React Native在性能上略胜一筹,尤其在需要接近原生体验的场景。Uniapp的官方组件弥补了社区资源不足。选择时需考虑开发效率、性能需求、团队技术栈和社区支持。
2229 1
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
|
9月前
|
移动开发 前端开发 JavaScript
使用React Native进行跨平台移动开发
【5月更文挑战第13天】React Native是Facebook的跨平台移动开发框架,基于JavaScript和React,允许开发者编写原生应用。它提供跨平台性、原生性能、平缓的学习曲线及丰富的社区支持。开发流程包括安装CLI、创建项目、编写代码、运行调试及测试发布。进阶应用涉及状态管理、性能优化、原生模块集成和自动化测试。React Native降低了开发成本,提升了效率,是移动开发的优选方案。