1. Grid 的基本概念

Grid 容器与 Grid 项目

在 CSS Grid 布局中,主要有两个重要的角色:Grid 容器和 Grid 项目。Grid 容器是包含了所有 Grid 项目的元素,而 Grid 项目则是 Grid 容器内部的直接子元素。

  • Grid 容器:通过设置 display: grid;display: inline-grid; 将元素定义为 Grid 容器。
  • Grid 项目:Grid 容器的直接子元素自动成为 Grid 项目。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>Grid 示例</title>
  6. <style>
  7. .container {
  8. display: grid;
  9. grid-template-columns: repeat(3, 1fr);
  10. gap: 10px;
  11. }
  12. .item {
  13. background-color: #f0f0f0;
  14. padding: 20px;
  15. text-align: center;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="container">
  21. <div class="item">Item 1</div>
  22. <div class="item">Item 2</div>
  23. <div class="item">Item 3</div>
  24. </div>
  25. </body>
  26. </html>

定义网格行与列

通过 grid-template-columnsgrid-template-rows 属性可以定义网格的列和行。

  • 列定义grid-template-columns: 100px 200px 100px; 表示定义三列,宽度分别为 100px, 200px 和 100px。
  • 行定义grid-template-rows: 50px 100px; 表示定义两行,行高分别为 50px 和 100px。
  1. .container {
  2. display: grid;
  3. grid-template-columns: 100px 200px 100px;
  4. grid-template-rows: 50px 100px;
  5. }

网格线与网格区域

  • 网格线(Grid Lines):网格中的分割线,列线和行线将网格划分为单元。
  • 网格区域(Grid Areas):由网格线围成的矩形区域,可以通过命名区域来简化布局。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>网格区域示例</title>
  6. <style>
  7. .container {
  8. display: grid;
  9. grid-template-areas:
  10. "header header header"
  11. "sidebar content content"
  12. "footer footer footer";
  13. gap: 10px;
  14. }
  15. .header {
  16. grid-area: header;
  17. }
  18. .sidebar {
  19. grid-area: sidebar;
  20. }
  21. .content {
  22. grid-area: content;
  23. }
  24. .footer {
  25. grid-area: footer;
  26. }
  27. .item {
  28. background-color: #f0f0f0;
  29. padding: 20px;
  30. text-align: center;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <div class="container">
  36. <div class="header item">Header</div>
  37. <div class="sidebar item">Sidebar</div>
  38. <div class="content item">Content</div>
  39. <div class="footer item">Footer</div>
  40. </div>
  41. </body>
  42. </html>

2. 网格布局的应用

创建复杂布局

利用 CSS Grid,可以很容易地创建复杂的布局,如多列布局、重叠布局等。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>复杂布局示例</title>
  6. <style>
  7. .container {
  8. display: grid;
  9. grid-template-columns: 1fr 2fr 1fr;
  10. grid-template-rows: 100px auto 50px;
  11. gap: 10px;
  12. }
  13. .header {
  14. grid-column: 1 / span 3;
  15. }
  16. .sidebar {
  17. grid-row: 2;
  18. }
  19. .content {
  20. grid-column: 2 / 4;
  21. grid-row: 2 / 3;
  22. }
  23. .footer {
  24. grid-column: 1 / span 3;
  25. }
  26. .item {
  27. background-color: #f0f0f0;
  28. padding: 20px;
  29. text-align: center;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div class="container">
  35. <div class="header item">Header</div>
  36. <div class="sidebar item">Sidebar</div>
  37. <div class="content item">Content</div>
  38. <div class="footer item">Footer</div>
  39. </div>
  40. </body>
  41. </html>

网格对齐与间距

可以通过 align-items, justify-items, align-content, 和 justify-content 属性来调整网格项目和整个网格的对齐方式。

  • align-items:垂直对齐网格项目。
  • justify-items:水平对齐网格项目。
  • align-content:垂直对齐整个网格。
  • justify-content:水平对齐整个网格。
  1. .container {
  2. display: grid;
  3. grid-template-columns: repeat(3, 1fr);
  4. gap: 10px;
  5. align-items: center;
  6. justify-items: center;
  7. }

响应式网格布局

使用 minmax() 函数和媒体查询,可以实现响应式网格布局,适应不同屏幕大小。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>响应式网格示例</title>
  6. <style>
  7. .container {
  8. display: grid;
  9. grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));
  10. gap: 10px;
  11. }
  12. .item {
  13. background-color: #f0f0f0;
  14. padding: 20px;
  15. text-align: center;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div class="container">
  21. <div class="item">Item 1</div>
  22. <div class="item">Item 2</div>
  23. <div class="item">Item 3</div>
  24. <div class="item">Item 4</div>
  25. <div class="item">Item 5</div>
  26. <div class="item">Item 6</div>
  27. </div>
  28. </body>
  29. </html>