flex简单教程

基本概念

采用 Flex 布局的元素,称为 Flex 容器(flex container),简称"容器"。它的所有子元素自动成为容器成员,称为 Flex 项目

默认地,父容器主轴是X轴从左向右,侧轴为y轴由上下向。

同样的叫法:行和列

英文:row 和 column

父容器属性

flex-direction:设置主轴方向

justify-content:设置主轴上的子元素排列方向

flex-warp:设置子元素是否换行

align-content:设置侧轴上的子元素的排列方式(多行)

align-items:设置侧轴上的子元素排列方式(单行)

flex-flow:复合属性,相当于同时设置了 flex-direction & flex-wrap

flex-direction

主轴和侧轴是会变的,就看flex-direction 设置谁为主轴,剩下的就是主轴

而我们的元素是跟着主轴来排列的

属性值

属性值 说明
row 默认从左向右
row-reverse 从右到左
column 从上到下
column-reverse 从下到上

感觉非常像Android中的LinearLayout,不过andorid中的功能没有这么强大,只有竖向排列和横向排列,没有反转

Andorid中叫oritation,而flex中叫flex-direction

justify-content

设置主轴上的子元素排列方向,使用此属性时,先确定现在谁是主轴

感觉这个设计不太好,不像Android中的RelativeLayout,子组件往哪儿跑可以让子组件自己来定义,是不是子组件也可以自己设置呢?现在还不知道。不过现在我们看,这个设计不太好

属性值 说明
flex-start 默认值从头部开始,如果主轴是x,则从左到右(ABCD )
flex-end 从尾开始排列 ( ABCD)
center 在主轴居中对齐(如主轴是x,则居中对齐)( ABCD )
space-around 平分剩余空间( A B C D )
space-between 先两边贴边,再平分剩余空间(重要)(A B C D)

像下边的形式

形式1
-----------------
组件   组件    组件

形式2
--------------------
组件 组件 组件 组件 组件

flex-warp

在div默认的情况下,子元素过多,子元素会跑到第二行,再显示。但是:

flex容器有一个问题,如果子元素过多,会压缩我们的子元素,强制让其在主轴上显示,如果过多,可能全都变成了一条线,如下:

我们要显示这样的

我们的空间是这么大

( )

我们想要放下26个字母,flex容器默认会强力压缩我们的空间,变成了这样

(|||||)

如果想要让其像div一样自动换行,就需要用到flex-wrap

(ABCDE

FGHIJK
LMNO
P…YZ)

.box{
  display:flex;
    flex-direction:row;//默认
  flex-warp:wrap;//自动换行(no-warp:默认)
}

align-items

设置侧轴上的子元素排列方式(单行)

我们上边通过 justify-content 实现了水平,或者垂直居中,如果想要水平/垂直居中,怎么来做呢?下边的属性值是以x为主轴,y为侧轴说明的。

属性值 说明
flex-start 从左到右
flex-end 从下到上
center 挤在一起(垂直居中)
stretch 拉伸(默认)

所以前边说的垂直水平居中,我们就有想法了

如果当前主轴是x轴(默认),我们通过justify-content设置水平居中,我们再设置侧轴居中,那就是垂直居中了。这样就达到了垂直水平居中的效果。

.box{
  display:flex;
  justify-content:center;
  align-items:center;
}
/** 上面的代码:先让主轴居中,再让侧轴居中,就实现了水平垂直居中效果 */

stretch 不给侧轴方向的尺寸话,会填满侧轴的方向

align-content

上边我们说的的align-item,是单行,如果是多个,有换行的情况下,就需要使用此属性

比如九宫格

单行无效,即添加了flex-warp:wrap;的情况下才有效。

属性值 说明
flex-start 默认值从头部开始,如果主轴是x,则从左到右(ABCD )
flex-end 从尾开始排列 ( ABCD)
center 在主轴居中对齐(如主轴是x,则居中对齐)( ABCD )
space-around 平分剩余空间( A B C D )
space-between 先两边贴边,再平分剩余空间(重要)(A B C D)
stretch 设置子项元素高度平分父元素高度
总结!!!

单行,多行用flex-warp,默认是单行。

侧轴位置(居中,居尾),单行找align-items,多行找align-content

flex-flow

它是flex-direction和flex-warp属性的复合属性

.box{
    display:flex;
  /*
  flex-direction:column;
  flex-wrap:warp;
  可以合写成下面的形式
  */
  flex-flow:column warp;
}

子项常用属性

flex:定义子项目占的份数

align-self:控制子项自己在侧轴的排列方式(可以脱离父容器的排列限制,自己控制)

order:定义子项的排列顺序(前后顺序)

flex

定义子项目分配剩余空间,用flex来表示占多少(份数)

例1:

我们app里,头部的搜索栏,如下

---------------------------------
菜单(         输入商品         )搜索
---------------------------------

上面展示了我们常用的一种头部的布局,在ios或者android中我们也很好实现,但是在flex中,我们也非常简单,如下:

<section>
    <div>菜单</div>
  <div>输入商品</div>
  <div>搜索</div>
<section>
<style>
section{
    display:flex;
  width:100%;
  height:50px;
  background-color:#ffffff;
  margin:0 auto;
}
  section div:nth-child(1){
    width:50px;
    height:100%;
       background-color:red;
  }
  section div:nth-child(2){
    flex:1;/** 剩余空间份数 */
    width:50px;
    height:100%;
       background-color:green;
  }
  section div:nth-child(3){
    width:50px;
    height:100%;
       background-color:red;
  }

</style>

例2:

等分,我们之前用的是百分比,我们也可以使用子元素的flex等分来做,如下图

(ABC)

上代码:

<p>
    <span>1</span>
  <span>2</span>
  <span>3</span>
</p>
<style>
  p{
    display:flex;
    width:100%;
    height:50px;
    background-color:#ffffff;
    margin:0 auto;
  }
  p span{
    flex:1;
  }
  /**
  这样太简单了吧,只需要让子元素的flex为1,就能让子元素均分
  类似于android LinerLayout中子元素设置layout-weight属性。
  */
  /**
  如果我们想要让某个子元素大一些,我们只需要把份数增加即可
  p span:nth-child(2){
    flex:2;
  }
  这样的话,中间的就会显示为2 份,边上占1份。
  */

</style>

align-self

让某个子元素,在侧轴上单独定义位置,脱离组织

div span:nth-child(3){
    align-self:flex-end;
}

order

设置子元素本身的顺序

div span:nth-child(3){
    order:-1;/** 往前跑了一个位置,默认是0*/
}

暂无评论

相关推荐

js判断正整数

我使用下边的方法判断正整数,目前使用OK没问题 let pernum = xxx if (!(/(^[1-9]\d*$)/.test(pernum))) { //到这里说 …

js slice方法截取数组

slice(x1,x2)x1:开始坐标,包含此坐标数据;x2:结束坐标,不包含此位置数据x2可以大于数组长度不会报错,大于数组长度 …

微信扫一扫,分享到朋友圈

flex简单教程