十年前我刚入行前端时,布局是个令人头疼的问题。float 的各种清除浮动技巧、inline-block 的间隙问题、position 定位的层级困扰...直到 CSS Grid 的出现彻底改变了游戏规则。作为现代 CSS 最强大的二维布局系统,Grid 让复杂布局变得像搭积木一样简单直观。
想象一下:你不再需要计算百分比宽度,不再为垂直居中写 hack 代码,不再因为增加一个元素就打乱整个布局。Grid 提供了真正的「网格思维」——通过定义行和列的轨道,你可以精确控制每个元素的位置和尺寸,就像在 Excel 表格中操作单元格那样得心应手。
让我们用装修房子的类比来理解 Grid 的核心概念:
display: grid 声明关键细节:Grid 只影响直接子元素!如果子元素内部还有嵌套结构,那些孙子元素不会参与网格布局。
让我们从最基础的 3×2 网格开始:
css复制.container {
display: grid;
grid-template-columns: 100px 200px 100px; /* 三列宽度 */
grid-template-rows: 80px 120px; /* 两行高度 */
gap: 10px; /* 单元格间距 */
}
这段代码创建了一个这样的网格结构:
code复制+-----+-----+-----+
|100px|200px|100px| 80px
+-----+-----+-----+
| | | | 120px
+-----+-----+-----+
fr(fraction 的缩写)是 Grid 独有的单位,它按比例分配剩余空间。假设容器宽度是 500px:
css复制grid-template-columns: 1fr 2fr 1fr;
/* 计算过程:
总份数 = 1 + 2 + 1 = 4
每份宽度 = (500px - 所有固定值 - 所有gap) / 4
*/
实测技巧:使用 fr 时一定要给容器设置明确尺寸(width/height),否则无法计算剩余空间。
响应式布局的神器,定义尺寸范围:
css复制grid-template-columns: repeat(3, minmax(100px, 1fr));
/* 每列最小100px,最大平分剩余空间 */
我在实际项目中常用这种写法替代媒体查询,特别是在处理商品卡片列表时效果极佳。
css复制grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
这行代码实现了:
css复制.item {
grid-column: 1 / 3; /* 从第1条线到第3条线 */
grid-row: 2 / span 2; /* 从第2条线开始,跨越2个轨道 */
}
网格线编号也支持负数:
css复制.container {
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
这种写法特别适合页面框架布局,代码可读性极强。我在管理后台项目中大量使用这种方式。
传统方法需要 JavaScript 计算,Grid 只需:
css复制.container {
grid-auto-rows: 1fr; /* 所有行等高 */
}
css复制.container {
grid-template:
"header header header" 80px
"nav content ads" 1fr
"footer footer footer" 60px
/ 200px 1fr 200px;
}
通过 grid-template 定义复杂结构:
css复制grid-template:
"a a b" 100px
"c d e" 200px
"f f f" 80px
/ 1fr 2fr 1fr;
过度嵌套会导致性能问题。建议:
子项不按预期排列?
gap 间距不生效?
css复制/* 典型模式:Grid 宏观布局 + Flexbox 微观排列 */
.container {
display: grid;
grid-template-columns: 1fr 3fr;
}
.sidebar {
display: flex;
flex-direction: column;
}
css复制.gallery {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
grid-auto-rows: 150px;
grid-auto-flow: dense; /* 开启密集填充模式 */
}
.item:nth-child(3n) {
grid-column: span 2;
grid-row: span 2;
}
css复制.magazine {
grid-template:
"title title image" 2fr
"meta content image" 3fr
"meta footer footer" 1fr
/ 1fr 2fr 1fr;
}
css复制.dashboard {
grid-template:
"stats stats stats" 1fr
"chart chart sidebar" 2fr
"table table sidebar" 2fr
/ 1fr 1fr 300px;
}
虽然现代浏览器都支持 Grid,但针对 IE11 需要:
css复制.container {
display: -ms-grid; /* IE11 前缀 */
-ms-grid-columns: 1fr 1fr; /* 旧语法 */
}
.item {
-ms-grid-column: 1;
-ms-grid-row: 1;
}
个人建议:除非必须支持 IE,否则建议使用特性查询渐进增强:
css复制@supports (display: grid) {
/* 现代浏览器样式 */
}
基础阶段:
中级阶段:
高级阶段:
我个人的学习心得是:每天用 Grid 实现一个布局小案例,坚持两周就能形成「网格思维」。当你能在脑海中直接可视化网格结构时,就真正掌握了这门技术。