说一下你对flex(弹性)布局的理解

1,817 阅读5分钟

当面试官问道:“ 说一下你对flex(弹性)布局的理解 ”,首先你心中得有个概念,按照怎样的顺序回答这个问题。

严重提示: 某些单词一定要读对了,下文部分单词做了音标注释和链接,不会的点进去听一下发音

一、概念

flex 布局是 flexible box 的缩写 ,意思为 弹性布局 ,用来为盒状模型提供最大的灵活性。
任何一个容器都可以指定为弹性布局。

二、轴线(重点)

容器默认存在两条轴线,即 主轴(main axis)交叉轴(cross axis)

⚠️ 在这里要严正声明一点,好多文章中说是水平的主轴和垂直的交叉轴,这样有点误人子弟了吧!!!(重要的问题叹三遍) 主轴的轴线方向是由 flex-direction 决定的,可简单的理解为 x(row)y(column) 两个方向,交叉轴是垂直于主轴方向的轴线。所以各位待面试的同学,一定不要被误导,就是主轴和交叉轴!!!(重要的问题叹三遍)

主轴

  1. flex-direction 设成 row 或 row-reverse,你的主轴将沿着 x轴 方向延伸。主轴为row或者row-reverse时
  2. flex-direction 设成 column 或 column-reverse 时,你的主轴会沿着 y轴 方向排列。主轴为column或者column-reverse时

交叉轴

  1. flex-direction 设成 row 或 row-reverse 的话,交叉轴就是垂直方向。主轴为row或者row-reverse时
  2. flex-direction 设成 column 或者 column-reverse,交叉轴就是水平方向。主轴为column或者column-reverse时

三、属性

可以从两个维度解释:一种是按照 轴线 的维度解释,另一种是按照 容器和项目 的维度解释。但这里还是建议同学们按照 容器和项目 的维度解释,这样更容易表达。

容器的6个属性

flex-direction

flex-direction 决定主轴的方向(即项目的排列方向),默认值为:row 。它有以下四种可选值:

flex-direction: row; // (默认值) 主轴水平方向,从左往右
flex-direction: row-reverse; // 主轴水平方向的逆方向,从右往左
flex-direction: column; // 主轴为垂直方向,从上往下
flex-direction: column-reverse; // 主轴为垂直方向的逆方向,从下往上
flex-wrap(wrap读音:ræp

flex-wrap 定义了容器内的项目沿轴线布局时是否换行,默认值为:nowrap 。它有以下三种可选值:

flex-wrap: nowrap; // (默认值)不换行,强制一行展示
flex-wrap: wrap; // 换行,多余的行会正常文档流折行显示
flex-wrap: wrap-reverse; // 反向换行,多余的行会逆文档流方向折行显示
flex-flow

flex-flowflex-directionflex-wrap 属性的组合简写:

flex-flow: row nowrap; // (默认值)
align-items(align发音:əˈlaɪn

align-items 属性可以使元素在交叉轴方向对齐。默认值为:stretch 。它有以下5个可选值:

align-items: stretch;// (默认值)如果项目未设置高度或设为auto,将占满整个容器的高度。
align-items: baseline;// 项目的第一行文字的基线对齐。
align-items: flex-start;// 交叉轴的起点对齐。
align-items: center;// 交叉轴的中点对齐。
align-items: flex-end;// 交叉轴的终点对齐。
justify-content(justify发音:ˈdʒʌstɪfaɪ

justify-content 定义了项目在主轴上的对齐方式,默认值为:flex-start 。它有以下5个可选值:

justify-content: flex-start;// (默认值)从行首起始位置开始排列。
justify-content: center;// 居中排列。
justify-content: flex-end;// 从行尾位置开始排列。
justify-content: space-around;// 均匀排列每个元素,每个元素周围分配相同的空间。
justify-content: space-between;// 均匀排列每个元素,首个元素放置于起点,末尾元素放置于终点。
align-content

align-content 定义多个项目多根轴线的对齐方式,只有一个轴线时没有作用,默认值为:stretch 。它有以下5个可选值:

align-content: stretch; // (默认值)轴线占满整个交叉轴。
align-content: flex-start; // 与交叉轴的起点对齐。
align-content: center:// 与交叉轴的中点对齐。
align-content: flex-end:// 与交叉轴的终点对齐。
align-content: space-between:// 与交叉轴两端对齐,轴线之间的间隔平均分布。
align-content: space-around:// 每根轴线两侧的间隔都相等。轴线之间的间隔比轴线与边框的间隔大一倍。

项目的6个属性

order

order 决定项目在主轴方向上的排列顺序,数值越小。排列越靠前。

flex-basis(basis发音:ˈbeɪsɪs

flex-basis 决定了在分配额外空间之前,成员占据的空间,默认值为 auto

注意:  当一个元素同时被设置了 flex-basis (除值为 auto 外) 和 width (或者在 flex-direction: column 情况下设置了height) , flex-basis 具有更高的优先级.

flex-grow

flex-grow 决定了对剩余空间的占据量,只有在空间有冗余的时候这一属性才有用。默认值是 0,意思就是即使有多余空间,它也占据。如果给多个成员设置正值,那么他们会根据正值所占的比例的大小分配剩余空间。

flex-shrink(shrink发音:ʃrɪŋk

flex-shrink 只有在没有额外空间时起作用,意思是没有额外空间时,成员贡献出空间的大小。默认值为 1,如果为 0 意思是不贡献空间,也就是说即使空间不足,成员大小也不发生改变。

flex

flex 决定了弹性项目如何增大或缩小以适应其弹性容器中可用的空间。是 flex-growflex-shrinkflex-basis 组合简写,默认值为:0 1 auto 。它还有一下2个可选值:

flex: auto;  // 等同于 flex: 1 1 auto; 意思就是占满额外空间,可缩放。
flex: none;  // 等同于flex: 0 0 auto;  意思是不占额外空间,不可缩放。

align-self

align-self 决定了项目在容器中的对齐方式,并且会覆盖容器已有的 align-items的值。

注意: align-self 属性不适用于块类型的盒模型和表格单元。如果任何项目的侧轴方向 margin 值设置为 auto,则会忽略 align-self


总结

面试过程中要抓住面试官问题的重点回答,言简意赅,毕竟时间有限,虽然上文啰啰嗦嗦写了很多,但是千万不要赘述,能提炼的就提炼!

建议: 概念 -> 轴线 -> 属性 这个顺序回答。

如果其他小伙伴有不同见解,欢迎评论区留言讨论。