简体中文 繁體中文 English 日本語 Deutsch 한국 사람 بالعربية TÜRKÇE português คนไทย Français

站内搜索

搜索

活动公告

11-02 12:46
10-23 09:32
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,将及时处理!
10-23 09:31
10-23 09:28
通知:签到时间调整为每日4:00(东八区)
10-23 09:26

CSS3网格布局使用教程从入门到精通打造响应式网页布局的必备技能提升前端开发效率让布局变得简单高效

3万

主题

349

科技点

3万

积分

大区版主

木柜子打湿

积分
31898

三倍冰淇淋无人之境【一阶】财Doro小樱(小丑装)立华奏以外的星空【二阶】⑨的冰沙

发表于 2025-9-18 10:10:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

CSS3网格布局(Grid Layout)是CSS中最强大的布局系统之一。它是一个二维布局系统,可以同时处理行和列,使得创建复杂的网页布局变得简单而直观。与传统的布局方法(如浮动、定位)相比,网格布局提供了更加灵活和强大的布局能力,是现代前端开发中不可或缺的技能。

网格布局的出现彻底改变了我们构建网页的方式。它允许开发者轻松创建响应式设计,无需依赖复杂的CSS技巧或第三方框架。通过使用网格布局,我们可以用更少的代码实现更复杂的布局,大大提高开发效率。

本文将从基础概念开始,逐步深入到高级技巧,帮助你全面掌握CSS3网格布局,打造响应式网页布局的必备技能,提升前端开发效率,让布局变得简单高效。

CSS3网格布局基础概念

网格容器和网格项

在CSS网格布局中,我们首先需要理解两个核心概念:网格容器(Grid Container)和网格项(Grid Item)。

网格容器是应用了display: grid或display: inline-grid的元素。它成为所有直接子元素的网格上下文。

网格项是网格容器的直接子元素。这些元素将成为网格布局中的项目。

下面是一个简单的示例:
  1. <div class="grid-container">
  2.   <div class="grid-item">1</div>
  3.   <div class="grid-item">2</div>
  4.   <div class="grid-item">3</div>
  5.   <div class="grid-item">4</div>
  6. </div>
复制代码
  1. .grid-container {
  2.   display: grid;
  3. }
复制代码

在这个例子中,.grid-container是网格容器,而四个.grid-item元素是网格项。

网格线、网格轨道和网格区域

理解网格布局还需要掌握几个关键概念:

网格线(Grid Lines):构成网格结构的分界线。它们可以是水平的(行线)或垂直的(列线)。网格线从1开始编号,也可以使用负数从末尾开始编号。

网格轨道(Grid Track):两条相邻网格线之间的空间。网格轨道可以是行轨道(水平轨道)或列轨道(垂直轨道)。

网格单元格(Grid Cell):网格的最小单位,由行和列交叉形成的单个空间。

网格区域(Grid Area):由任意数量的网格单元格组成的矩形区域。

下面是一个可视化示例,帮助我们理解这些概念:
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 100px 100px 100px; /* 创建3列,每列100px宽 */
  4.   grid-template-rows: 50px 50px; /* 创建2行,每行50px高 */
  5. }
复制代码

这个CSS创建了一个2行3列的网格,共有6个网格单元格。网格线包括4条垂直线(1-4)和3条水平线(1-3)。

显式网格和隐式网格

显式网格(Explicit Grid):通过grid-template-rows、grid-template-columns和grid-template-areas属性明确定义的网格。

隐式网格(Implicit Grid):当网格项被放置到显式网格之外时,网格系统会自动创建额外的行和列来容纳这些项,这部分就是隐式网格。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 100px 100px; /* 显式定义2列 */
  4.   grid-auto-rows: 50px; /* 隐式行的高度 */
  5. }
复制代码

在这个例子中,我们显式定义了2列,但如果网格项超过2列,网格系统会自动创建额外的列(隐式网格)。grid-auto-rows属性定义了隐式行的高度。

创建基本网格布局

定义网格容器

要创建一个网格布局,首先需要定义一个网格容器。这可以通过设置display属性为grid或inline-grid来实现。
  1. .container {
  2.   display: grid; /* 块级网格容器 */
  3. }
  4. .inline-container {
  5.   display: inline-grid; /* 行内网格容器 */
  6. }
复制代码

display: grid会创建一个块级网格容器,而display: inline-grid则创建一个行内网格容器。大多数情况下,我们使用块级网格容器。

设置行和列

网格的核心在于行和列的设置。我们可以使用grid-template-rows和grid-template-columns属性来定义网格的行和列。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 100px 200px 100px; /* 三列,宽度分别为100px、200px、100px */
  4.   grid-template-rows: 50px 100px; /* 两行,高度分别为50px、100px */
  5. }
复制代码
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 20% 60% 20%; /* 三列,百分比宽度 */
  4.   grid-template-rows: 30% 70%; /* 两行,百分比高度 */
  5. }
复制代码

fr单位代表网格容器中可用空间的一部分。这是网格布局中非常实用的单位。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 1fr 2fr 1fr; /* 三列,比例为1:2:1 */
  4.   grid-template-rows: 1fr 3fr; /* 两行,比例为1:3 */
  5. }
复制代码

repeat()函数允许我们重复定义相同的轨道。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr); /* 等同于 1fr 1fr 1fr */
  4.   grid-template-rows: repeat(2, 100px); /* 等同于 100px 100px */
  5. }
复制代码

auto-fill和auto-fit关键字与repeat()函数结合使用,可以创建响应式网格布局。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  4.   /* 根据容器宽度自动填充尽可能多的列,每列最小200px,最大1fr */
  5. }
复制代码

auto-fill和auto-fit的区别在于:

• auto-fill会尽可能多地填充列,即使有些列是空的。
• auto-fit会扩展列以填充可用空间,不会留下空列。

