都2023了 flex布局还不清楚?一篇文章带你了解flex布局

185 阅读4分钟

前言

作为一名前端工程师,掌握flex布局可以说是十分重要的,不论是在面试还是在日常工作中,我们都会接触到flex布局,最近在工作期间,多次使用了flex布局,所以也想到写一篇关于flex布局的文章,便于日后复习,

一、什么是Flex布局?

Flex 是 Flexible(灵活的) Box 的缩写,又称之为”弹性布局“,用于给盒子模型提供灵活性,可以给任意容器指定为弹性布局

.container {
    display: flex
}

二、Flex布局的基本概念

在我们了解flex布局之前,我们要知道几个名词,分别是:”容器“、”项目“、”主轴“、”交叉轴“;
所谓容器就是指采用flex布局的元素,例如👆🏻的container就是一个容器,那么他下面的所有子元素自动成为容器成员,成为项目
flex布局的容器存在两根轴:主轴与交叉轴,那么这个是要根据flex-direction(布局方向)的设定来确定哪边是主轴,哪边是交叉轴;主轴开始位置叫main start,结束位置叫main end;交叉轴开始位置叫cross start,结束位置叫cross end

WechatIMG674.png 注意:项目默认为行排列,所以横着为主轴,竖着为交叉轴,单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。

三、Flex布局的容器属性

在flex布局中,容器具有如下6种属性

属性1. flex-direction

上文有提到过,flex-direction用来设定主轴的方向(项目的排列方向)

.container {
    flex-direction:row | row-reverse | column | column-reverse
}

其中:

  • row:主轴为水平方向,起点在左端 image.png
  • row-reverse:主轴为水平方向,起点在右端 image.png
  • column:主轴为垂直方向,起点在上沿
  • column-reverse:主轴为水平方向,起点在下沿

image.png

image.png

属性2. flex-wrap

flex-warp是决定该容器是否换行的属性

.container {
    flex-wrap: nowrap | wrap | wrap-reverse
}

其中:

  • nowrap:不换行 image.png 默认不换行,项目宽度设置无效,会自适应变换
  • wrap:换行,第一行在上 image.png 换行宽度正常
  • wrap-reverse:换行,第一行在下 image.png

属性3. flex-flow

flex-flow为上述两种属性的简写形式,默认值为row|nowrap

.container {
    flex-flow: <flex-direction> || <flex-wrap>
}

属性4. justify-content

此属性为项目的对齐方式,与设置的轴方向有关;下面假设轴方向为水平方向 其中:

  • flex-start:左对齐 image.png
  • flex-end:右对齐 image.png
  • center:居中 image.png
  • space-between:两端对齐,项目之间的间隔都相等 image.png
  • space-around:每个项目两侧的间隔相等。 image.png

属性5. aligin-items属性

此属性定义项目在交叉轴上的对齐方式 其中:

  • flex-start:交叉轴的起点对齐 image.png
  • flex-end:交叉轴的终点对齐 image.png
  • center:交叉轴的中点对齐 image.png
  • baseline:项目的第一行文字的基线对齐 image.png 单独设置第一个子容器的padding-top,两个容器没有对齐,设置该属性会让第一个项目向下移动,直到两个项目中文本的基线对齐
  • stretch(默认值):如果项目未设置高度或高度为auto,将沾满整个容器的高度 image.png

通过我在项目中实践,感觉像justify-content比较常用的有center、space-around和space-between;aligin-item比较常用的有center

属性6. align-content

align-content定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用;align-content的作用和align-items一样,均是改变项目在侧轴的位置,常用有以下几个属性

  • flex-start
  • flex-end
  • center
  • space-around
  • space-between

属性与justify-content一致,效果即为align-item效果,其中最后两个略有差异

image.png

image.png

四、Flex布局的项目属性

项目有6种属性分别为:order、flex-grow、flex-shrink、flex-basis、flex、align-self

1. order

order是设置项目的排列顺序,order越小项目排列越靠前

image.png

2.flex-grow

用于决定项目在有剩余空间的情况下是否放大,默认不放大
取值:0(不放大,默认),1(放大)
默认情况

image.png

为item 3加上flex-grow:1

image.png

3.flex-shink

flex-shink定义了项目的缩小比例,默认为1;如果空间不足,项目一起缩小;
取值:0(不缩小),1(缩小)

4.flex-basic

用来设置弹性元素宽度,默认为auto,优先级高于width

.item {
    flex-basis: 100px;
}

image.png

5.flex

flex是上述三种属性的的简写

.item {
    flex: flex-grow | flex-shrink | flex-basis
}

flex:auto => 1 1 auto 等分放大缩小
flex:none => 0 0 auto 不放大不缩小
flex:1 => 1 1 0

6.align-self

其作用为让个别项目拥有与其他项目不同的对齐方式,与align-items的属性完全一致

五、加餐

最近在使用flex布局时突然发现,当项目中的内容为纯数字或者字母时会出现不自动换行的情况

image.png image.png 通过查阅资料,了解到,遇到这种情况我们可以使用css的word-break进行强制换行

WechatIMG675.jpeg

image.png

可以看到当我们加入该属性就可以实现换行需求

总结

本文对flex布局进行了一番介绍,以及在项目中使用遇见的问题的解决方式,希望能够帮助到大家~😄