原文网址:CSS--flex布局--教程/详解_IT利刃出鞘的博客-CSDN博客
简介
本文详细介绍CSS的flex布局,包括:原理、属性。
flex概述
简介
flexbox(Flexible Box)是一种一维的布局模型,它给 flexbox 的子元素提供了强大的空间分布和对齐能力。
flexbox 是一种一维的布局,因为一个 flexbox 一次只能处理一个维度上的元素布局(一行或者一列)。相对而言,Grid 布局是一个二维布局,可以同时处理行和列上的布局。
设置 flex 布局之后,子元素的 float、clear、vertical-align 的属性将会失效。
基本概念
flex布局,涉及到里外两层。外面一层叫做Flex容器(flex container),简称”容器”。容器里的所有子元素自动成为容器成员,称为Flex项目(flex item),简称”项目”。
flex 容器中默认存在两条轴,水平主轴(main axis) 和垂直于它的交叉轴(cross axis)。(这是默认设置,可以设置使垂直方向变为主轴,水平方向变为交叉轴)。
每个flex项目占据的主轴空间为 (main size), 占据的交叉轴的空间为 (cross size)。
容器的属性
flex 布局需要先指定一个容器,任何一个容器都可以被指定为 flex 布局,这样容器内部的元素就可以使用 flex 来进行布局。
.container {
display: flex | inline-flex;
}
生成一个块状或行内的 flex 容器盒子。(如果使用块元素如 div,用 flex;如果使用行内元素,使用 inline-flex。)
有下面六种属性可以设置在容器上,它们分别是:
- flex-direction
- flex-wrap
- flex-flow
- justify-content
- align-items
- align-content
1. flex-direction
flex-direction:决定主轴的方向(即项目的排列方向)。
flex-direction: row | row-reverse | column | column-reverse;
四个值分别代表:
- row(默认值):主轴为水平方向,起点在左端。
- row-reverse:主轴为水平方向,起点在右端。
- column:主轴为垂直方向,起点在上沿。
- column-reverse:主轴为垂直方向,起点在下沿。
效果分别对应如下:
2. flex-wrap
flex-wrap:定义如果一条轴线排不下,如何换行。有三个属性值,默认情况下是wrap。
flex-wrap: nowrap | wrap-reverse | wrap;
分别表示:不换行 | 反转换行 | 换行,效果分别如下:
3. flex-flow
flex-flow:flex-direction属性和flex-wrap属性的简写形式,默认值为row nowrap。这里就不再具体测试。
4. justify-content
justify-content:定义项目在主轴上(即相当于X轴)的对齐方式。一共有五个属性值:
justify-content: flex-start | flex-end | center | space-between | space-around;
分别表示:左对齐 | 右对齐 | 居中 | 两端对齐 | 每个项目两侧的间隔相等。以下是对应的效果:
5. align-items
align-items:定义项目在交叉轴上(即Y轴上)如何对齐。有五个属性值:
align-items: flex-start | flex-end | center | baseline | stretch;
分表表示:上对齐 | 下对齐 | 居中对齐 | 项目的第一行文字的基线对齐 | 如果项目未设置高度或设为auto,将占满整个容器的高度(默认值)。下面是对应的效果图:
6. align-content
align-content:定义多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。该属性定义多跟轴线在Y轴上的对齐方式,与align-items有点类似。其有以下六个属性值:
- flex-start:与交叉轴的起点对齐。
- flex-end:与交叉轴的终点对齐。
- center:与交叉轴的中点对齐。
- space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。
- space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。
- stretch(默认值):轴线占满整个交叉轴。
项目的属性
上边介绍了容器的属性,本处介绍容器内部的项目的属性。外部的容器设为Flex布局以后,子元素的float、clear和vertical-align属性将失效。
如果内部的项目不想受flex约束,可以设置position属性为absolute或者fixed。
flex项目有以下六个属性:
- order
- flex-basis
- flex-grow
- flex-shrink
- flex
- align-self
1. order
order属性定义项目的排列顺序。数值越小,排列越靠前,默认为0。有了这个属性,可以调整在HTML中出现的顺序。
order: <integer>;
2. flex-basis
flex-basis定义了项目占据的主轴空间(main size)(分配剩余空间之前)。浏览器根据这个属性,计算主轴是否有多余空间。
默认值:auto,即项目本来的大小(采用元素内容的尺寸)。所以:给Flex元素的父元素声明display: flex,所有子元素会排成一行,且自动分配小大以充分展示元素的内容。
flex-basis: <length> | auto; /* default auto */
当主轴为水平方向的时候,若设置了 flex-basis,项目的宽度设置值会失效。
flex-basis 需要跟 flex-grow 和 flex-shrink 配合使用才能发挥效果。
flex-basis的取值:
- 0 %:会把该项目视为零尺寸。
- auto:子项占用的宽度使用width 的宽度;若width也没设置,子项占用空间由内容决定。
- 具体尺寸。比如:flex-basis: 100px; width: 70px。此时元素占用宽度为100px。
3. flex-grow
flex-grow属性用来“瓜分”父项的“剩余空间”。默认为0(即使存在剩余空间也不放大)。
flex-grow在 flex 容器下的子元素的宽度和比容器和小的时候起作用。
flex-grow定义了子元素的尺寸增长因子,父容器被子项的flex-basis占用后,剩下的尺寸会按照各个子元素的 flex-grow值进行加大到各个子元素上。
flex-grow: <number>; /* default 0 */
- 如果所有项目的 flex-grow 属性都为 1,则它们将等分剩余空间。
- 如果A项 flex-grow 为 1,B项为 2,则后者占据的剩余空间比前者多一倍。如下图所示
- 如果所有项目以 flex-basis 的值排列完后发现空间不够了,且 flex-wrap:nowrap 时,此时 flex-grow 不起作用了,这时候就需要接下来的这个属性。
4. flex-shrink
flex-shrink属性用来“吸收”超出的空间。默认为1。
flex-shrink在子元素宽度比父元素宽度大的时候起作用。
flex-shrink定义了子元素的尺寸缩小因子,子元素总尺寸减去父元素尺寸得到的尺寸会按照各个子元素的 flex-shrink值进行平分缩小到各个子元素上。
取值:
- 1:如果空间不足,该项目将缩小。
- 0:如果空间不足,该项目不缩小。
- 负值:无效。
flex-shrink: <number>; /* default 1 */
- 如果所有项目的flex-shrink属性都为1,当空间不足时,都将等比例缩小。
- 如果一个项目的flex-shrink属性为0,其他项目都为1,则空间不足时,前者不缩小。
5. flex
flex属性是flex-grow, flex-shrink 和 flex-basis的简写,默认值为0 1 auto。后两个属性可选。
flex: [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
该属性有两个快捷值:auto (1 1 auto) 和 none (0 0 auto)。
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值。
特殊的取值
- flex 取值为一个非负数字
- 此时则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下两种写法是等同的:
.item {flex: 1;} .item { flex-grow: 1; flex-shrink: 1; flex-basis: 0%; }
- 此时则该数字为 flex-grow 值,flex-shrink 取 1,flex-basis 取 0%,如下两种写法是等同的:
- flex 取值为 0 时
- 对应的三个值分别为 0 1 0%。如下两种写法是等同的:
.item {flex: 0;} .item { flex-grow: 0; flex-shrink: 1; flex-basis: 0%; }
- 对应的三个值分别为 0 1 0%。如下两种写法是等同的:
- flex 取值为一个长度或百分比
- 视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字)。如下两组都是等同的:
.item-1 {flex: 0%;} .item-1 { flex-grow: 1; flex-shrink: 1; flex-basis: 0%; }
.item-2 {flex: 24px;} .item-2 { flex-grow: 1; flex-shrink: 1; flex-basis: 24px; }
- 视为 flex-basis 值,flex-grow 取 1,flex-shrink 取 1,有如下等同情况(注意 0% 是一个百分比而不是一个非负数字)。如下两组都是等同的:
- flex 取值为两个非负数字
- 分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%。如下两种写法是等同的:
.item {flex: 2 3;} .item { flex-grow: 2; flex-shrink: 3; flex-basis: 0%; }
- 分别视为 flex-grow 和 flex-shrink 的值,flex-basis 取 0%。如下两种写法是等同的:
- flex 取值为一个非负数字和一个长度或百分比
- 分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1。如下两种写法是等同的:
.item {flex: 11 32px;} .item { flex-grow: 11; flex-shrink: 1; flex-basis: 32px; }
- 分别视为 flex-grow 和 flex-basis 的值,flex-shrink 取 1。如下两种写法是等同的:
6. align-self
align-self:允许单个项目有与其他项目不一样的对齐方式,会覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。
align-self: auto | flex-start | flex-end | center | baseline | stretch;
上面六个取值中,除了auto,其他值与align-items属性完全一致。
典型使用场景
- 设置侧边栏固定:
-
html { scroll-padding-top: 150px; } .sidebar,.sidebar_lefe { top: 1em; }
-