flex 布局

270 阅读7分钟

目录

1、认识 flex 布局

2、flex 布局模型

3、flex 相关属性

4、flex container 相关属性

5、flex items 相关属性


1、认识 flex 布局

flex 布局(Flexible 布局,弹性布局,弹性盒子),是CSS3的一种新布局模式。flex 布局是目前 web 开发中使用最多的布局方案,目前在移动端用的最多,PC端也使用越来越多了。在认识 flex 布局之前,首先明确两个重要的概念:

(1)开启了 flex 布局的元素叫 flex container,flex container 里面的直接子元素叫做 flex items。

(2)通过设置 display 属性为 flex 或者 inline-flex 可以成为 flex container,display 属性的属性值为 flex 下的 flex container 以 block-level (块元素) 形式存在,display 属性的属性值 inline-flex 下的 flex container 以 inline-level (行内元素) 形式存在。

<div style="display:flex/inline-flex"> <!--设置display属性为flex或者inline-flex 开启flex布局-->
    <div></div>            <!--设置display属性为flex或者inline-flex 可以成为flex container-->
    <div></div>
    <div></div>
</div>

2、flex 布局模型

3、flex 相关属性

应用在 flex container 上的CSS属性应用在 flex items 上的CSS 属性
flex-direction设置flex items的排列方向order决定 flex items 的排布顺序
justify-content设置flex items在主轴的对齐方式align-self覆盖 flex container 设置的 align-items
align-items设置flex items在交叉轴的对齐方式flex-grow决定 flex items 如何扩展
flex-wrap决定 flex items 是单行还是多行显示flex-shrink决定 flex items 如何收缩
flex-flowflex-direction、flex-wrap 两个属性的简写flex-basis设置 flex items 在主轴方向上的 base size
align-content决定多行 flex items 在 cross axis 上的对齐方式flexflex-grow、flex-shrink、flex-basis 的简写

4、flex container 相关属性

4.1 flex-direction(flex container 的属性)

将父元素设置 flex 布局后,其 flex items 默认都是沿着 main axis(主轴)从 main start 开始往 main end 方向排布,flex-direction 属性决定了 main axis 的方向,有下面 4 个取值:

row(默认值,主轴从左到右)row-reverse(主轴从右到左)column(主轴从上到下)column-reverse(主轴从下到上)

4.2 justify-content(flex container 的属性)

将父元素设置 flex 布局后,justify-content 属性决定了 flex items 在 main axis 上的对齐方式,有下面几个取值:

flex-start(默认值):与 main start 对齐flex-end:与main end对齐center:居中对齐
space-between:flex items之间的距离相等,与main start、main end两端对齐
space-evenly:flex items 之间的距离相等,flex items 与main start、main end之间的距离等于flex items之间的距离
space-around:flex items 之间的距离相等,flex items 与main start、main end之间的距离是flex items之间距离的一半

4.3 align-items(flex container 的属性)

将父元素设置 flex 布局后,align-items 属性决定了 flex items 在 cross axis上的对齐方式,有下面几个取值:

normal:在弹性布局中,效果和stretch一样,如果flex items没有设置高度,会自动拉伸至填充flex container
stretch:当flex items在cross axis 方向的 size为auto时,会自动拉伸至填充flex containerbaseline:与基准线(内容第一行文本)对齐
center:居中对齐flex-start:与cross start对齐flex-end:与cross end对齐

4.4 flex-wrap(flex container 的属性)

将父元素设置 flex 布局后,flex-wrap 属性决定 flex items 在 flex container 中是单行还是多行显示,有下面几个取值:

nowrap(默认):flex items单行显示wrap:flex items多行显示wrap-reverse:多行(对比wrap,cross start与cross end相反)

4.5 flex-flow (flex container 的属性)

将父元素设置 flex 布局后,flex-flow 属性是 flex-direction || flex-wrap 的简写,可以省略,顺序任意。

4.6 align-content(flex container 的属性)

将父元素设置 flex 布局后,align-content 属性决定了多行 flex items 在 cross axis 上的对齐方式,用法与 justify-content 类似,有下面几个取值:

