在 CSS 布局中,Flexbox(弹性盒布局)和 Grid(网格布局)是两大核心工具。它们解决了传统布局方式(浮动、定位、表格)的诸多痛点,让开发者能够更高效、更灵活地构建页面结构
Flex 布局(一维布局)
Flexbox 是一种一维布局模型,它专注于在一个方向(水平或垂直)上排列元素。你可以控制元素在主轴上的对齐、分布以及换行行为。
Flex 容器属性
在父元素上设置 display: flex 或 display: inline-flex 即可创建 Flex 容器。
- flex-direction:定义主轴方向。
– row(默认):水平从左到右
– row-reverse:水平从右到左
– column:垂直从上到下
– column-reverse:垂直从下到上 - flex-wrap:控制是否换行。
– nowrap(默认):不换行,可能溢出
– wrap:换行,第一行在上方
– wrap-reverse:换行,第一行在下方 - 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-content,但作用于交叉轴)。
Flex 项目属性
- flex-grow:定义项目的放大比例,默认为 0(不放大)。
- flex-shrink:定义项目的缩小比例,默认为 1(空间不足时缩小)。
- flex-basis:定义在分配多余空间之前项目占据的主轴空间,默认 auto(即项目本来的大小)。
- flex 是 flex-grow、flex-shrink、flex-basis 的简写,例如 flex: 1 等价于 1 1 0%。
- align-self:允许单个项目覆盖容器的 align-items 设置。
- order:定义项目的排列顺序,数值越小越靠前,默认为 0。
Flex 示例:导航栏
1 | <nav class="navbar"> |
Grid 布局(二维布局)
Grid 是一种二维布局模型,它可以同时处理行和列,非常适合构建复杂的页面结构。
Grid 容器属性
在父元素上设置 display: grid 或 display: inline-grid 即可创建 Grid 容器。
- grid-template-rows / grid-template-columns:定义行和列的轨道大小。
– 可以使用固定长度、百分比、fr 单位(剩余空间分配)、auto、minmax()、repeat() 等。
1 | .container { |
- gap:行列之间的间距(简写 row-gap 和 column-gap)。
- justify-items / align-items:控制单元格内容在单元格内的水平/垂直对齐方式(start、end、center、stretch)。
- justify-content / align-content:控制整个网格在容器内的对齐方式(当网格总大小小于容器时)。
- grid-template-areas:通过命名区域来定义布局,非常直观。
1 | .container { |
Grid 项目属性
- grid-column / grid-row:指定项目占据的列/行范围。例如 grid-column: 1 / 3 表示从第 1 列线到第 3 列线(跨越 2 列)。也可以使用 span 关键字,如 grid-column: span 2。
- grid-area:如果定义了 grid-template-areas,直接指定区域名;否则可以作为 grid-row-start / grid-column-start / grid-row-end / grid-column-end 的简写。
- justify-self / align-self:单个项目的对齐方式,覆盖容器的 justify-items / align-items。
Grid 示例:卡片网格
1 | <div class="grid-container"> |
Flex 与 Grid 的区别
| 维度 | Flexbox | Grid |
|---|---|---|
| 布局维度 | 一维(行或列) | 二维(同时控制行和列) |
| 设计思想 | 内容驱动(项目大小影响布局) | 布局驱动(先定义网格,再放置项目) |
| 适用场景 | 组件内部排列、导航栏、小规模布局 | 整体页面架构、复杂二维布局 |
| 对齐能力 | 强大的主轴/交叉轴对齐 | 同样强大,且支持单元格内对齐 |
| 重叠控制 | 无法控制项目重叠(除非定位) | 可以轻松让项目占据相同单元格实现重叠 |
| 响应式 | 通过 flex-wrap 和 flex 属性适应 | 通过 repeat(auto-fit, minmax()) 轻松实现 |
Flex 与 Grid 的结合使用
在实际项目中,Grid 和 Flex 并非互斥,而是相辅相成。通常可以用 Grid 搭建页面的宏观框架(如头部、侧边栏、主要内容区、底部),然后在每个区域内用 Flex 处理内部元素的排列。
示例:Grid 宏观布局 + Flex 内部微调
1 | <div class="page"> |
总结
- Flexbox 擅长处理一维排列,适合小范围的组件布局,例如导航栏、列表、卡片内的元素分布。
- Grid 擅长处理二维布局,适合构建整个页面的骨架,例如整体布局、网格相册、仪表盘。
- 两者可以无缝结合,用 Grid 做宏观布局,用 Flex 做微观调整,让代码既清晰又灵活。
- 掌握 Flex 和 Grid 是现代 CSS 布局的必修课,它们让响应式设计变得更加简单和可控。