CSS 弹性盒子(Flexbox)是一种一维的布局模型,用于在容器中对项目进行灵活的排列、对齐和分配空间。它特别适合用来设计那些需要动态调整子元素位置和大小的布局,比如导航栏、卡片布局、响应式页面等。
Flexbox 布局包含两个主要部分:
1. Flex 容器(Flex Container)
• 应用了 display: flex; 或 display: inline-flex; 的元素。
• 是所有 Flex 子项的直接父元素。
2. Flex 项目(Flex Items)
• Flex 容器的直接子元素,它们会按照 Flexbox 的规则排列。
只需要给一个元素的 display 属性设置为 flex 或 inline-flex:
.container {
display: flex; /* 块级弹性容器 */
/* 或者 */
display: inline-flex; /* 行内弹性容器 */
}
以下是常用的作用于 Flex 容器 的属性:
flex-direction定义主轴方向,决定子元素如何排列。
| 值 | 说明 |
row(默认) | 主轴为水平方向,从左到右排列 |
row-reverse | 主轴为水平方向,从右到左排列 |
column | 主轴为垂直方向,从上到下排列 |
column-reverse | 主轴为垂直方向,从下到上排列 |
.container {
display: flex;
flex-direction: row; /* 默认 */
}
justify-content定义主轴上的对齐方式,即子元素在水平方向(默认主轴)如何分布。
| 值 | 说明 |
flex-start(默认) | 从主轴起始位置开始排列 |
flex-end | 从主轴结束位置开始排列 |
center | 居中对齐 |
space-between | 两端对齐,项目之间间隔相等 |
space-around | 每个项目两侧的间隔相等(项目之间的间隔是两倍) |
space-evenly | 所有间隔(包括两端)都相等 |
.container {
justify-content: center;
}
align-items定义交叉轴上的对齐方式,即子元素在垂直方向(默认交叉轴)如何对齐。
| 值 | 说明 |
stretch(默认) | 拉伸以填满容器(前提是没有设置高度/固定尺寸) |
flex-start | 交叉轴的起点对齐 |
flex-end | 交叉轴的终点对齐 |
center | 交叉轴居中对齐 |
baseline | 以文字基线对齐 |
.container {
align-items: center;
}
flex-wrap定义是否允许子元素换行。
| 值 | 说明 |
nowrap(默认) | 不换行,所有项目都在一行 |
wrap | 允许换行,从上到下 |
wrap-reverse | 允许换行,从下到上 |
.container {
flex-wrap: wrap;
}
flex-flow (简写)是 flex-direction 和 flex-wrap 的简写形式。
.container {
flex-flow: row wrap; /* 方向为行,允许换行 */
}
align-content当有多行(即换行存在时),定义多行在交叉轴上的对齐方式。
| 值 | 说明 |
flex-start | 多行从交叉轴起始位置开始 |
flex-end | 多行从交叉轴结束位置开始 |
center | 多行整体居中 |
space-between | 多行两端对齐,行间间隔相等 |
space-around | 每行两侧的间隔相等 |
stretch(默认) | 拉伸行以填满剩余空间 |
注意:只有在
flex-wrap: wrap(即换行)时才有效。
这些属性是设置在Flex 子元素上的,用来控制单个项目的排列行为。
order定义项目的排列顺序,数值小的排在前面,默认为 0。
.item {
order: 1;
}
flex-grow定义项目的放大比例,即如果存在剩余空间,该项目是否放大以及放大多少。
• 默认是 0,表示不放大。
• 如果所有项目的 flex-grow 都是 1,则它们将等分剩余空间。
• 如果其中一个为 2,其他为 1,则它占据的空间是其他的两倍。
.item {
flex-grow: 1;
}
flex-shrink定义项目的缩小比例,默认是 1,即如果空间不足,该项目会缩小。
• 0 表示不缩小。
• 通常与 flex-grow 一起使用,简写见下方。
flex-basis定义项目在分配多余空间之前的默认大小,可以设为宽度值,如 200px、auto 等。
.item {
flex-basis: 100px;
}
flex(简写属性)是 flex-grow、flex-shrink 和 flex-basis 的简写,默认值是 0 1 auto。
.item {
flex: 1; /* flex-grow: 1, 其他为默认 */
/* 或者 */
flex: 1 0 200px; /* grow:1, shrink:0, basis:200px */
}
align-self允许单个项目覆盖容器的 align-items 设置,定义该元素自身在交叉轴上的对齐方式。
| 值 | 说明 |
auto(默认) | 继承容器的 align-items |
flex-start | 交叉轴起始 |
flex-end | 交叉轴末尾 |
center | 居中 |
baseline | 基线对齐 |
stretch | 拉伸 |
.item {
align-self: flex-end;
}
<div class="container">
<div class="item">居中内容</div>
</div>
.container {
display: flex;
justify-content: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
height: 300px; /* 需要设定一个高度来观察垂直居中效果 */
border: 1px solid #ccc;
}
.item {
background: lightblue;
padding: 20px;
}
.nav {
display: flex;
justify-content: space-between;
align-items: center;
background: #f0f0f0;
padding: 10px 20px;
}
.nav a {
margin: 0 10px;
text-decoration: none;
color: #333;
}
✅ 适合一维布局(一行或一列)
✅ 需要对齐、分布、排序灵活控制
✅ 常用于:导航栏、卡片布局、表单布局、居中布局、响应式栅格等
🚫 如果你要处理复杂的二维布局(行和列同时控制),可以考虑使用 CSS Grid。