CSS Grid布局是前端开发者的“布局神器”,能让你轻松搞定复杂的网页排版。想从零基础到熟练运用Grid?别急,这篇文章会带你逐一拆解Grid的每个核心属性,配上直观的代码示例和效果分析,确保你不仅看懂,还能自己写出来!无论你是新手还是想进阶,这篇指南都帮你打牢基础,学会用Grid玩转布局!
Grid是CSS提供的一种二维布局系统,比Flexbox更强大,因为它能同时控制行和列。它的优势有:
接下来,我们直接上手,从核心概念到每个属性的用法,带你一步步玩转Grid!
在写代码之前,先搞清楚几个基本术语,方便后面理解属性:
display: grid
的元素,包含所有网格内容。我们先来写一个2×3的网格,感受一下Grid的基本用法。
<div class="container">
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
<div class="item">4div>
<div class="item">5div>
<div class="item">6div>
div>
.container {
display: grid;
grid-template-columns: 150px 150px 150px; /* 3列,每列150px */
grid-template-rows: 100px 100px; /* 2行,每行100px */
gap: 10px; /* 网格间距10px */
}
.item {
background-color: #e6f3ff;
display: flex;
align-items: center;
justify-content: center;
border: 1px solid #007bff;
font-size: 18px;
}
运行后,你会得到一个2行3列的网格,每个格子150×100px,格子间有10px间距。每个格子背景是浅蓝色,带边框,内容居中显示。
下面我们来详细讲解Grid的每个核心属性,配上独立示例,帮你彻底搞懂怎么用!
display: grid
和 display: inline-grid
display: grid
:容器是块级元素,独占一行。display: inline-grid
:容器是行内块元素,允许其他内容在同一行。grid
和inline-grid
<div class="container grid">网格容器div>
<div class="container inline-grid">行内网格div>
<span>其他内容span>
.grid {
display: grid;
grid-template-columns: 100px 100px;
background-color: #f0f0f0;
}
.inline-grid {
display: inline-grid;
grid-template-columns: 100px 100px;
background-color: #e6f3ff;
}
效果:grid
容器独占一行,inline-grid
容器和旁边的在同一行。
grid-template-columns
和 grid-template-rows
100px
)、百分比(如50%
)、fr
单位(剩余空间比例)或auto
(内容自适应)。<div class="container">
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
div>
.container {
display: grid;
grid-template-columns: 100px 1fr 2fr; /* 第1列100px,第2列1份,第3列2份 */
grid-template-rows: 50px auto; /* 第1行50px,第2行自适应 */
gap: 10px;
}
效果:
进阶用法:用repeat()
简化重复值:
grid-template-columns: repeat(3, 1fr); /* 等价于 1fr 1fr 1fr */
grid-template-columns: repeat(2, 100px 50px); /* 等价于 100px 50px 100px 50px */
gap
、row-gap
和 column-gap
gap: 10px
:行和列间距都是10px。row-gap: 10px
:仅设置行间距。column-gap: 10px
:仅设置列间距。<div class="container">
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
<div class="item">4div>
div>
.container {
display: grid;
grid-template-columns: repeat(2, 1fr);
row-gap: 20px; /* 行间距20px */
column-gap: 10px; /* 列间距10px */
}
效果:格子之间水平间距10px,垂直间距20px。
grid-template-areas
grid-area
指定区域。<div class="container">
<header class="item">Headerheader>
<aside class="item">Sidebaraside>
<main class="item">Mainmain>
<footer class="item">Footerfooter>
div>
.container {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 100px 1fr 100px;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
gap: 10px;
}
header { grid-area: header; }
aside { grid-area: sidebar; }
main { grid-area: main; }
footer { grid-area: footer; }
.item {
background-color: #f0f0f0;
padding: 20px;
}
效果:Header和Footer跨两列,Sidebar和Main并排,布局清晰直观。
grid-column
和 grid-row
grid-column: 起始线 / 结束线
(或span 跨度
)。grid-row: 起始线 / 结束线
(或span 跨度
)。<div class="container">
<div class="item item1">跨2列div>
<div class="item">2div>
<div class="item">3div>
<div class="item">4div>
div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(2, 100px);
gap: 10px;
}
.item1 {
grid-column: 1 / 3; /* 从第1列线到第3列线,跨2列 */
grid-row: 1 / span 2; /* 从第1行线开始,跨2行 */
}
效果:第一个格子横跨2列、纵跨2行,其他格子自动填充剩余位置。
grid-auto-columns
和 grid-auto-rows
grid-template
定义的范围时,自动生成行或列。<div class="container">
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
<div class="item">4div>
div>
.container {
display: grid;
grid-template-columns: repeat(2, 100px); /* 明确2列 */
grid-auto-rows: 80px; /* 隐式行高80px */
}
效果:4个项目会形成2×2网格,超出2列的部分自动按80px行高排列。
grid-auto-flow
row
(默认):按行填充。column
:按列填充。dense
:尽可能填充空隙。<div class="container">
<div class="item item1">跨2列div>
<div class="item">2div>
<div class="item">3div>
div>
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-flow: dense;
gap: 10px;
}
.item1 {
grid-column: span 2;
}
效果:dense
模式会让后续项目尽量填满前面的空隙,布局更紧凑。
justify-items
和 align-items
justify-items
:控制网格项目在列轴(水平)的对齐。align-items
:控制网格项目在行轴(垂直)的对齐。start
、center
、end
、stretch
(默认)。<div class="container">
<div class="item">1div>
<div class="item">2div>
div>
.container {
display: grid;
grid-template-columns: repeat(2, 200px);
justify-items: center; /* 水平居中 */
align-items: center; /* 垂直居中 */
gap: 10px;
}
效果:每个格子内容水平和垂直居中显示。
justify-content
和 align-content
justify-content
:控制整个网格在容器水平方向的对齐。align-content
:控制整个网格在容器垂直方向的对齐。start
、center
、end
、space-between
、space-around
、space-evenly
。<div class="container">
<div class="item">1div>
<div class="item">2div>
div>
.container {
display: grid;
grid-template-columns: repeat(2, 100px);
justify-content: center; /* 网格整体水平居中 */
align-content: center; /* 网格整体垂直居中 */
height: 300px; /* 容器高度 */
gap: 10px;
}
效果:整个2×1网格在容器中水平和垂直居中。
minmax()
、auto-fill
和 auto-fit
minmax(min, max)
:设置轨道的最小和最大尺寸。auto-fill
:根据容器宽度填充尽可能多的轨道。auto-fit
:填充轨道并扩展以填满容器。<div class="container">
<div class="item">1div>
<div class="item">2div>
<div class="item">3div>
div>
.container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
gap: 10px;
}
效果:每列最小100px,容器宽度够时扩展为等宽列,不够时自动换行。
我们用Grid实现一个响应式图片画廊,桌面端3列,平板2列,手机1列。
<div class="gallery">
<div class="card">图片1div>
<div class="card">图片2div>
<div class="card">图片3div>
<div class="card">图片4div>
div>
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 20px;
padding: 20px;
}
.card {
background-color: #fff;
border: 1px solid #ddd;
padding: 20px;
text-align: center;
font-size: 16px;
}
/* 平板 */
@media (max-width: 768px) {
.gallery {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
}
/* 手机 */
@media (max-width: 480px) {
.gallery {
grid-template-columns: 1fr;
}
}
Q:Grid和Flexbox怎么选?
Q:如何调试Grid?
Q:Grid兼容性咋样?
-ms-
前缀,部分属性(如gap
)可能不支持。CSS Grid布局的核心在于灵活性和控制力。通过这篇文章,你应该已经掌握了Grid的每个核心属性及其用法,从grid-template-columns
到minmax()
,都能信手拈来。想彻底吃透Grid?试试以下练习:
fr
单位、minmax()
和auto-fill
调整布局。grid-template-areas
规划。place-items
和place-content
等简写属性,扩展你的知识。希望这篇指南让你对Grid布局信心满满!多写代码,多调试,Grid会成为你的布局好帮手!
点个收藏,关注前端结城,一起用代码点亮前端世界!