CSS Flexbox 弹性布局
定义
Flexbox(弹性盒) 是一维布局模型:在主轴上分配空间、对齐与排序,在交叉轴上对齐。容器设 display: flex 或 inline-flex 后,直接子元素成为 flex 项。
核心概念
| 概念 | 说明 |
|---|---|
| Flex 容器 | display: flex / inline-flex 的元素 |
| Flex 项 | 容器的直接子元素(文本节点会被匿名包裹) |
| 主轴(main axis) | 由 flex-direction 决定;项沿主轴排列 |
| 交叉轴(cross axis) | 与主轴垂直 |
| 主轴起点/终点 | 排列与 justify-content 的参照方向 |
| 可用空间 | 容器尺寸减去项的 margin、border、padding 与 flex-basis 后的剩余空间,由 flex-grow 分配 |
容器属性
| 属性 | 常用值 | 说明 |
|---|---|---|
display | flex | inline-flex | 块级 / 行内级 flex 容器 |
flex-direction | row | row-reverse | column | column-reverse | 主轴方向 |
flex-wrap | nowrap | wrap | wrap-reverse | 是否换行 |
flex-flow | <direction> <wrap> | flex-direction + flex-wrap 简写 |
justify-content | flex-start | flex-end | center | space-between | space-around | space-evenly | 主轴对齐 |
align-items | stretch | flex-start | flex-end | center | baseline | 单行交叉轴对齐 |
align-content | 同 justify 系列 + stretch | 多行时交叉轴上各行分布 |
gap | <length> | <percentage> | 行/列间距;row-gap / column-gap 可单独设 |
项属性
| 属性 | 常用值 | 说明 |
|---|---|---|
flex-grow | <number>(默认 0) | 放大比例,分配剩余空间 |
flex-shrink | <number>(默认 1) | 空间不足时缩小比例 |
flex-basis | auto | <length> | <percentage> | 主轴初始尺寸 |
flex | none | [grow shrink basis?] | 简写;flex: 1 ≈ 1 1 0% |
order | <integer>(默认 0) | 视觉顺序,不影响 DOM 与 Tab 顺序 |
align-self | auto | 同 align-items | 单项覆盖交叉轴对齐 |
实用示例:响应式工具栏
css
.toolbar {
display: flex;
flex-wrap: wrap; /* 窄屏换行 */
align-items: center;
justify-content: space-between;
gap: 12px 16px; /* 行间距 12px,列间距 16px */
padding: 12px 16px;
}
.toolbar__brand {
flex: 0 0 auto; /* 不伸不缩,按内容宽 */
}
.toolbar__actions {
display: flex;
flex: 1 1 200px; /* 可-grow,基准 200px */
justify-content: flex-end;
gap: 8px;
}
.toolbar__search {
flex: 1 1 240px; /* 中间搜索框占据剩余空间 */
min-width: 120px; /* 防止过窄 */
}
.toolbar__btn--primary {
order: 1; /* 视觉上靠后,DOM 仍可先读次要按钮 */
}html
<header class="toolbar">
<div class="toolbar__brand">Logo</div>
<input class="toolbar__search" type="search" placeholder="搜索…" />
<div class="toolbar__actions">
<button>设置</button>
<button class="toolbar__btn--primary">新建</button>
</div>
</header>常见陷阱
align-content无效:只有flex-wrap: wrap且存在多行时才生效;单行用align-items。flex: 1与flex: auto:flex: 1常等价1 1 0%,项易均分;flex: auto为1 1 auto,更尊重内容宽度。- 最小尺寸默认
auto:项默认min-width: auto,可能拒绝缩小导致溢出;必要时设min-width: 0。 order只改视觉:无障碍阅读顺序仍按 DOM;勿用 order 做关键逻辑顺序。- 百分比 height:flex 项百分比高度依赖父级明确高度链。
学习清单
- [ ] 区分主轴 / 交叉轴及
flex-direction影响 - [ ] 会用
justify-content与align-items做常见居中 - [ ] 理解
flex-grow/flex-shrink/flex-basis与flex简写 - [ ] 知道
align-content与align-items的适用场景 - [ ] 会用
gap替代 margin hack 做间距 - [ ] 能搭建一行工具栏 + 换行的响应式布局