Flex 布局
概念
- flexible box:弹性盒状布局
- 容器控制内部元素的布局定位
- CSS3 引入的新布局模型
- 伸缩元素,自由填充,自适应
优势
- 可在不同方向排列元素
- 控制元素排序的方向
- 控制元素的对齐方式
- 控制元素之间等距
- 控制单个元素放大与缩放比例、占比、对齐方式
常用术语
- flex containter : flex 容器
- flex item : flex 项目(元素)
- flex direction : 布局方向(主轴方向)
模型
容器的属性
flex-direction : 设置元素的排列方向(设置主轴)
- row(从左向右)
- row-reverse(从右向左)
- column(从上到下)
- column-reverse(从下到上)
flex-wrap : 使容器内的元素换行
- nowrap(不换行,会缩放)
- wrap(若超过则会到第二行进行排列,不会缩放)
- wrap-reverse(逆向换行,同样不会缩放)
flex-flow : flex-direction 和 flex-wrap 属性的简写,且默认值为 row nowrap
flex-flow:<'flex-direction'>||<'flex-wrap'>
justify-content : 设置元素在主轴上的对齐方式
- flex-start(左对齐)
- flex-end(右对齐)
- center(居中对齐)
- space-between(两端对齐,空白均匀填充到 flex 成员之间)
- space-around(元素两边平均等分剩余空白部分,空白间隙拼接)
- space-evenly(项目均匀分布,空白间隙相等)
align-items : 设置元素在交叉轴上的对齐方式
- flex-start(项目按照交叉轴起点对齐)
- flex-end(项目按照交叉轴终点线对齐)
- center(交叉轴方向项目中间对齐)
- baseline(交叉轴方向按第一行文字基线对齐)
- stretch(交叉轴方向,拉伸显示,拉伸显示)
align-content : 定义了在交叉轴方向的对齐方式以及额外空间分配,类似于主轴上的 justify-content 作用
- stretch(拉伸显示)
- flex-start(从启点线开始顺序排列)
- flex-end(相对终点线顺序排列)
- center(居中排列)
- space-between(项目均匀分布,第一项在启点线,最后一项在终点线)
- space-around(项目均匀分布,每一个项目两侧有相同的留白空间,相邻项目之间的距离是两个项目之间的留白和)
order : 默认情况下,flex 项目是按照在代码中出现的先后顺序排列的,但是 order 属性可以控制项目在容器中的先后顺序
- order:integer;
- (默认为 0,值按从小到大顺序排列,可以为负值)
flex-grow : 定义项目的放大比例,其值是一个单位的正整数,表示放大的比例。默认为 0,如果存在额外空间,不放大,负值无效。如果所有项目的 flex-grow 属性都是 1,则他们等分剩余的空间。如果一个项目的 flex-grow 属性为 2,其他项目都是 1,那么前者所拥有的剩余空间比其他的多一倍
- flex-grow:number;(默认为 0)
flex-shrink : 定义了项目的缩小比例,默认为 1,如果空间不足,该项目将缩小。0 表示不缩小,负值无效
- flex-shrink:number;(默认为 1)
flex-basis : 定义项目在分配额外空间之前的默认尺寸,属性值可以是长度或者关键字 auto,默认值为 auto,即项目本来大小
- flex-basis:length|auto;(默认值为 auto)
flex : 属性 flex-grow,flex-shrink 和 flex-basis 的简写,默认值为 0 1 auto,后两个是可选属性
.item {
flex: none | [< "flex-grow" >< "flex-shrink" >||< "flex-basis" >];
}
/*一般推荐使用这种简写方式,而不是分别定义每一种属性*/
align-self : 定义项目的对齐方式,可以覆盖 align-items 属性,默认值为 auto,表示继承父元素的 align-items 属性,如果没有父元素,就与 stretch 相同
- auto
- flex-start
- flex-end
- center
- baseline
- stretch
flex-direction 的栗子
<template>
<!-- 定义flex轴线 -->
<view class="container">
<view class="green txt"> A </view>
<view class="red txt"> B </view>
<view class="blue txt"> C </view>
</view>
</template>
<style>
.container{
/* 定义flex容器 */
display: flex;
/* 设置容器内部元素的排列方向 */
flex-direction: row;
/* flex-direction: row-reverse; */
/* flex-direction: column; */
/* flex-direction: column-reverse; */
}
.txt{
font-size: 20px;
width: 150upx;
height: 150upx;
}
.green{
background-color: #008000;
}
.red{
background-color: #ff0000;
}
.blue{
background-color: #007AFF;
}
</style>
flex-direction: row 效果图:
更改样式:
<style > .container {
/* 定义flex容器 */
display: flex;
/* 设置容器内部元素的排列方向 */
/* flex-direction: row; */
flex-direction: row-reverse;
/* flex-direction: column; */
/* flex-direction: column-reverse; */
}
... </style >;
flex-direction: row-reverse 效果图
更改样式:
<style > .container {
/* 定义flex容器 */
display: flex;
/* 设置容器内部元素的排列方向 */
/* flex-direction: row; */
/*flex-direction: row-reverse;*/
flex-direction: column;
/* flex-direction: column-reverse; */
}
... </style >;
flex-direction: column 效果图
更改样式:
<style > .container {
/* 定义flex容器 */
display: flex;
/* 设置容器内部元素的排列方向 */
/* flex-direction: row; */
/*flex-direction: row-reverse;*/
/* flex-direction: column; */
flex-direction: column-reverse;
}
... </style >;
flex-direction: column-reverse 效果图