网格间距

我们可以使用grid-column-gap、grid-row-gap和grid-gap属性来设置网格间距。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr);
  4.   grid-template-rows: repeat(2, 100px);
  5.   
  6.   grid-column-gap: 20px; /* 列间距 */
  7.   grid-row-gap: 15px; /* 行间距 */
  8.   
  9.   /* 或者使用简写形式 */
  10.   grid-gap: 15px 20px; /* 行间距 列间距 */
  11. }
复制代码

注意:最新的CSS规范中,这些属性已被重命名为column-gap、row-gap和gap,但为了向后兼容,旧名称仍然有效。

网格项的放置

通过网格线定位

我们可以通过指定网格项的起始和结束网格线来放置网格项。这可以通过grid-column-start、grid-column-end、grid-row-start和grid-row-end属性来实现。
  1. <div class="grid-container">
  2.   <div class="item-a">A</div>
  3.   <div class="item-b">B</div>
  4.   <div class="item-c">C</div>
  5.   <div class="item-d">D</div>
  6. </div>
复制代码
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(4, 1fr);
  4.   grid-template-rows: repeat(2, 100px);
  5.   grid-gap: 10px;
  6. }
  7. .item-a {
  8.   grid-column-start: 1;
  9.   grid-column-end: 3; /* 从第1列线到第3列线,跨越2列 */
  10.   grid-row-start: 1;
  11.   grid-row-end: 3; /* 从第1行线到第3行线,跨越2行 */
  12. }
  13. .item-b {
  14.   grid-column-start: 3;
  15.   grid-column-end: 5; /* 从第3列线到第5列线,跨越2列 */
  16. }
  17. .item-c {
  18.   grid-column-start: 1;
  19.   grid-column-end: 2;
  20.   grid-row-start: 2;
  21.   grid-row-end: 3;
  22. }
  23. .item-d {
  24.   grid-column-start: 2;
  25.   grid-column-end: 4;
  26.   grid-row-start: 2;
  27.   grid-row-end: 3;
  28. }
复制代码

我们也可以使用简写形式grid-column和grid-row:
  1. .item-a {
  2.   grid-column: 1 / 3; /* 从第1列线到第3列线 */
  3.   grid-row: 1 / 3; /* 从第1行线到第3行线 */
  4. }
  5. .item-b {
  6.   grid-column: 3 / 5; /* 从第3列线到第5列线 */
  7.   grid-row: 1 / 2; /* 从第1行线到第2行线 */
  8. }
复制代码

还可以使用span关键字来指定跨越的轨道数:
  1. .item-a {
  2.   grid-column: 1 / span 2; /* 从第1列线开始,跨越2列 */
  3.   grid-row: 1 / span 2; /* 从第1行线开始,跨越2行 */
  4. }
复制代码

通过网格区域定位

除了通过网格线定位,我们还可以通过命名网格区域来放置网格项。这需要使用grid-template-areas属性和grid-area属性。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(4, 1fr);
  4.   grid-template-rows: repeat(2, 100px);
  5.   grid-gap: 10px;
  6.   
  7.   /* 定义网格区域 */
  8.   grid-template-areas:
  9.     "header header header header"
  10.     "sidebar main main main";
  11. }
  12. .header {
  13.   grid-area: header; /* 将此元素放置在名为"header"的区域 */
  14. }
  15. .sidebar {
  16.   grid-area: sidebar; /* 将此元素放置在名为"sidebar"的区域 */
  17. }
  18. .main {
  19.   grid-area: main; /* 将此元素放置在名为"main"的区域 */
  20. }
复制代码

在grid-template-areas中,每个字符串代表一行,每个单词代表一个单元格。相同的单词表示它们属于同一个网格区域。使用点号.表示空单元格。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(4, 1fr);
  4.   grid-template-rows: repeat(3, 100px);
  5.   grid-gap: 10px;
  6.   
  7.   grid-template-areas:
  8.     "header header header header"
  9.     "sidebar main main ."
  10.     "footer footer footer footer";
  11. }
复制代码

自动放置

如果没有明确指定网格项的位置,网格系统会自动按照顺序放置它们。我们可以通过grid-auto-flow属性控制自动放置的行为。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr);
  4.   grid-auto-rows: 100px;
  5.   grid-gap: 10px;
  6.   
  7.   /* 控制自动放置行为 */
  8.   grid-auto-flow: row; /* 默认值,按行填充 */
  9.   /* grid-auto-flow: column; */ /* 按列填充 */
  10.   /* grid-auto-flow: row dense; */ /* 密集填充,尝试填补空白 */
  11.   /* grid-auto-flow: column dense; */ /* 按列密集填充 */
  12. }
复制代码

dense关键字会尝试填补网格中的空白,这可能会导致网格项的顺序与HTML中的顺序不同。

网格布局的高级特性

网格对齐

CSS网格布局提供了强大的对齐功能,可以控制网格项在网格轨道中的对齐方式。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr);
  4.   grid-template-rows: repeat(2, 100px);
  5.   grid-gap: 10px;
  6.   
  7.   /* 水平对齐整个网格 */
  8.   justify-content: start; /* 默认值,左对齐 */
  9.   /* justify-content: end; */ /* 右对齐 */
  10.   /* justify-content: center; */ /* 居中对齐 */
  11.   /* justify-content: stretch; */ /* 拉伸以填充容器 */
  12.   /* justify-content: space-around; */ /* 周围空间相等 */
  13.   /* justify-content: space-between; */ /* 两端对齐 */
  14.   /* justify-content: space-evenly; */ /* 所有空间相等 */
  15.   
  16.   /* 垂直对齐整个网格 */
  17.   align-content: start; /* 默认值,顶部对齐 */
  18.   /* align-content: end; */ /* 底部对齐 */
  19.   /* align-content: center; */ /* 居中对齐 */
  20.   /* align-content: stretch; */ /* 拉伸以填充容器 */
  21.   /* align-content: space-around; */ /* 周围空间相等 */
  22.   /* align-content: space-between; */ /* 两端对齐 */
  23.   /* align-content: space-evenly; */ /* 所有空间相等 */
  24. }
