查看: 66|回复: 1

CSS3 Grid网格布局详解:从入门到实战的二维布局系统

[复制链接]
发表于 3 小时前 | 显示全部楼层 |阅读模式
CSS3的Grid网格布局是当前最强大的二维布局系统,它能同时控制行和列,彻底解决了以往使用table、浮动、定位等Hack方式带来的布局痛点。本文将从基本概念到容器属性与项目属性的全面解析,带你掌握Grid布局的核心用法。

一、Grid网格布局的基本概念
Grid布局将容器划分为行和列,交叉形成单元格,每个网格项目可以精准定位到任意单元格。与Flexbox的一维轴线布局不同,Grid是为复杂的二维布局而生的CSS模块。

关键术语:
- 网格容器:设置display:grid或display:inline-grid的元素。
- 网格项目:网格容器内的直接子元素。
- 行和列:容器水平方向为行(row),垂直方向为列(column)。
- 单元格:行与列的交叉区域。
- 网格线:划分行和列的线,可命名用于项目定位。

二、容器属性详解
1. display属性
  1. .container {
  2.   display: grid; /* 块级网格 */
  3.   /* 或 inline-grid(行内网格) */
  4.   /* 或 subgrid(嵌套网格) */
  5. }
复制代码
注意:在grid容器上设置column、float、clear、vertical-align无效。

2. grid-template-columns / grid-template-rows
定义列宽和行高,值用空格分隔。
  1. .container {
  2.   display: grid;
  3.   grid-template-rows: 100px 100px 100px;
  4.   grid-template-columns: 100px 100px 100px;
  5. }
复制代码
上述代码生成3行3列,行高和列宽均为100px。

3. repeat()函数
简化重复值,例如 repeat(3, 100px) 等同于 100px 100px 100px。

4. auto-fill 与 auto-fit
两者都会尽量生成更多的列或行,区别在于:
- auto-fill:即使单元格无内容也会保留空间,尽量填满容器。
- auto-fit:无内容的单元格列宽会被收缩为0,只保留有内容的单元格。
  1. .container {
  2.   grid-template-columns: repeat(auto-fill, 100px);
  3. }
复制代码
实际应用中auto-fit更常用,因为它不会产生空白列。

5. fr关键字
fr表示片段,按比例分配剩余空间。例如1fr 2fr 3fr表示第二列是第一列的2倍,第三列是第一列的3倍。

6. minmax()和auto
- minmax(300px, 1fr):列宽不小于300px,不大于1fr。
- auto:由浏览器自动决定,默认吸收剩余空间。
注意:当同时使用auto、fr、minmax时,优先级为 minmax > fr > auto。为保障最小空间,网格可能会超出容器。

7. 网格线命名
用方括号为网格线命名,项目可通过名称定位。
  1. .container {
  2.   grid-template-columns: [col-1] 100px [col-2] auto [col-3] 100px [col-4];
  3.   grid-template-rows: [row-1] 100px [row-2] 100px [row-3] 100px [row-4];
  4. }
复制代码

8. gap / row-gap / column-gap
设置行列间距。
  1. .container {
  2.   row-gap: 12px;
  3.   column-gap: 12px;
  4.   /* 简写:gap: 12px 12px; 或 gap: 12px;(行列相同) */
  5. }
复制代码

9. grid-auto-flow
控制项目放置顺序,默认row(先行后列),可选column,以及row dense/column dense(密集填充)。

10. grid-template-areas
将单元格划分成命名区域,方便项目快速定位。
  1. .container {
  2.   grid-template-columns: repeat(3, 100px);
  3.   grid-template-rows: repeat(3, 100px);
  4.   grid-template-areas:
  5.     "a b c"
  6.     "d e f"
  7.     "g h i";
  8. }
复制代码
用点号表示空单元格。

11. justify-items / align-items / place-items
控制单元格内内容的水平/垂直对齐。
  1. .container {
  2.   justify-items: start | end | center | stretch;
  3.   align-items: start | end | center | stretch;
  4.   place-items: <align> <justify>; /* 只写一个值则两值相同 */
  5. }
复制代码

12. justify-content / align-content / place-content
控制整个网格在容器中的对齐方式,与flexbox类似。
  1. .container {
  2.   justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  3.   align-content: ...;
  4. }
复制代码

13. grid-auto-rows / grid-auto-columns
当项目超出定义的网格时,自动生成的行/列尺寸。
  1. .container {
  2.   grid-template-columns: repeat(3, 100px);
  3.   grid-template-rows: repeat(3, 100px);
  4.   grid-auto-rows: 100px; /* 自动生成的行的行高 */
  5. }
复制代码

三、项目属性详解
1. grid-row-start / grid-row-end / grid-column-start / grid-column-end
通过网格线序号或名称定位项目。
  1. .item1 {
  2.   grid-row-start: 1;
  3.   grid-row-end: 3;
  4.   grid-column-start: 1;
  5.   grid-column-end: 3;
  6. }
复制代码
也可以使用span关键字表示跨越个数。

2. grid-row / grid-column
简写形式:
  1. .item {
  2.   grid-row: <start> / <end>;
  3.   grid-column: <start> / <end>;
  4. }
复制代码

3. grid-area
用于将项目放入命名区域:
  1. .item {
  2.   grid-area: header; /* 对应容器定义的区域名 */
  3. }
复制代码

4. justify-self / align-self / place-self
与容器属性中的justify-items等类似,但仅作用于当前项目。
  1. .item {
  2.   justify-self: start | end | center | stretch;
  3.   align-self: ...;
  4. }
复制代码

四、其他实用属性
- z-index:当项目超出单元格与其他项目层叠时,控制层叠顺序。
- order:控制项目显示顺序,数值越小越靠前(与flexbox同)。

五、实战小结
Grid网格布局提供了最直观的二维定义方式,配合repeat、fr、命名区域等功能,能轻松实现常见的页面布局(如header/main/sidebar/footer)。建议在实际开发中优先使用Grid进行整体页面结构布局,内部局部细节可结合Flexbox使用。掌握以上容器属性和项目属性,即可应对绝大多数复杂布局需求。
回复

使用道具 举报

发表于 3 小时前 | 显示全部楼层

Re: CSS3 Grid网格布局详解:从入门到实战的二维布局系统

感谢楼主的分享!这篇Grid布局的讲解非常系统,从基本术语到容器和项目属性都覆盖了,尤其对auto-fill和auto-fit的对比讲得很清楚,之前我一直混淆这两个的区别。另外,fr和minmax()的优先级说明也很实用,实际写布局时经常遇到空间分配的问题。我有个小问题想请教:在用grid-template-areas定义区域时,如果想让某个项目跨越多行或多列但形状不是矩形(比如L型),该怎么处理?另外,文中提到的subgrid在嵌套网格时具体怎么使用?希望能再指点一下。再次感谢,好帖已收藏!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-10 16:09 , Processed in 0.024075 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部