前言
在现代前端开发中,CSS 布局是构建网页界面的基础技能。随着 Web 技术的发展,CSS 布局方式也经历了从传统的浮动布局、定位布局到现代的 Flexbox 和 Grid 布局的演进。这两种现代布局方式极大地简化了复杂布局的实现,提供了更直观、更强大的布局能力。
在之前的CSS 基础温故一文中,我们简单介绍了几种常见的布局方式,本文将深入探讨 Flexbox 和 Grid 这两种现代布局方式的各种参数和使用场景。
Flexbox 布局
Flexbox(弹性盒子布局)是一维布局模型,旨在提供一种更加有效的方式来布局、对齐和分配容器中项目之间的空间,即使它们的大小是未知的或动态的。
基本概念
Flexbox 布局由两个主要组件构成:
- Flex 容器(Flex Container):通过设置
display: flex
或display: inline-flex
创建 - Flex 项目(Flex Items):Flex 容器的直接子元素
Flex 容器属性
1. display
1 | .container { |
2. flex-direction
定义主轴方向(项目的排列方向):
1 | .container { |
row
(默认值):主轴为水平方向,起点在左端row-reverse
:主轴为水平方向,起点在右端column
:主轴为垂直方向,起点在上沿column-reverse
:主轴为垂直方向,起点在下沿
3. flex-wrap
定义项目是否换行:
1 | .container { |
nowrap
(默认值):不换行wrap
:换行,第一行在上方wrap-reverse
:换行,第一行在下方
4. flex-flow
flex-direction
和flex-wrap
的简写形式:
1 | .container { |
5. justify-content
定义项目在主轴上的对齐方式:
1 | .container { |
6. align-items
定义项目在交叉轴上的对齐方式:
1 | .container { |
7. align-content
定义多行项目在交叉轴上的对齐方式(只在多行时有效):
1 | .container { |
Flex 项目属性
1. order
定义项目的排列顺序,数值越小,排列越靠前,默认为 0:
1 | .item { |
2. flex-grow
定义项目的放大比例,默认为 0,即如果存在剩余空间,也不放大:
1 | .item { |
3. flex-shrink
定义项目的缩小比例,默认为 1,即如果空间不足,该项目将缩小:
1 | .item { |
4. flex-basis
定义在分配多余空间之前,项目占据的主轴空间:
1 | .item { |
5. flex
flex-grow
, flex-shrink
和flex-basis
的简写,默认值为0 1 auto
:
1 | .item { |
6. align-self
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items
属性:
1 | .item { |
Flex 布局使用场景
- 导航栏布局:
1 | <nav class="navbar"> |
1 | .navbar { |
- 卡片布局:
1 | <div class="card-container"> |
1 | .card-container { |
Grid 布局
CSS Grid 布局是二维布局系统,可以同时控制行和列,用于创建复杂的网页布局。
基本概念
Grid 布局同样由两个主要组件构成:
- Grid 容器(Grid Container):通过设置
display: grid
或display: inline-grid
创建 - Grid 项目(Grid Items):Grid 容器的直接子元素
Grid 容器属性
1. display
1 | .container { |
2. grid-template-columns 和 grid-template-rows
定义网格的列和行:
1 | .container { |
示例:
1 | .container { |
3. grid-template-areas
通过指定区域来定义网格模板:
1 | .container { |
4. grid-template
grid-template-rows
、grid-template-columns
和grid-template-areas
的简写:
1 | .container { |
5. grid-column-gap 和 grid-row-gap
定义网格线的大小:
1 | .container { |
6. grid-gap
grid-row-gap
和grid-column-gap
的简写:
1 | .container { |
7. justify-items
设置网格元素在单元格内沿列轴方向的对齐方式:
1 | .container { |
8. align-items
设置网格元素在单元格内沿行轴方向的对齐方式:
1 | .container { |
9. justify-content
设置整个网格在容器内沿列轴方向的对齐方式:
1 | .container { |
10. align-content
设置整个网格在容器内沿行轴方向的对齐方式:
1 | .container { |
11. grid-auto-columns 和 grid-auto-rows
指定自动生成的隐式网格轨道的大小:
1 | .container { |
12. grid-auto-flow
控制自动放置算法如何工作:
1 | .container { |
Grid 项目属性
1. grid-column-start、grid-column-end、grid-row-start、grid-row-end
通过网格线来确定项目的位置:
1 | .item { |
2. grid-column 和 grid-row
grid-column-start
、grid-column-end
和grid-row-start
、grid-row-end
的简写:
1 | .item { |
3. grid-area
grid-row-start
、grid-column-start
、grid-row-end
和grid-column-end
的简写:
1 | .item { |
4. justify-self
设置单个网格元素在单元格内沿列轴方向的对齐方式:
1 | .item { |
5. align-self
设置单个网格元素在单元格内沿行轴方向的对齐方式:
1 | .item { |
Grid 布局使用场景
- 整体页面布局:
1 | <div class="page"> |
1 | .page { |
- 图片画廊布局:
1 | <div class="gallery"> |
1 | .gallery { |
Flex 和 Grid 的对比
特性 | Flexbox | Grid |
---|---|---|
维度 | 一维(行或列) | 二维(行和列) |
适用场景 | 一维布局(导航栏、卡片排列等) | 二维布局(整体页面布局、复杂网格) |
对齐能力 | 主轴和交叉轴对齐 | 行、列和单元格对齐 |
响应式 | 适合简单响应式布局 | 强大的响应式网格系统 |
学习曲线 | 相对简单 | 稍复杂但功能更强大 |
实用工具推荐
Grid 布局在线工具
- CSS Grid Generator - 可视化生成 Grid 布局代码
Flexbox 布局在线工具
- Flexbox Playground - Flexbox 属性可视化调试工具
- Flexbox Froggy - 通过游戏学习 Flexbox 的互动教程
- Flexbox Defense - 另一个通过游戏学习 Flexbox 的工具
总结
Flexbox 和 Grid 是现代 CSS 布局的两大利器:
Flexbox适用于一维布局,特别适合处理项目在主轴上的分布和对齐,如导航栏、工具栏、卡片排列等。
Grid适用于二维布局,能够同时控制行和列,适合构建整体页面布局、复杂网格系统等。
在实际开发中,可以根据具体需求选择合适的布局方式,甚至可以结合使用两者,发挥各自的优势。掌握这两种布局方式对于现代前端开发来说是必不可少的技能。
如果你想回顾其他 CSS 布局方式,可以查看我们之前的文章CSS 基础温故。