复制代码
  1. .grid-item {
  2.   /* 水平对齐单个网格项 */
  3.   justify-self: start; /* 默认值,左对齐 */
  4.   /* justify-self: end; */ /* 右对齐 */
  5.   /* justify-self: center; */ /* 居中对齐 */
  6.   /* justify-self: stretch; */ /* 拉伸以填充单元格 */
  7.   
  8.   /* 垂直对齐单个网格项 */
  9.   align-self: start; /* 默认值,顶部对齐 */
  10.   /* align-self: end; */ /* 底部对齐 */
  11.   /* align-self: center; */ /* 居中对齐 */
  12.   /* align-self: stretch; */ /* 拉伸以填充单元格 */
  13. }
复制代码
  1. .grid-item {
  2.   /* 同时设置水平和垂直对齐 */
  3.   place-self: start center; /* align-self justify-self */
  4. }
  5. .grid-container {
  6.   /* 同时设置整个网格的水平和垂直对齐 */
  7.   place-content: center space-between; /* align-content justify-content */
  8. }
复制代码

网格模板区域

网格模板区域(Grid Template Areas)是一种直观的方式来定义网格布局。通过给网格区域命名,我们可以创建复杂的布局结构。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(4, 1fr);
  4.   grid-template-rows: auto 1fr auto;
  5.   grid-gap: 10px;
  6.   
  7.   /* 定义网格区域 */
  8.   grid-template-areas:
  9.     "header header header header"
  10.     "sidebar main main main"
  11.     "footer footer footer footer";
  12.   
  13.   height: 100vh;
  14. }
  15. .header {
  16.   grid-area: header;
  17. }
  18. .sidebar {
  19.   grid-area: sidebar;
  20. }
  21. .main {
  22.   grid-area: main;
  23. }
  24. .footer {
  25.   grid-area: footer;
  26. }
复制代码

网格模板区域的命名必须遵循以下规则:

1. 名称可以是任何有效的自定义标识符。
2. 点号.表示空单元格。
3. 区域必须是矩形的,不能创建L形或其他非矩形区域。
4. 相同名称的区域必须连接在一起形成矩形。

嵌套网格

网格项本身也可以成为网格容器,从而创建嵌套网格。这允许我们构建更复杂的布局结构。
  1. <div class="outer-grid">
  2.   <div class="item">Item 1</div>
  3.   <div class="item nested-grid">
  4.     <div class="nested-item">Nested 1</div>
  5.     <div class="nested-item">Nested 2</div>
  6.     <div class="nested-item">Nested 3</div>
  7.     <div class="nested-item">Nested 4</div>
  8.   </div>
  9.   <div class="item">Item 3</div>
  10. </div>
复制代码
  1. .outer-grid {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr);
  4.   grid-template-rows: repeat(2, 200px);
  5.   grid-gap: 10px;
  6. }
  7. .nested-grid {
  8.   display: grid;
  9.   grid-template-columns: repeat(2, 1fr);
  10.   grid-template-rows: repeat(2, 1fr);
  11.   grid-gap: 5px;
  12. }
复制代码

子网格(subgrid)

子网格是CSS网格布局的一个新特性,允许嵌套网格继承父网格的轨道定义。这使得嵌套网格可以与父网格完美对齐。

注意:截至2023年,子网格的支持度还不够广泛,但在现代浏览器中已经可用。
  1. <div class="parent-grid">
  2.   <div class="item">Item 1</div>
  3.   <div class="item subgrid">
  4.     <div class="subitem">Subitem 1</div>
  5.     <div class="subitem">Subitem 2</div>
  6.     <div class="subitem">Subitem 3</div>
  7.   </div>
  8.   <div class="item">Item 3</div>
  9. </div>
复制代码
  1. .parent-grid {
  2.   display: grid;
  3.   grid-template-columns: repeat(3, 1fr);
  4.   grid-template-rows: repeat(2, 200px);
  5.   grid-gap: 10px;
  6. }
  7. .subgrid {
  8.   display: grid;
  9.   grid-row: span 2; /* 跨越两行 */
  10.   grid-template-rows: subgrid; /* 继承父网格的行定义 */
  11.   grid-template-columns: subgrid; /* 继承父网格的列定义 */
  12. }
复制代码

响应式网格布局

媒体查询与网格

媒体查询是创建响应式布局的关键工具。结合CSS网格,我们可以根据不同的屏幕尺寸调整网格布局。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: 1fr;
  4.   grid-gap: 20px;
  5. }
  6. /* 在中等屏幕上 */
  7. @media (min-width: 768px) {
  8.   .grid-container {
  9.     grid-template-columns: repeat(2, 1fr);
  10.   }
  11. }
  12. /* 在大屏幕上 */
  13. @media (min-width: 1024px) {
  14.   .grid-container {
  15.     grid-template-columns: repeat(4, 1fr);
  16.   }
  17. }
复制代码

自动填充和自动适应

auto-fill和auto-fit关键字与minmax()函数结合使用,可以创建灵活的响应式网格布局。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
  4.   grid-gap: 20px;
  5. }
复制代码

这个例子会创建一个网格,其中每列的最小宽度为250px,最大宽度为1fr(可用空间的一部分)。浏览器会根据容器宽度自动计算可以容纳多少列。

auto-fill和auto-fit的区别在于:

