一句话讲清核心区别
Flexbox 用于沿单一轴线(行或列)排列元素。
CSS Grid 用于沿两个轴线(行和列同时)排列元素。
这就是本质区别,一切场景判断由此出发。
一、Flexbox:一维布局利器
Flexbox操作的是弹性容器和弹性子项。定义一个方向(row或column),容器沿该轴分配空间。
.nav {
display: flex;
justify-content: space-between;
align-items: center;
gap: 1rem;
}
Flexbox 最适合的场景
- 导航栏:链接均匀分布,垂直居中。
- 按钮组/标签列表:自然换行(flex-wrap)。
- 卡片行:等间距排列,自动适应。
- 垂直居中:单元素居中,一行搞定。
核心属性速查
| 容器属性 | 说明 |
|---|---|
flex-direction | 主轴方向:row | column |
justify-content | 主轴对齐:space-between | center | flex-end |
align-items | 交叉轴对齐:stretch | center | flex-start |
flex-wrap | 是否换行:nowrap | wrap |
二、CSS Grid:二维布局引擎
Grid让你定义明确的行和列,然后将元素放置到网格中的任意位置——或让元素自动流入。
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 1.5rem;
}
响应式Grid神器:minmax + auto-fill
.product-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 1.5rem;
}
/* 900px视口 → 3列,600px → 2列,320px → 1列,无需媒体查询! */
命名区域:页面级布局的最佳实践
.page {
display: grid;
grid-template-columns: 240px 1fr;
grid-template-rows: 60px 1fr 60px;
grid-template-areas:
"header header"
"sidebar content"
"footer footer";
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.content { grid-area: content; }
.footer { grid-area: footer; }
三、Grid vs Flexbox 决策对照表
| 场景 | 使用 | 说明 |
|---|---|---|
| 导航栏 | Flexbox | 单行排列,不需要二维 |
| 卡片网格(3列) | Grid | 需要行+列对齐 |
| 页面整体布局 | Grid | header/sidebar/main/footer |
| 按钮组 | Flexbox | 单轴即够 |
| 仪表盘 | Grid | 固定多列布局 |
| 标签云 | Flexbox | + flex-wrap 自然换行 |
| 跨行列元素 | Grid | grid-column / grid-row |
四、Grid + Flexbox 混合实战
最佳实践是两者组合使用:Grid 负责外层页面骨架,Flexbox 负责内部组件布局。
/* 外层:Grid定义整体结构 */
.dashboard {
display: grid;
grid-template-columns: 250px 1fr;
grid-template-rows: 64px 1fr;
grid-template-areas: "nav header" "nav main";
height: 100vh;
}
/* 导航内部:Flexbox排列链接 */
.nav {
grid-area: nav;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
/* 主区域:Grid排列卡片 */
.main {
grid-area: main;
display: grid;
grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
gap: 1rem;
}
/* 每张卡片内部:Flexbox */
.card {
display: flex;
flex-direction: column;
gap: 0.75rem;
}
五、2026浏览器兼容性
- Flexbox:99%+ 全球支持
- CSS Grid(基础):99%+ 全球支持
- CSS Grid(subgrid):95%+(Chrome 117+/Firefox 71+/Safari 16+)
- CSS Grid(masonry):实验性,需Chrome/Firefox flag
2026年无需担心Flexbox和Grid的浏览器兼容问题,放心使用。
六、常见误区
- 用Grid做简单居中——虽然
place-items: center一行搞定,但Flexbox更语义化。 - 忘记 align-content——Flex换行后,
align-content控制行间距分布,忘了它间距就不对。 - 用 repeat(3, 1fr) 不做 minmax——小屏幕上会崩溃,应改用
repeat(auto-fill, minmax(250px, 1fr))。 - 用 width 覆盖 flex-basis——两者冲突,应用
flex: 0 0 200px明确基础尺寸。
参考来源:DevPlaybook、Digital Applied、51CTO
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
没有相关内容!