【CSS】详解flex布局

1,997 阅读6分钟

flex 弹性布局

设置了flex布局的容器称为flex container,该容器内部的元素称为flex item,flex item元素具有以下特点。

  1. flex item不再区分行内级/块级元素的特性,其默认宽高由内容决定,但宽高可以设置。
  2. flex item默认水平排布,但其布局由flex container的属性控制。

flex布局中默认主轴方向从左往右,交叉轴方向从上往下,元素在一维方向上按主轴方向排布,在二维方向上按交叉轴方向排布,flex布局的模型如下图。

image.png

flex-container的属性

flex-direction 主轴方向

该属性作用于flex-container,指定其元素在一维方向上的排布方式,改变主轴方向时,交叉轴方向也会跟着改变,其值和效果如下。

  1. row,默认值,即以行为主轴,如下图。

    image.png

  2. row-reverse,代表与row相反的方向,如下图。

    image.png

  3. column,如下图。

    image.png

  4. column-reverse,与column的方向相反,如下图。

    image.png

flex-wrap 换行

该属性作用于flex-container,默认值为nowrap,不换行,一般需要设置为wrap以换行。

另外有值wrap-reverse(该值很少使用),使主轴转移至盒子的对面边界,原始情况如下图。

image.png

设置了wrap-reserve后如下图。

image.png

flex-flow 简写属性

flex-flow为flex-wrap和flex-direction的缩写属性,写法如:flex-flow:row wrap;

justify-content 主轴对齐方式

justify-content属性作用于flex container,用于改变主轴的对齐方式(注意,他不改变元素的排列方式,仅仅改变对齐方式,类似于word中的对齐方式)。其值和效果如下。

  1. flex-start:默认值,代表元素与main start对齐。如下图。

    image.png

  2. flex-end:元素与main end对齐。如下图。

    image.png

  3. center:元素与main center对齐,即居中对齐。如下图。

    image.png

  4. space-between:元素与main start和main end对齐,并且元素之间间距等分。如下图。

    image.png

  5. space-evenly:元素之间间距等分,且等于首尾元素与main start和main end的间距。如下图。

    image.png

  6. space-around:元素之间间距等分,且等于首尾元素与main start和main end的间距的两倍。如下图。

    image.png

使用justify-content会遇到的问题

在多行排列时,若使用justify-content,比如为容器设置值为space-between,那么在当容器内最后一行的元素个数没法占满整一行的时候,期望效果如下。

image.png

但是实际效果如下。

image.png

此时有多种方式可以解决,一是放弃使用justify-content改为计算margin;这里着重介绍第二种方法,就是在容器最后添加列数-1个和其他子元素同等宽度的子元素,如下。

<style>
    .content> .last-line{
      width: 60px; //这里的宽度需要设置跟item一样
    }
</style><div class="content">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
    <div class="item">4</div>
    <div class="item">5</div>
    <span class="last-line"></span> //个数为列数-1
</div>

但是这里有一个缺点,就是在html中引入了其他元素。

align-items 交叉轴对齐方式

ustify-content属性作用于flex container,用于改变交叉轴的对齐方式(注意,他不改变元素的排列方式,仅仅改变对齐方式)。在进行理解时要将所有元素其看成一个整体,其值和效果如下。

  1. normal:默认值,效果等同stretch。

  2. flex-start:和cross start对齐。如下图。

    image.png

  3. flex-end:和cross end对齐。如下图。

    image.png

  4. center:最常用的值,代表元素和cross center对齐。如下图。

    image.png

  5. stretch:如果flex item元素没有高度,则它会被拉伸,否则设置该属性无效。如下图。

    image.png

  6. baseline:基线对齐。如下图。

    image.png

align-content 多行元素在交叉轴上的对齐方式

该属性用于设置多行元素在交叉轴上的对齐方式,用法和justify-content类似。在进行理解时,要将一行元素看成一个小部分进行理解。该属性较少使用,仅在设置了高度值的容器时需要考虑。其值和效果如下。

  1. strech:默认值,如果flex item元素没有高度,则它会被拉伸,否则设置该属性无效。如下图。

    image.png

    在设置了高度时,默认情况下,多行元素之间按照一定的底部间距排布,如下图。

    image.png

  2. flex-start:多行元素和corss start对齐。如下图。

    image.png

  3. flex-end:多行元素和corss end对齐。如下图。

    image.png

  4. center:和cross center对齐。如下图。

    image.png

  5. space-between:多行元素与cross start和cross end对齐,并且多行元素之间间距等分。如下图。

    image.png

  6. space-evenly(兼容性差):多行元素之间间距等分,且等于首尾行元素与cross start和cross end的间距。如下图。

    image.png

  7. space-around::多行元素之间间距等分,且等于首尾行元素与cross start和cross end的间距的两倍。如下图。

    image.png

flex-items的属性

align-slef 元素交叉轴对齐方式

align-self用于设置单个元素在交叉轴上的对齐方式,目的是为了使特别的单个元素在交叉轴上与其他元素排布方式不一样。默认值为auto,遵循父元素flex container的对齐方式。其余值和效果如下。

  1. flex-start:使得元素与cross start对齐。

  2. center:使得元素与cross center对齐,如下图。

    image.png

  3. flex-end:使得元素与cross end对齐。

  4. baseline:基线对齐。

flex-grow 拉伸

flex-grow用于在main轴上拉伸元素。默认情况下,元素的flex-grow值为0,不拉伸,如下图(三个元素等宽)。

image.png

为元素1设置flex-grow值为1后,如下图。

image.png

为所有元素设置相同的flex-grow值后,各个元素会平分剩余的空间,如下图。

image.png

各个元素的flex-grow值不同,则会分到相应不同比例的空间,如为元素1设置flex-grow为1,元素2设置flex-frow为2,则有如下图效果。

image.png

注意,元素的拉伸上限取决于元素的max-width属性,比如下面单独给元素1设置max-width:90,同时仅为元素1设置flex-grow属性,那么它会拉伸但是无法超过90宽度,如下图。

image.png

flex-shrink 收缩

flex-grow用于在main轴上收缩元素,flex-shrink的默认值为1,但是仅在main轴上所有元素的宽度超过main轴上container的长度才生效,如下图。

image.png

如果设置flex-shrink为0,代表不收缩,如下图(此时为不设置flex-wrap的情况)。

image.png

此时设置元素1、元素2和元素3的flex-shrink分别为1、2和3后,如下图。

image.png

注意,元素的收缩上限取决于元素的min-width属性,这个道理同上一属性flex-grow所述。

flex 缩写属性

格式如下:

[ <flex-grow> || <flex-shrink> || <flex-basis> ] | none | auto

示例:

flex:1代表flex-grow为1

flex:1 1代表flex-grow和flex-shrink为1

flex:1 1 100px代表flex-grow为1、flex-shrink为1、flex-basis为100px