• auto-fill会尽可能多地创建列,即使有些列是空的。
• auto-fit会扩展列以填充可用空间,不会留下空列。
  1. /* 使用auto-fill */
  2. .grid-fill {
  3.   display: grid;
  4.   grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  5. }
  6. /* 使用auto-fit */
  7. .grid-fit {
  8.   display: grid;
  9.   grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
  10. }
复制代码

密度函数(minmax、fit-content等)

CSS网格布局提供了一些有用的函数,可以帮助我们创建更灵活的布局。

minmax()函数定义了一个大小范围,最小值和最大值之间。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: minmax(200px, 1fr) 3fr;
  4.   /* 第一列最小200px,最大1fr;第二列固定3fr */
  5. }
复制代码

fit-content()函数相当于min(maximum size, max(minimum size, argument)),它会根据内容自动调整大小,但不超过指定的值。
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: fit-content(300px) 1fr;
  4.   /* 第一列根据内容调整,但不超过300px;第二列占据剩余空间 */
  5. }
复制代码

这些CSS函数也可以在网格布局中使用:
  1. .grid-container {
  2.   display: grid;
  3.   grid-template-columns: min(100px, 10%) max(200px, 25%) clamp(150px, 20%, 300px);
  4.   /* 第一列:100px和10%中较小的值
  5.      第二列:200px和25%中较大的值
  6.      第三列:不小于150px,不大于300px,首选20% */
  7. }
复制代码

网格布局与其他CSS布局技术的比较

Flexbox vs Grid

Flexbox和Grid都是强大的CSS布局工具,但它们有不同的适用场景。

• 一维布局系统(行或列)
• 适合组件级别的布局
• 对于内容大小不确定的情况表现良好
• 擅长分配空间和对齐项目

• 二维布局系统(行和列)
• 适合页面级别的布局
• 对于整体页面布局设计更加直观
• 擅长重叠和对齐项目
  1. /* Flexbox适合的场景:导航栏 */
  2. .nav {
  3.   display: flex;
  4.   justify-content: space-between;
  5.   align-items: center;
  6. }
  7. /* Grid适合的场景:整体页面布局 */
  8. .page {
  9.   display: grid;
  10.   grid-template-areas:
  11.     "header header header"
  12.     "sidebar main main"
  13.     "footer footer footer";
  14.   grid-template-columns: 200px 1fr 1fr;
  15.   grid-template-rows: auto 1fr auto;
  16. }
复制代码

何时使用网格布局

网格布局特别适合以下场景:

1. 复杂页面布局:当需要创建复杂的页面结构时,如多列布局、不规则布局等。
  1. .magazine-layout {
  2.   display: grid;
  3.   grid-template-columns: repeat(12, 1fr);
  4.   grid-template-rows: auto;
  5.   grid-gap: 20px;
  6. }
  7. .featured-article {
  8.   grid-column: 1 / 7;
  9.   grid-row: 1 / 3;
  10. }
  11. .secondary-article {
  12.   grid-column: 7 / 13;
  13.   grid-row: 1;
  14. }
  15. .tertiary-article {
  16.   grid-column: 7 / 10;
  17.   grid-row: 2;
  18. }
  19. .quaternary-article {
  20.   grid-column: 10 / 13;
  21.   grid-row: 2;
  22. }
复制代码

1. 响应式设计:当需要根据屏幕尺寸调整布局时。
  1. .responsive-grid {
  2.   display: grid;
  3.   grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  4.   grid-gap: 20px;
  5. }
复制代码

1. 对齐和重叠:当需要精确控制元素的位置和对齐方式时。
  1. .overlay-grid {
  2.   display: grid;
  3.   grid-template-columns: 1fr;
  4.   grid-template-rows: 1fr;
  5. }
  6. .text-overlay {
  7.   grid-column: 1;
  8.   grid-row: 1;
  9.   z-index: 2;
  10.   justify-self: center;
  11.   align-self: center;
  12. }
  13. .background-image {
  14.   grid-column: 1;
  15.   grid-row: 1;
  16.   z-index: 1;
  17. }
复制代码

1. 表格布局:当需要创建类似表格的布局,但不需要使用HTML表格时。
  1. .data-grid {
  2.   display: grid;
  3.   grid-template-columns: repeat(4, 1fr);
  4.   grid-gap: 10px;
  5. }
  6. .header {
  7.   font-weight: bold;
  8.   background-color: #f0f0f0;
  9. }
复制代码

实战案例

典型网页布局实现

