Flexbox

你想要三个按钮排成一行,间距均匀,高度相同,并且不管每个按钮包含多少文本都能在垂直方向上居中。在过去,这意味着使用浮动、清除浮动和大量的猜测。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 在项目之间放置均匀的空间而不在边缘添加任何,所以在 margin 之前选择它。 灵活的项目尺寸
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 项目如何分割它们之间的房间。 
