Flexbox:一维布局利器
Flexbox 适合处理一个方向上的元素排列——要么水平排列,要么垂直排列。
核心概念
┌─────────────────────────────────┐
│ main axis (主轴) → │
│ ┌───┐ ┌───┐ ┌───┐ │
│ │ A │ │ B │ │ C │ │
│ └───┘ └───┘ └───┘ │
│ ↑ cross axis (交叉轴) │
└─────────────────────────────────┘
常用模式
水平居中:
.center-h {
display: flex;
justify-content: center; /* 主轴居中 */
}
完全居中:
.center-both {
display: flex;
justify-content: center;
align-items: center; /* 交叉轴居中 */
}
导航栏——两端对齐:
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
}
等高列:
.columns {
display: flex;
align-items: stretch; /* 默认值,子元素等高 */
}
flex 属性速查
| 属性 | 作用 | 常用值 |
|---|---|---|
flex-grow |
放大比例 | 1(占据剩余空间) |
flex-shrink |
缩小比例 | 0(不缩小) |
flex-basis |
初始大小 | auto、200px |
flex |
以上三个的简写 | 1、0 0 auto |
Grid:二维布局王者
Grid 适合处理行和列同时存在的复杂布局。
基本用法
.grid {
display: grid;
grid-template-columns: 1fr 2fr 1fr; /* 三列,比例 1:2:1 */
gap: 20px;
}
经典布局:圣杯布局
.layout {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
响应式卡片网格
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
gap: 24px;
}
auto-fill会自动根据容器宽度决定每行放几个卡片,minmax(280px, 1fr)确保每个卡片最小 280px,剩余空间均分。
如何选择
| 场景 | 推荐 |
|---|---|
| 导航栏、工具栏 | Flexbox |
| 卡片列表 | Grid(auto-fill) |
| 页面整体布局 | Grid(grid-template-areas) |
| 表单项对齐 | Flexbox |
| 不确定子元素数量 | Flexbox |
| 复杂二维布局 | Grid |
常见坑
- Flexbox 子元素的
min-width默认是auto——内容过长时不会缩小。解决:设置min-width: 0 - Grid 的
1fr不是均分——1fr是分配剩余空间,如果有固定宽度的列存在,1fr列会缩小 - gap 在旧版 Flexbox 不支持——Flexbox 的 gap 是后来加的,需注意浏览器兼容性
总结
现代 CSS 布局的口诀:一维用 Flex,二维用 Grid,简单居中用 Flex。两者结合使用,基本可以覆盖所有日常布局需求。