让我们使用CSS网格布局创建一个典型的网页布局,包括页眉、导航、主内容区、侧边栏和页脚。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>Grid Layout Example</title>
  7.   <style>
  8.     * {
  9.       margin: 0;
  10.       padding: 0;
  11.       box-sizing: border-box;
  12.     }
  13.    
  14.     body {
  15.       font-family: Arial, sans-serif;
  16.       line-height: 1.6;
  17.       color: #333;
  18.     }
  19.    
  20.     .page-container {
  21.       display: grid;
  22.       grid-template-areas:
  23.         "header header"
  24.         "nav nav"
  25.         "sidebar main"
  26.         "footer footer";
  27.       grid-template-columns: 250px 1fr;
  28.       grid-template-rows: auto auto 1fr auto;
  29.       min-height: 100vh;
  30.       gap: 10px;
  31.     }
  32.    
  33.     header {
  34.       grid-area: header;
  35.       background-color: #4a89dc;
  36.       color: white;
  37.       padding: 1rem;
  38.     }
  39.    
  40.     nav {
  41.       grid-area: nav;
  42.       background-color: #5d9cec;
  43.       color: white;
  44.       padding: 0.5rem;
  45.     }
  46.    
  47.     nav ul {
  48.       list-style: none;
  49.       display: flex;
  50.       gap: 1rem;
  51.     }
  52.    
  53.     .sidebar {
  54.       grid-area: sidebar;
  55.       background-color: #f5f7fa;
  56.       padding: 1rem;
  57.     }
  58.    
  59.     main {
  60.       grid-area: main;
  61.       padding: 1rem;
  62.     }
  63.    
  64.     footer {
  65.       grid-area: footer;
  66.       background-color: #4a89dc;
  67.       color: white;
  68.       padding: 1rem;
  69.       text-align: center;
  70.     }
  71.    
  72.     /* 响应式设计 */
  73.     @media (max-width: 768px) {
  74.       .page-container {
  75.         grid-template-areas:
  76.           "header"
  77.           "nav"
  78.           "main"
  79.           "sidebar"
  80.           "footer";
  81.         grid-template-columns: 1fr;
  82.         grid-template-rows: auto auto 1fr auto auto;
  83.       }
  84.       
  85.       nav ul {
  86.         flex-direction: column;
  87.         gap: 0.5rem;
  88.       }
  89.     }
  90.   </style>
  91. </head>
  92. <body>
  93.   <div class="page-container">
  94.     <header>
  95.       <h1>网站标题</h1>
  96.     </header>
  97.    
  98.     <nav>
  99.       <ul>
  100.         <li><a href="#">首页</a></li>
  101.         <li><a href="#">关于</a></li>
  102.         <li><a href="#">服务</a></li>
  103.         <li><a href="#">联系</a></li>
  104.       </ul>
  105.     </nav>
  106.    
  107.     <aside class="sidebar">
  108.       <h2>侧边栏</h2>
  109.       <p>这是侧边栏内容,可以包含链接、广告或其他信息。</p>
  110.     </aside>
  111.    
  112.     <main>
  113.       <h2>主要内容</h2>
  114.       <p>这是网站的主要内容区域。可以包含文章、产品信息或其他重要内容。</p>
  115.       <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nullam auctor, nisl eget ultricies tincidunt, nisl nisl aliquam nisl, eget ultricies nisl nisl eget nisl.</p>
  116.     </main>
  117.    
  118.     <footer>
  119.       <p>&copy; 2023 网站名称. 保留所有权利。</p>
  120.     </footer>
  121.   </div>
  122. </body>
  123. </html>
复制代码

卡片式布局

卡片式布局在现代网页设计中非常常见,我们可以使用CSS网格轻松实现。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>Card Grid Layout</title>
  7.   <style>
  8.     * {
  9.       margin: 0;
  10.       padding: 0;
  11.       box-sizing: border-box;
  12.     }
  13.    
  14.     body {
  15.       font-family: Arial, sans-serif;
  16.       line-height: 1.6;
  17.       color: #333;
  18.       background-color: #f5f7fa;
  19.       padding: 20px;
  20.     }
  21.    
  22.     .card-grid {
  23.       display: grid;
  24.       grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  25.       gap: 20px;
  26.       max-width: 1200px;
  27.       margin: 0 auto;
  28.     }
  29.    
  30.     .card {
  31.       background-color: white;
  32.       border-radius: 8px;
  33.       box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
  34.       overflow: hidden;
  35.       transition: transform 0.3s ease;
  36.     }
  37.    
  38.     .card:hover {
  39.       transform: translateY(-5px);
  40.     }
  41.    
  42.     .card-image {
  43.       height: 200px;
  44.       background-size: cover;
  45.       background-position: center;
  46.     }
  47.    
  48.     .card-content {
  49.       padding: 20px;
  50.     }
  51.    
  52.     .card-title {
  53.       font-size: 1.5rem;
  54.       margin-bottom: 10px;
  55.     }
  56.    
  57.     .card-text {
  58.       margin-bottom: 15px;
  59.     }
  60.    
  61.     .card-button {
  62.       display: inline-block;
  63.       background-color: #4a89dc;
  64.       color: white;
  65.       padding: 8px 16px;
  66.       border-radius: 4px;
  67.       text-decoration: none;
  68.       transition: background-color 0.3s ease;
  69.     }
  70.    
  71.     .card-button:hover {
  72.       background-color: #3a70c2;
  73.     }
  74.    
  75.     /* 特色卡片 - 跨越两列 */
  76.     .featured-card {
  77.       grid-column: span 2;
  78.     }
  79.    
  80.     @media (max-width: 768px) {
  81.       .featured-card {
  82.         grid-column: span 1;
  83.       }
  84.     }
  85.   </style>
  86. </head>
  87. <body>
  88.   <h1 style="text-align: center; margin-bottom: 30px;">卡片网格布局</h1>
  89.   
  90.   <div class="card-grid">
  91.     <div class="card featured-card">
  92.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/featured/600/400.jpg');"></div>
  93.       <div class="card-content">
  94.         <h2 class="card-title">特色卡片</h2>
  95.         <p class="card-text">这是一个特色卡片,在较大屏幕上跨越两列。它可以用于展示重要内容或特色项目。</p>
  96.         <a href="#" class="card-button">了解更多</a>
  97.       </div>
  98.     </div>
  99.    
  100.     <div class="card">
  101.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/card1/300/200.jpg');"></div>
  102.       <div class="card-content">
  103.         <h2 class="card-title">卡片 1</h2>
  104.         <p class="card-text">这是普通卡片的内容。网格布局会自动调整列数以适应不同的屏幕尺寸。</p>
  105.         <a href="#" class="card-button">查看详情</a>
  106.       </div>
  107.     </div>
  108.    
  109.     <div class="card">
  110.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/card2/300/200.jpg');"></div>
  111.       <div class="card-content">
  112.         <h2 class="card-title">卡片 2</h2>
  113.         <p class="card-text">这是另一个普通卡片。所有卡片都会自动对齐,创建整洁的网格布局。</p>
  114.         <a href="#" class="card-button">查看详情</a>
  115.       </div>
  116.     </div>
  117.    
  118.     <div class="card">
  119.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/card3/300/200.jpg');"></div>
  120.       <div class="card-content">
  121.         <h2 class="card-title">卡片 3</h2>
  122.         <p class="card-text">使用auto-fill和minmax函数,我们可以创建响应式网格,适应不同的屏幕尺寸。</p>
  123.         <a href="#" class="card-button">查看详情</a>
  124.       </div>
  125.     </div>
  126.    
  127.     <div class="card">
  128.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/card4/300/200.jpg');"></div>
  129.       <div class="card-content">
  130.         <h2 class="card-title">卡片 4</h2>
  131.         <p class="card-text">CSS网格布局使得创建复杂的响应式布局变得简单,无需使用浮动或定位技巧。</p>
  132.         <a href="#" class="card-button">查看详情</a>
  133.       </div>
  134.     </div>
  135.    
  136.     <div class="card">
  137.       <div class="card-image" style="background-image: url('https://picsum.photos/seed/card5/300/200.jpg');"></div>
  138.       <div class="card-content">
  139.         <h2 class="card-title">卡片 5</h2>
  140.         <p class="card-text">网格布局还支持对齐和间距控制,使得创建美观的布局变得容易。</p>
  141.         <a href="#" class="card-button">查看详情</a>
  142.       </div>
  143.     </div>
  144.   </div>
  145. </body>
  146. </html>
