flex布局

认识flex布局

  • 两个重要的概念
    • 开启了flex布局的元素叫flex container
    • flex container里面的直接子元素叫做flex items
  • 设置display属性为flex或者inline-flex可以成为flex container
    • flex:flex container 以block-level形式存在
    • inline-flex:flex container以inline-level形式存在
  • 设置flex布局之后,子元素的float、clear、vertical-align的属性将会失效

flex布局模型

模型图解

默认存在两条轴:水平主轴(main axis)和垂直的交叉轴(cross axis)

在容器中的每个单元块被称为flex item,每个项目占据的主轴空间为(main size),占据的交叉轴空间为(cross size)

flex相关的属性

应用在flex container上的CSS属性

  • flex-direction:决定主轴的方向(即项目的排列方向)

    • row:默认值,主轴为水平方向,起点在左端——1 2 3
    • row-reverse:主轴为水平方向,起点在右端——3 2 1
    • column:主轴为垂直方向,起点在上沿
    • column-reverse:主轴为垂直方向,起点在下沿
  • flex-wrap:决定容器内项目是否可换行

    • nowrap:默认值,不换行,当主轴尺寸固定时,当空间不足时,项目尺寸会随之调整而不会挤到下一行
    • wrap:项目主轴总尺寸超出容器时换行,第一行在上方 1 2 3 /4 5
    • wrap-reverse:换行,第一行在下方 4 5/1 2 3
  • flex-flow:flex-direction和flex-wrap的简写形式,默认值为row nowrap,分开写可以忽略这个属性

  • justify-content:定义了项目在主轴的对齐方式

    • 默认值:flex-start 左对齐
    • flex-end:右对齐
    • center:居中
    • space-between:两端对齐,项目之间的间隔相等,即剩余空间等分成间隙
    • space-around:每个项目两侧的间隔相等
  • align-items:定义了项目在交叉轴上的对齐方式

    • 默认值:stretch 即如果项目未设置高度或者设为auto,将占满整个容器的高度

      stretch

    • flex-start:交叉轴的起点对齐

      flex-start

    • flex-end:交叉轴的终点对齐

      flex-end

    • center:交叉轴的中点对齐

      center

    • baseline:项目的第一行文字的基线对齐(以文字的底部为主)

      baseline

  • align-content :定义了多根轴线的对齐方式,如果项目只有一根轴线,那么该属性不起作用

    • 当flex-wrap设置为nowrap时,仅有一条轴线,不会换行,不起作用

    • 当flex-wrap设置为wrap时,容器可能出现多条轴线,这时需要设置它们的对齐方式

      • 默认值:stretch,三条轴线平分水平容器的垂直方向上的空间

        stretch

      • flex-start:轴线全部在交叉轴的起点对齐

        flex-start

      • flex-end:轴线全部在交叉轴的终点对齐

        flex-end

      • center:轴线全部在交叉轴的中间对齐

        center

      • space-between:轴线两端对齐,之间的间隔相等,即剩余空间等分成间隙

        space-between

      • space-around:每个轴线两侧的间隔相等

        space-around

flex项目属性

有六种属性可运用在item项目上:

  • order:定义项目在容器中的排序顺序,数值越小,排列越靠前,默认值为0

    order

  • flex-basis:定义了在分配多余空间之前,项目占据的主轴空间,浏览器根据这个属性,计算主轴是否有多余空间

    • 默认值:auto,即项目本来的大小,这时候item的宽高取决于width或height的值
    • 当主轴为水平方向的时候,当设置了flex-basis,项目的宽度设置值会失效,flex-basis需要跟flex-grow和flex-shrink配合使用才能发挥效果
    • 决定flex-items最终base size的因素,优先级高到低:
      • max-width\max-height\min-width\min-height
      • flex-basis
      • width\height
      • 内容本身的size
  • flex-grow:定义项目的放大比例

    • 默认值:0,如果存在剩余空间,也不放大
    • 否则按所占份数进行分配
    • 如果所有项目以flex-basis的值排列完后发现空间不够了,且flex-wrap:nowrap,此时flex-grow不起作用
  • flex-shrink:定义了项目的缩小比例

    • 默认值:1,即如果空间不足,该项目将缩小,负值对该属性无效
    • 如果所有项目的 flex-shrink 属性都为 1,当空间不足时,都将等比例缩小
    • 如果一个项目的 flex-shrink 属性为 0,其他项目都为 1,则空间不足时,前者不缩小
  • flex:flex-grow,flex-shrink和flex-basis的简写

    • <flex-grow><flex-shrink><flex-basis>,默认是0 1 auto
    • 单值语法:值必须为以下其中之一
      • 一个无单位数:会被当做flex-grow值
      • 一个有效的宽度(width)值:他会被当作flex-basis值
      • 关键字none,auto或initial
    • 双值语法:第一个值必须是一个无单位数,并且它会被当做flex-grow值
      • 第二个值必须为以下之一:
        • 一个无单位数:会被当做flex-shrink值
        • 一个有效的宽度值:会被当做flex-basis值
    • 三值语法:
      • 第一个值必须为一个无单位数,并且它会被当做flex-grow值
      • 第二个值必须为一个无单位数,会被当做flex-shrink值
      • 第三个值必须为一个有效的宽度值,会被当做flex-basis值
  • align-self:允许单个项目有与其他项目不一样的对齐方式

    • 单个项目覆盖align-items定义的属性

      1
      2
      3
      .item{
      align-self:auto|flex-start|flex-end|center|baseline|stretch
      }

      示例

flex练习游戏

Flexbox Froggy - A game for learning CSS flexbox


flex布局
https://blog-theta-ten.vercel.app/2021/07/20/flex布局/
作者
Chen
发布于
2021年7月20日
许可协议