stretch(默认值):与align-items的 stretch类似center:居中对齐
flex-start:与cross start对齐flex-end:与cross end对齐
space-between:flex items之间的距离相等,与cross start、cross end两端对齐
space-around:flex items之间的距离相等,flex items与cross start、cross end 之间的距离是flex items之间距离的一半
space-evenly:flex items 之间的距离相等,flex items 与cross start、cross end 之间的距离等于flex items之间的距离

5、flex items 相关属性

5.1 order(flex items 的属性)

将父元素设置 flex 布局后,子元素的 order 属性决定了 flex items 的排布顺序,可以设置任意整数(正整数、负整数、0),值越小就越排在前面,默认值是 0。

5.2 align-self(flex items 的属性)

将父元素设置 flex 布局后,子元素 flex items 可以通过 align-self 属性覆盖 flex container 设置的 align-items,有下面几个取值:

auto(默认值):遵从 flex container 的 align-items 设置
stretch、flex-start、flex-end、center、baseline,效果跟 align-items 一致

5.3 flex-grow(flex items 的属性)

将父元素设置 flex 布局后,子元素的 flex-grow 属性决定了 flex items 如何扩展,可以设置任意非负数字(正小数、正整数、0),默认值是0。当 flex container 在 main axis 方向上有剩余 size 时,flex-grow 属性才会有效:

(1)如果所有 flex items 的 flex-grow 总和 sum 超过 1,每个 flex item 扩展的 size 为 flex container 的剩余 size*flex-grow/sum。

(2)如果所有 flex items 的 flex-grow 总和不超过 1,每个 flex item 扩展的 size 为 flex container 的剩余 size*flex-grow。

flex items 扩展后的最终size 不能超过 max-width\max-height。

5.4 flex-shrink(flex items 的属性)

将父元素设置 flex 布局后,子元素的 flex-shrink 属性决定了 flex items 如何收缩,可以设置任意非负数字(正小数、正整数、0),默认值是1。当 flex items 在 main axis 方向上超过了 flex container 的 size,flex-shrink 属性才会有效。

(1)如果所有 flex items 的 flex-shrink 总和超过 1,每个 flex item 收缩的 size 为 flex items 超出 flex container 的 size*收缩比例/所有 flex items 的收缩比例之和。

(2)如果所有 flex items 的 flex-shrink 总和 sum 不超过 1,每个 flex item 收缩的 size为 flex items 超出 flex container 的size*sum*收缩比例/所有 flex items 的收缩比例之和,收缩比例=flex-shrink*flex item的base size,base size 就是 flex item 放入flex container 之前的 size。

flex items 收缩后的最终 size 不能小于min-width\min-height

5.5 flex-basis(flex items 的属性)

将父元素设置 flex 布局后,子元素的 flex-basis 用来设置 flex items 在 main axis 方向上的 base size,可以设置为 auto(默认值)、具体的宽度数值(100px)。

决定 flex items 最终 base size 的因素,从优先级高到低:(1)max-width\max-height\min-width\min-height(2)flex-basis(3)width\height(4)内容本身的 size。

5.6 flex(flex items 的属性)

将父元素设置 flex 布局后,子元素的 flex 属性是 flex-growlI flex-shrink  flex-basis 的简写,flex 属性可以指定1个,2个或3个值。

单值语法:值必须为以下其中之一:(1)一个无单位数(<number>):它会被当作<flex-grow>的值。(2)一个有效的宽度(width)值:它会被当作<flex-basis>的值。(3)关键字none,auto或initial。

双值语法:第一个值必须为一个无单位数,并且它会被当作<flex-grow>的值。第二个值必须为以下之一:(1)一个无单位数:它会被当作<flex-shrink>的值。(2)一个有效的宽度值:它会被当作<flex-basis>的值。

三值语法:第一个值必须为一个无单位数,并且它会被当作<flex-grow>的值。第二个值必须为一个无单位数,并且它会被当作<flex-shrink>的值。第三个值必须为一个有效的宽度值,并且它会被当作<flex-basis>的值。