复制代码

复杂的杂志式布局

杂志式布局通常包含不同大小的文章卡片,形成视觉上有趣的设计。我们可以使用CSS网格轻松实现这种复杂的布局。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4.   <meta charset="UTF-8">
  5.   <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6.   <title>Magazine Layout with Grid</title>
  7.   <style>
  8.     * {
  9.       margin: 0;
  10.       padding: 0;
  11.       box-sizing: border-box;
  12.     }
  13.    
  14.     body {
  15.       font-family: 'Georgia', serif;
  16.       line-height: 1.6;
  17.       color: #333;
  18.       background-color: #f8f8f8;
  19.     }
  20.    
  21.     .magazine-container {
  22.       max-width: 1400px;
  23.       margin: 0 auto;
  24.       padding: 20px;
  25.     }
  26.    
  27.     .magazine-header {
  28.       text-align: center;
  29.       margin-bottom: 40px;
  30.     }
  31.    
  32.     .magazine-title {
  33.       font-size: 3rem;
  34.       margin-bottom: 10px;
  35.       font-weight: 300;
  36.       letter-spacing: 2px;
  37.     }
  38.    
  39.     .magazine-date {
  40.       color: #777;
  41.       font-size: 1rem;
  42.       text-transform: uppercase;
  43.       letter-spacing: 1px;
  44.     }
  45.    
  46.     .magazine-grid {
  47.       display: grid;
  48.       grid-template-columns: repeat(12, 1fr);
  49.       grid-auto-rows: minmax(100px, auto);
  50.       gap: 20px;
  51.     }
  52.    
  53.     .article {
  54.       background-color: white;
  55.       border-radius: 4px;
  56.       overflow: hidden;
  57.       box-shadow: 0 2px 4px rgba(0,0,0,0.1);
  58.       transition: transform 0.3s ease;
  59.     }
  60.    
  61.     .article:hover {
  62.       transform: translateY(-5px);
  63.     }
  64.    
  65.     .article-image {
  66.       width: 100%;
  67.       height: 100%;
  68.       object-fit: cover;
  69.     }
  70.    
  71.     .article-content {
  72.       padding: 20px;
  73.     }
  74.    
  75.     .article-category {
  76.       color: #e74c3c;
  77.       font-size: 0.8rem;
  78.       text-transform: uppercase;
  79.       letter-spacing: 1px;
  80.       margin-bottom: 10px;
  81.     }
  82.    
  83.     .article-title {
  84.       font-size: 1.5rem;
  85.       margin-bottom: 10px;
  86.       line-height: 1.2;
  87.     }
  88.    
  89.     .article-excerpt {
  90.       color: #555;
  91.       margin-bottom: 15px;
  92.     }
  93.    
  94.     .article-meta {
  95.       font-size: 0.9rem;
  96.       color: #777;
  97.     }
  98.    
  99.     /* 特色文章 - 大图 */
  100.     .featured-article {
  101.       grid-column: span 6;
  102.       grid-row: span 2;
  103.       display: flex;
  104.       flex-direction: column;
  105.     }
  106.    
  107.     .featured-article .article-image {
  108.       height: 300px;
  109.     }
  110.    
  111.     .featured-article .article-title {
  112.       font-size: 2rem;
  113.     }
  114.    
  115.     /* 次要文章 - 中等大小 */
  116.     .secondary-article {
  117.       grid-column: span 3;
  118.       grid-row: span 2;
  119.       display: flex;
  120.       flex-direction: column;
  121.     }
  122.    
  123.     .secondary-article .article-image {
  124.       height: 200px;
  125.     }
  126.    
  127.     /* 小文章 */
  128.     .small-article {
  129.       grid-column: span 3;
  130.       display: flex;
  131.       flex-direction: row;
  132.       align-items: center;
  133.     }
  134.    
  135.     .small-article .article-image {
  136.       width: 120px;
  137.       height: 120px;
  138.       flex-shrink: 0;
  139.     }
  140.    
  141.     .small-article .article-content {
  142.       flex-grow: 1;
  143.     }
  144.    
  145.     .small-article .article-title {
  146.       font-size: 1.2rem;
  147.     }
  148.    
  149.     /* 横幅文章 */
  150.     .banner-article {
  151.       grid-column: span 12;
  152.       display: flex;
  153.       flex-direction: row;
  154.       height: 250px;
  155.     }
  156.    
  157.     .banner-article .article-image {
  158.       width: 50%;
  159.       height: 100%;
  160.     }
  161.    
  162.     .banner-article .article-content {
  163.       width: 50%;
  164.       display: flex;
  165.       flex-direction: column;
  166.       justify-content: center;
  167.     }
  168.    
  169.     .banner-article .article-title {
  170.       font-size: 2.5rem;
  171.     }
  172.    
  173.     /* 响应式设计 */
  174.     @media (max-width: 1024px) {
  175.       .featured-article {
  176.         grid-column: span 12;
  177.       }
  178.       
  179.       .secondary-article {
  180.         grid-column: span 6;
  181.       }
  182.       
  183.       .small-article {
  184.         grid-column: span 6;
  185.       }
  186.     }
  187.    
  188.     @media (max-width: 768px) {
  189.       .magazine-title {
  190.         font-size: 2rem;
  191.       }
  192.       
  193.       .secondary-article {
  194.         grid-column: span 12;
  195.       }
  196.       
  197.       .small-article {
  198.         grid-column: span 12;
  199.       }
  200.       
  201.       .banner-article {
  202.         flex-direction: column;
  203.         height: auto;
  204.       }
  205.       
  206.       .banner-article .article-image,
  207.       .banner-article .article-content {
  208.         width: 100%;
  209.       }
  210.       
  211.       .banner-article .article-image {
  212.         height: 200px;
  213.       }
  214.     }
  215.   </style>
  216. </head>
  217. <body>
  218.   <div class="magazine-container">
  219.     <header class="magazine-header">
  220.       <h1 class="magazine-title">现代生活杂志</h1>
  221.       <p class="magazine-date">2023年10月</p>
  222.     </header>
  223.    
  224.     <div class="magazine-grid">
  225.       <!-- 特色文章 -->
  226.       <article class="article featured-article">
  227.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/bebe58efba24475b.webp" alt="特色文章" class="article-image">
  228.         <div class="article-content">
  229.           <p class="article-category">生活方式</p>
  230.           <h2 class="article-title">探索极简主义生活:如何通过减少物质拥有来增加幸福感</h2>
  231.           <p class="article-excerpt">在这个物质丰富的时代,越来越多的人开始转向极简主义生活方式。本文探讨了极简主义如何帮助我们专注于真正重要的事物,从而提高生活质量和幸福感。</p>
  232.           <p class="article-meta">作者:张明 | 10月15日</p>
  233.         </div>
  234.       </article>
  235.       
  236.       <!-- 次要文章 1 -->
  237.       <article class="article secondary-article">
  238.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/1cc4033dd9fe4243.webp" alt="次要文章1" class="article-image">
  239.         <div class="article-content">
  240.           <p class="article-category">科技</p>
  241.           <h2 class="article-title">人工智能在日常生活中的应用:从智能家居到个人助理</h2>
  242.           <p class="article-excerpt">人工智能技术正以前所未有的速度融入我们的日常生活。本文探讨了AI如何改变我们的家庭、工作和娱乐方式。</p>
  243.           <p class="article-meta">作者:李华 | 10月12日</p>
  244.         </div>
  245.       </article>
  246.       
  247.       <!-- 次要文章 2 -->
  248.       <article class="article secondary-article">
  249.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/1b4859d1278f424f.webp" alt="次要文章2" class="article-image">
  250.         <div class="article-content">
  251.           <p class="article-category">健康</p>
  252.           <h2 class="article-title">心理健康的重要性:如何在忙碌的生活中保持心理平衡</h2>
  253.           <p class="article-excerpt">在快节奏的现代生活中,心理健康问题日益突出。本文提供了一些实用的建议,帮助你在日常生活中保持心理平衡。</p>
  254.           <p class="article-meta">作者:王芳 | 10月10日</p>
  255.         </div>
  256.       </article>
  257.       
  258.       <!-- 小文章 1 -->
  259.       <article class="article small-article">
  260.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/6798d85487ca4b0a.webp" alt="小文章1" class="article-image">
  261.         <div class="article-content">
  262.           <p class="article-category">旅行</p>
  263.           <h2 class="article-title">隐藏的宝石:探索不为人知的旅行目的地</h2>
  264.           <p class="article-meta">作者:刘强 | 10月8日</p>
  265.         </div>
  266.       </article>
  267.       
  268.       <!-- 小文章 2 -->
  269.       <article class="article small-article">
  270.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/f1daeb7db95141b3.webp" alt="小文章2" class="article-image">
  271.         <div class="article-content">
  272.           <p class="article-category">美食</p>
  273.           <h2 class="article-title">家常菜的精致演绎:简单食材创造美味</h2>
  274.           <p class="article-meta">作者:陈静 | 10月5日</p>
  275.         </div>
  276.       </article>
  277.       
  278.       <!-- 小文章 3 -->
  279.       <article class="article small-article">
  280.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/9762a6d1b73f4754.webp" alt="小文章3" class="article-image">
  281.         <div class="article-content">
  282.           <p class="article-category">时尚</p>
  283.           <h2 class="article-title">可持续时尚:环保与美学的完美结合</h2>
  284.           <p class="article-meta">作者:赵敏 | 10月3日</p>
  285.         </div>
  286.       </article>
  287.       
  288.       <!-- 小文章 4 -->
  289.       <article class="article small-article">
  290.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/98549e034c8a496e.webp" alt="小文章4" class="article-image">
  291.         <div class="article-content">
  292.           <p class="article-category">艺术</p>
  293.           <h2 class="article-title">数字艺术的崛起:科技与创意的融合</h2>
  294.           <p class="article-meta">作者:孙伟 | 10月1日</p>
  295.         </div>
  296.       </article>
  297.       
  298.       <!-- 横幅文章 -->
  299.       <article class="article banner-article">
  300.         <img src="https://io.pixtech.cc/pixtech/forum/202509/18/e2ed0556127a44fa.webp" alt="横幅文章" class="article-image">
  301.         <div class="article-content">
  302.           <p class="article-category">特别报道</p>
  303.           <h2 class="article-title">未来城市:智能技术如何重塑我们的居住环境</h2>
  304.           <p class="article-excerpt">随着全球城市化进程的加速,智能技术正在改变我们的城市生活方式。从智能交通到绿色建筑,从数字化管理到社区互动,未来城市将更加高效、可持续和宜居。</p>
  305.           <p class="article-meta">作者:周杰 | 9月28日</p>
  306.         </div>
  307.       </article>
  308.     </div>
  309.   </div>
  310. </body>
  311. </html>
