两种布局的定位
- Flexbox:一维布局(一个方向排布),适合”在一条线里怎么分配“。
- Grid:二维布局(行和列同时控制),适合”整个页面/区块怎么切分“。
简单记:Flex 管”线”,Grid 管”面”。
一、Flexbox 核心
容器设 display: flex 后,子项沿主轴排列。两根轴:
1 | 主轴 main axis(默认水平) ── justify-content 控制 |
1 | .container { |
flex: 1 的含义:flex: 1 1 0%,允许伸缩、基准为 0,即”平分剩余空间”。这是自适应布局最常用的写法。
经典场景——两栏/三栏布局:
1 | .layout { |
二、Grid 核心
Grid 用”线”划分网格,子项放进去:
1 | .container { |
1fr 是 Grid 特有的弹性单位,代表”一份可用空间”,类似 Flex 的 flex: 1。
实战:经典页面骨架
1 | .page { |
grid-template-areas 用 ASCII 画布定义区域,可读性极高,适合页面级骨架。
响应式:auto-fit 与 minmax
1 | .card-list { |
minmax(280px, 1fr) + auto-fill:卡片最少 280px,放不下就换行,自动填充。一行代码实现响应式卡片墙,这是 Grid 最爽的场景。
三、选型对比表
| 场景 | 推荐 | 原因 |
|---|---|---|
| 导航栏、按钮组、图标排列 | Flexbox | 一行内分配,语义简单 |
| 垂直水平居中 | Flexbox | justify-content + align-items 两行搞定 |
| 两栏/三栏侧边栏布局 | Flexbox 或 Grid | Flex 够用,Grid 更可控 |
| 整页骨架(头部/侧栏/主体/底部) | Grid | 二维区域划分是 Grid 主场 |
| 卡片网格、瀑布流 | Grid | repeat + minmax 天然响应式 |
| 单行内某个元素弹性伸缩 | Flexbox | flex: 1 最直观 |
经验法则:不确定时,先想”这是一维问题还是二维问题”。一维用 Flex,二维用 Grid;两者可以嵌套(Grid 单元格里再 Flex)。
四、从老布局迁移的实战
场景:图标 + 文字垂直居中(老写法是 float + line-height 黑魔法)
1 | /* 现代写法 */ |
场景:三等分按钮
1 | /* 老写法:width: 33.33% + 处理边框 */ |
场景:底部固定页脚(sticky footer)
1 | body { |
常见坑
flex子项被压缩:内容过长时子项被挤扁,加min-width: 0或flex-shrink: 0;gap兼容性:现代浏览器都支持了,但极老浏览器需要 margin 兜底;- Grid 的
1fr最小尺寸:内容溢出时1fr不收缩,配合minmax(0, 1fr)解决; - Flex 垂直居中失效:检查父容器有没有
height,没有高度就没有”垂直”可言。
总结
Flexbox 和 Grid 不是竞争关系,是互补关系。掌握这两套布局后,传统 float 布局可以直接淘汰。建议从”Flex 处理组件内部、Grid 处理页面骨架”这个分工开始实践。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 JCAlways!
评论
