FlexBox 布局基本用法
1、什么是FlexBox
Flexbox是
Flexible Box
的缩写,意为'弹性布局',它为盒状模型提供了很大的灵活性,让任何一个容器都可以指定为Flex布局任何一个容器都可以指定为Flex布局
2、基本概念和属性
使用Flex布局的元素,称为Flex容器(flex Container),简称'容器'。它的所有子元素自动成为容器的成员,称为Flex项目(flex Item)
先了解下标准的盒子模型:
下面主要讲解Flex的Container
属性 和 Item
属性
下面给出一张FlexBox布局的示例图:
从上面的示例图中可以看出,Flex容器默认存在两根轴:水平方向的主轴(main axis),与主轴垂直方向的交叉轴(cross axis)。主轴的排布方向是从左至右,交叉轴的排布方向是从上至下,Flex容器中的Item元素默认是按照主轴方向进行排序,Item占据主轴空间称为main size
,Item占据交叉轴空间称为cross size
注意:
本篇FlexBox基本使用教程主要是针对
web
端布局进行讲解的,React Native
开发中使用的FlexBox布局和web端用法基本上一致,但是还是有些差异性,主要差异大致分为如下几点,后面的属性讲解中对于React Native
和web
端的差异,主要的差异会通过小括号
单独的注释说明
- 属性名不同:在
web
端多个单词之间是以中划线连接(例如:flex-direction),在React Native
中是以驼峰命名(flexDirection) - 默认值不同:例如在
web
端默认主轴方向为横向(flex-direction: column),在React Native
中默认的主轴方向为竖直方向(flexDirection: row) - 有些FlexBox的属性在
web
端是生效的,但是在React Native
中不生效的,例如:(flex-flow )
3、Flex容器(Container)属性
容器属性主要有下列6个:
- flex-direction(在RN中属性名称为:flexDirection)
- flex-wrap(在RN中属性名称为:flexWrap)
- flex-flow(RN中暂时用不到此属性)
- justify-content(在RN中属性名称为:justifyContent)
- align-items(在RN中属性名称为:alignItems)
- align-content(在RN中暂时用不到此属性)
下面我们分别来讲解这6个容器属性的使用方式和作用
3.1 flex-direction
flex-direction
作用:用来决定容器的主轴方向
.box {
flex-direction: row | row-reverse | column | column-reverse;
}
flex-direction
属性有四个取值:
- row:主轴为水平方向,起点在左端
- row-reverse:主轴为水平方向,起点在右端
- column:主轴为竖直方向,起点在上沿
- column-reverse:主轴为竖直方向,起点在下沿
注意:在React Native
中,当没有设置容器的主轴方向时,默认容器主轴方向为:flex-direction: column
,也就是说,当我们的容器的主轴的排布方向为竖直方向时,这时我们可以省略不写flex-direction
属性
3.2 flex-wrap
默认情况下,容器中的Item元素都排列在一条轴线上,flex-wrap属性定义了如果在一条轴线上排列不下所有的Item元素,可以进行换行排列
.box{
flex-wrap: nowrap | wrap | wrap-reverse;
}
flex-wrap
属性有三个取值:
- nowrap(默认值):不换行
- wrap:换行,第一行在上方
- wrap-reverse:换行,第一行在下方
3.3 flex-flow
flex-flow
属性是flex-direction
属性和flex-wrap
属性的简写形式,默认值为row nowrap
.box {
flex-flow: <flex-direction> || <flex-wrap>;
}
3.4 justify-content
justify-content
属性定义了Item在主轴方向上的对齐方式
.box {
justify-content: flex-start | flex-end | center | space-between | space-around;
}
justify-content
属性有5个取值,具体对齐方式与轴的方向有关。下面假设主轴方向为从左到右
- flex-start(默认值):左对齐
- flex-end:右对齐
- center:居中
- space-between:两端对齐,Item之间的间隔都相等
- space-around:每个Item两侧的间隔相等。Item之间的间隔比Item与边框的间隔大一倍
3.5 align-items
align-items
属性定义Item在交叉轴上的对齐方式
.box {
align-items: flex-start | flex-end | center | baseline | stretch;
}
align-items
属性有5个取值,具体的对齐方式与交叉轴的方向有关,下面假设交叉轴方向从上到下
- flex-start:(默认值)交叉轴的起点对齐
- flex-end:交叉轴的终点对齐
- center:交叉轴的中点对齐
- baseline: 项目的第一行文字的基线对齐
- stretch:如果项目未设置高度或设为auto,将占满整个容器的高度
3.6 align-content
align-content
属性定义了多根轴线的对齐方式,如果项目只有一根轴线,该属性不起作用
.box {
align-content: flex-start | flex-end | center | space-between | space-around | stretch;
}
align-content
属性有6个取值
- flex-start:(默认值)与交叉轴的起点对齐
- flex-end:与交叉轴的终点对齐
- center:与交叉轴的中点对齐
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布
- space-around:每根轴线两侧的间隔都相等,轴线之间的间隔比轴线与边框的间隔大一倍
- stretch:轴线占满整个交叉轴
4、项目(Item)属性
Flex容器中的Item元素有以下6个属性
- order(RN中不生效)
- flex-grow(RN中不生效)
- flex-shrink(RN中不生效)
- flex-basis(RN中不生效)
- flex(RN中使用
flex: 1
:当只有一个元素使用flex:1 则这个元素将充满整个屏幕,当有多个元素使用flex: 1 则这多个元素平分屏幕空间大小) - align-self
4.1 order
order
属性定义了Item的排列顺序,数值越小,排列越靠前,默认为0
.item {
order: <integer>;
}
4.2 flex-grow
flex-grow
属性定义了Item的放大比例,默认为0,即如果存在剩余空间,也不放大
.item {
flex-grow: <number>; /* default 0 */
}
如果所有Item的flex-grow
属性都为1,则它们将等分剩余空间(如果有的话),如果一个Item的flex-grow
属性为2,其他Item都为1,则前者占据的剩余空间将比其他Item多一倍
4.3 flex-shrink
flex-shrink
属性定义了Item的缩小比例,默认为1,即如果空间不足,该Item将缩小
.item {
flex-shrink: <number>; /* default 1 */
}
如果所有Item的flex-shrink属性都为1,当空间不足时,都将等比例缩小,如果一个Item的flex-shrink属性为0,其他Item都为1,则空间不足时,前者不缩小。负值对该属性无效
4.4 flex-basis
flex-basis
属性定义了在分配多余空间之前,Item占据的主轴空间(main size),浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即Item的本来大小
.item {
flex-basis: <length> | auto; /* default auto */
}
它可以设为跟width或height属性一样的值(比如350px),则Item将占据固定空间
4.5 flex
flex
属性是flex-grow
,flex-shrink
和 flex-basis
的简写,默认值为0 1 auto。后两个属性可选
.item {
flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值
4. 6 align-self
align-self
属性允许单个Item有与其他Item不一样的对齐方式,可覆盖align-items的属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
.item {
align-self: auto | flex-start | flex-end | center | baseline | stretch;
}
align-self
属性有6个取值,除了增加一个auto属性,其他都与align-items
属性完全一致,具体的对齐方式与交叉轴的方向有关,下面假设交叉轴方向从上到下
- flex-start:(默认值)交叉轴的起点对齐
- flex-end:交叉轴的终点对齐
- center:交叉轴的中点对齐
- baseline: 项目的第一行文字的基线对齐
- stretch:如果项目未设置高度或设为auto,将占满整个容器的高度
- auto
FlexBox布局在React Native开发中的使用
在React Native开发中最多用到的FlexBox布局中的属性如下:
- flex
- flexDirection
- justifyContent
- alignItems
- alignSelf
- flexWrap