Flexbox
你想要三个按钮排成一行,间距均匀,高度一致,无论每个按钮里的文字多少都能垂直居中。放在以前,这意味着浮动、clearfix,还要靠猜。flexbox 正是为这种需求打造的工具:你告诉一个容器把子元素排成一行,然后沿两个轴来回调整,直到它们落在你想要的位置。网页上大部分常见的布局——导航栏、工具栏、一排排卡片——底层其实都是一个 flex 容器。
flex 容器
flexbox 从父元素上的一行代码开始。给一个容器设置 display: flex,它的直接子元素就会并排排成一行。这个容器现在就成了一个**flex 容器**,里面的每个子元素都变成了 flex 项目。
.nav {
display: flex; /* 子元素现在排成一行 */
}这些项目会沿着两个方向排布。主轴从左到右延伸,也就是项目排列的方向。交叉轴从上到下延伸,横穿这一行。你后面会沿着这两条轴来调整项目的位置,所以最好现在就在脑子里画出这幅图:主轴是项目所在的那条线,交叉轴是横穿它的方向。
.nav {
display: flex;
}只需一条声明,任何一个块元素的子元素就不再从上到下堆叠,而是并排排成一行。这一章接下来的内容,都是讲怎么在把这些项目放进容器之后,进一步调整它们的位置。
display: flex,它的直接子元素就会排成一行。这个父元素就是 flex 容器,子元素就是 flex 项目。项目沿两个方向移动:主轴是它们所在的那条线,交叉轴横穿主轴,你会沿着这两条轴去调整项目位置。 沿轴对齐
项目排成一行之后,有两个属性可以调整它们的位置。justify-content 沿主轴(也就是项目排列的方向)分配间距。align-items 沿交叉轴移动它们,也就是在这一行里上下调整。
.nav {
display: flex;
justify-content: space-between; /* 沿这一行把项目推开 */
align-items: center; /* 让它们在垂直方向上居中对齐 */
}justify-content 常用的值有 flex-start(挤在左边)、center(挤在中间)、flex-end(挤在右边)、space-between(项目之间留空隙,两端不留)、space-around(每个项目两侧都留空隙)。至于 align-items,最常用的就是 center。
要让某个东西在两个方向上都居中,人人都会先学到的一招:把两个属性都设成 center。
.hero {
display: flex;
justify-content: center; /* 沿主轴居中 */
align-items: center; /* 沿交叉轴居中 */
}justify-content 沿主轴分配间距,align-items 沿交叉轴移动项目。第一个属性要记住的值是 center、space-between 和 flex-start。把两个都设成 center,里面的内容就会正好居中,这个操作你会反复用到。 方向与换行
默认情况下,flex 容器把项目排成一行。用**flex-direction**可以改变这一点。把它设成 column,项目就会从上到下堆叠,而不是并排排列。
.sidebar {
display: flex;
flex-direction: column; /* 项目现在垂直堆叠 */
}当一行里的项目挤不下时,它们会被越挤越窄。要让它们换到新的一行,而不是被压扁,加上 flex-wrap: wrap。
.card-row {
display: flex;
flex-wrap: wrap; /* 放不下的项目会移到下一行 */
}要设置项目之间的间距,用 gap。它会在每个项目之间加上统一的间隙,而不会在最外侧边缘也加上空间。
.card-row {
display: flex;
gap: 16px; /* 每个项目之间留 16px */
}flex-direction: column 让项目垂直堆叠,而不是排成一行。flex-wrap: wrap 让项目在挤不下时换到新的一行,而不是被压扁。gap 在项目之间加上均匀的间距,且不会在边缘多加空间,所以用它比用边距更合适。 灵活的项目尺寸
flexbox 的意义就在于项目可以"弹性"变化,通过增大或缩小来分享空间。你会用得最多的简写是给项目设置 flex: 1,它告诉项目要增长,均分可用的空间。
.card {
flex: 1; /* 每张卡片都增长,占据这一行均等的份额 */
}给一行里的三张卡片都设置 flex: 1,它们就会把容器平分成三份等宽的区域。给其中一张卡片设置 flex: 2,它占据的空间就是其他卡片的两倍。就是这一个数字,决定了项目之间如何分配剩余空间。
flex: 1 背后其实是三个独立的控制项:项目增长多少、缩小多少、以及起始尺寸是多少。一开始你很少会逐个去设置它们,这个简写已经覆盖了常见情况,但知道它们的存在会有帮助。
.layout {
display: flex;
gap: 24px;
}
.sidebar {
flex: 0 0 240px; /* 固定 240px,永不增长也不缩小 */
}
.main {
flex: 1; /* 占据所有剩余空间 */
}一个固定的侧边栏配一个弹性的主内容列,三行代码就表达清楚了意图。这一种模式,加上前面讲过的对齐导航栏,覆盖了你要构建的大部分布局。
flex: 1,就是让它增长,均分这一行的空间,所以三张都设了 flex: 1 的卡片会等宽。把其中一个改成 flex: 2,它就会占两倍的空间。就是这一个数字,决定了 flex 项目之间怎么分配空间。 
