React Native布局之FlexBox

    xiaoxiao2025-10-13  6

    概述

    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 生成相对定位的元素,相对于其正常位置进行定位
    最新回复(0)