复制代码

性能优化与最佳实践

避免过度嵌套

虽然网格布局支持嵌套,但过度嵌套可能会导致性能问题和代码复杂性。尽量保持网格结构的简单和扁平化。
  1. /* 不推荐:过度嵌套的网格 */
  2. .outer-grid {
  3.   display: grid;
  4. }
  5. .nested-grid {
  6.   display: grid;
  7. }
  8. .deeply-nested-grid {
  9.   display: grid;
  10. }
  11. /* 推荐:使用单一网格布局 */
  12. .complex-grid {
  13.   display: grid;
  14.   grid-template-areas:
  15.     "header header header"
  16.     "sidebar main main"
  17.     "sidebar footer footer";
  18. }
复制代码

合理使用fr单位

fr单位虽然方便,但在某些情况下可能导致性能问题。特别是在大型网格中,浏览器需要计算每个fr单位的实际大小。
  1. /* 在大型网格中,混合使用固定单位和fr单位 */
  2. .large-grid {
  3.   display: grid;
  4.   grid-template-columns: 200px repeat(10, minmax(100px, 1fr)) 200px;
  5. }
复制代码

使用will-change优化

对于复杂的网格动画,可以使用will-change属性来优化性能。
  1. .animated-grid-item {
  2.   will-change: transform;
  3.   transition: transform 0.3s ease;
  4. }
  5. .animated-grid-item:hover {
  6.   transform: scale(1.05);
  7. }
复制代码

避免频繁的布局重排

频繁改变网格容器的属性(如grid-template-columns或grid-template-rows)会导致浏览器重新计算整个网格布局,这可能影响性能。
  1. /* 不推荐:频繁改变网格模板 */
  2. .grid-container {
  3.   display: grid;
  4.   grid-template-columns: 1fr 1fr;
  5. }
  6. .grid-container:hover {
  7.   grid-template-columns: 2fr 1fr; /* 这会导致整个网格重新计算 */
  8. }
  9. /* 推荐:使用transform或其他不会触发重排的属性 */
  10. .grid-item {
  11.   transition: transform 0.3s ease;
  12. }
  13. .grid-item:hover {
  14.   transform: scale(1.05);
  15. }
复制代码

使用CSS变量提高可维护性

CSS变量(自定义属性)可以大大提高网格布局的可维护性和灵活性。
  1. :root {
  2.   --grid-gap: 20px;
  3.   --card-min-width: 300px;
  4. }
  5. .card-grid {
  6.   display: grid;
  7.   grid-template-columns: repeat(auto-fill, minmax(var(--card-min-width), 1fr));
  8.   gap: var(--grid-gap);
  9. }
  10. /* 在媒体查询中调整变量 */
  11. @media (max-width: 768px) {
  12.   :root {
  13.     --grid-gap: 15px;
  14.     --card-min-width: 250px;
  15.   }
  16. }
复制代码

优雅降级和渐进增强

虽然CSS网格布局得到了广泛支持,但仍需考虑不支持网格布局的浏览器。可以使用@supports规则提供优雅降级。
  1. /* 基本样式 - 不支持网格的浏览器 */
  2. .fallback-layout {
  3.   display: flex;
  4.   flex-wrap: wrap;
  5. }
  6. .fallback-item {
  7.   width: 300px;
  8.   margin: 10px;
  9. }
  10. /* 支持网格的浏览器 */
  11. @supports (display: grid) {
  12.   .grid-layout {
  13.     display: grid;
  14.     grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  15.     gap: 20px;
  16.   }
  17.   
  18.   .grid-item {
  19.     width: auto;
  20.     margin: 0;
  21.   }
  22. }
复制代码

总结与展望

CSS3网格布局是现代前端开发中不可或缺的技能。它提供了一个强大而灵活的布局系统,使我们能够轻松创建复杂的响应式布局,大大提高了开发效率。

通过本文的学习,我们了解了网格布局的基本概念、创建方法、高级特性以及实际应用。从简单的网格容器到复杂的杂志式布局,网格布局都能胜任。与传统的布局方法相比,网格布局更加直观、灵活和强大。

未来,随着CSS网格布局的进一步发展,我们可以期待更多功能的加入,如更好的子网格支持、更丰富的对齐选项等。同时,网格布局与其他CSS技术(如Flexbox、CSS变量等)的结合使用,将使我们的布局能力更加强大。

掌握CSS3网格布局不仅是一项技术技能,更是一种思维方式。它改变了我们思考和构建网页布局的方式,使我们能够更加专注于创意和用户体验,而不是布局的复杂性。

无论你是前端开发新手还是经验丰富的开发者,CSS3网格布局都值得你投入时间去学习和掌握。它将成为你打造响应式网页布局的必备技能,帮助你提升前端开发效率,让布局变得简单高效。
回复

使用道具 举报

4

主题

13

科技点

307

积分

候风辨气

积分
307

三倍冰淇淋柴到了

发表于 2025-9-18 11:16:31 | 显示全部楼层
Fumo Fumo
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

频道订阅

频道订阅

加入社群

加入社群

联系我们|TG频道|RSS

Powered by Pixtech

© 2025 Pixtech Team.