CSS 教程

纯干货教学,从零开始学习 CSS

CSS Grid

学习 CSS 网格布局(Grid)的基本概念、属性和使用方法,掌握现代 CSS 二维布局技术。

什么是 CSS Grid?

CSS Grid(网格布局)是一种二维布局模型,用于在容器中对项目进行行和列的排列。它可以轻松创建复杂的布局结构,适用于各种屏幕尺寸和设备。

Grid 基本术语

  • 网格容器 (Grid Container):应用了 display: grid;display: inline-grid; 的元素。
  • 网格项目 (Grid Item):网格容器的直接子元素。
  • 网格线 (Grid Line):构成网格结构的线,包括水平线和垂直线。
  • 网格轨道 (Grid Track):两条相邻网格线之间的空间,包括行和列。
  • 网格单元格 (Grid Cell):相邻的行和列网格线之间的最小单位,类似于表格的单元格。
  • 网格区域 (Grid Area):由一个或多个网格单元格组成的矩形区域。
  • 网格间隙 (Grid Gap):网格轨道之间的空间。
/* 创建一个网格容器 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    /* 其他 grid 容器属性,如 grid-template-columns, grid-template-rows, gap 等 */
}

/* 网格项目会自动成为容器的子元素 */
.grid-item { /* 选择器:class 为 grid-item 的元素 */
    /* 其他 grid 项目属性,如 grid-column, grid-row, grid-area 等 */
}

Grid 容器属性

1. display

定义一个网格容器。

描述
grid 创建一个块级网格容器。
inline-grid 创建一个内联网格容器。

2. grid-template-columns 和 grid-template-rows

定义网格的列和行的大小。

描述
length 指定具体的长度值,如 px、em、% 等。
fr 网格剩余空间的比例单位。
auto 根据内容自动调整大小。
minmax(min, max) 指定最小和最大尺寸范围。
repeat(n, value) 重复指定的值 n 次。
/* 定义一个 3 列 2 行的网格 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: 100px 1fr 2fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 100 像素、1 份剩余空间、2 份剩余空间 */
    grid-template-rows: 50px 100px; /* 属性:grid-template-rows,定义 2 行,高度分别为 50 像素、100 像素 */
}

/* 使用 repeat 函数 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
    grid-template-rows: repeat(2, auto); /* 属性:grid-template-rows,使用 repeat 函数定义 2 行,每行高度根据内容自动调整 */
}

/* 使用 minmax 函数 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(3, minmax(100px, 1fr)); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度最小为 100 像素,最大为 1 份剩余空间 */
}

3. grid-template-areas

定义网格区域的布局。

/* 定义网格区域 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: 1fr 3fr 1fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 1 份、3 份、1 份剩余空间 */
    grid-template-rows: auto 1fr auto; /* 属性:grid-template-rows,定义 3 行,高度分别为自动、1 份剩余空间、自动 */
    grid-template-areas: /* 属性:grid-template-areas,定义网格区域布局 */
        "header header header" /* 第一行:整个行都是 header 区域 */
        "sidebar main right" /* 第二行:左侧是 sidebar 区域,中间是 main 区域,右侧是 right 区域 */
        "footer footer footer"; /* 第三行:整个行都是 footer 区域 */
}

/* 分配网格项目到区域 */
.header { /* 选择器:class 为 header 的元素 */
    grid-area: header; /* 属性:grid-area,将元素分配到 header 区域 */
}

.sidebar { /* 选择器:class 为 sidebar 的元素 */
    grid-area: sidebar; /* 属性:grid-area,将元素分配到 sidebar 区域 */
}

.main { /* 选择器:class 为 main 的元素 */
    grid-area: main; /* 属性:grid-area,将元素分配到 main 区域 */
}

.right { /* 选择器:class 为 right 的元素 */
    grid-area: right; /* 属性:grid-area,将元素分配到 right 区域 */
}

.footer { /* 选择器:class 为 footer 的元素 */
    grid-area: footer; /* 属性:grid-area,将元素分配到 footer 区域 */
}

4. grid-template

grid-template-columnsgrid-template-rowsgrid-template-areas 的简写属性。

5. gap (grid-gap)

定义网格项目之间的间隙。

描述
length 指定具体的长度值,如 px、em 等。
fr 网格剩余空间的比例单位。
/* 设置网格间隙 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
    gap: 10px; /* 属性:gap,设置行和列的间隙都是 10 像素 */
}

/* 分别设置行和列的间隙 */
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
    row-gap: 10px; /* 属性:row-gap,设置行间隙为 10 像素 */
    column-gap: 20px; /* 属性:column-gap,设置列间隙为 20 像素 */
}

6. justify-items

定义网格项目在单元格内水平方向的对齐方式。

描述
stretch 默认值,拉伸以填充单元格。
start 左对齐。
end 右对齐。
center 水平居中对齐。

7. align-items

定义网格项目在单元格内垂直方向的对齐方式。

描述
stretch 默认值,拉伸以填充单元格。
start 顶部对齐。
end 底部对齐。
center 垂直居中对齐。

8. place-items

align-itemsjustify-items 的简写属性。

9. justify-content

定义网格容器内网格在水平方向的对齐方式,当网格总宽度小于容器宽度时生效。

描述
stretch 默认值,拉伸以填充容器。
start 左对齐。
end 右对齐。
center 水平居中对齐。
space-between 网格之间均匀分布,首尾网格贴近容器边缘。
space-around 网格之间均匀分布,首尾网格距离容器边缘有一半间距。
space-evenly 网格之间和与容器边缘之间都均匀分布。

10. align-content

定义网格容器内网格在垂直方向的对齐方式,当网格总高度小于容器高度时生效。

描述
stretch 默认值,拉伸以填充容器。
start 顶部对齐。
end 底部对齐。
center 垂直居中对齐。
space-between 网格之间均匀分布,首尾网格贴近容器边缘。
space-around 网格之间均匀分布,首尾网格距离容器边缘有一半间距。
space-evenly 网格之间和与容器边缘之间都均匀分布。

11. place-content

align-contentjustify-content 的简写属性。

12. grid-auto-columns 和 grid-auto-rows

定义自动生成的网格轨道的大小。

13. grid-auto-flow

定义自动放置网格项目的方式。

描述
row 默认值,按行填充。
column 按列填充。
dense 尝试填充网格中的空隙。

Grid 项目属性

1. grid-column-start, grid-column-end, grid-row-start, grid-row-end

定义网格项目的位置和大小。

描述
number 网格线的编号。
name 命名的网格线。
span n 跨越 n 个网格轨道。
auto 自动确定位置。
/* 设置网格项目的位置和大小 */
.item1 { /* 选择器:class 为 item1 的元素 */
    grid-column-start: 1; /* 属性:grid-column-start,设置元素的起始列网格线为 1 */
    grid-column-end: 3; /* 属性:grid-column-end,设置元素的结束列网格线为 3 */
    grid-row-start: 1; /* 属性:grid-row-start,设置元素的起始行网格线为 1 */
    grid-row-end: 2; /* 属性:grid-row-end,设置元素的结束行网格线为 2 */
}

/* 使用简写属性 */
.item2 { /* 选择器:class 为 item2 的元素 */
    grid-column: 1 / 3; /* 属性:grid-column,简写属性,设置元素的起始列网格线为 1,结束列网格线为 3 */
    grid-row: 2 / 4; /* 属性:grid-row,简写属性,设置元素的起始行网格线为 2,结束行网格线为 4 */
}

/* 使用 span */
.item3 { /* 选择器:class 为 item3 的元素 */
    grid-column: 2 / span 2; /* 属性:grid-column,设置元素的起始列网格线为 2,跨越 2 个列网格轨道 */
    grid-row: 1 / span 3; /* 属性:grid-row,设置元素的起始行网格线为 1,跨越 3 个行网格轨道 */
}

2. grid-column 和 grid-row

grid-column-start/grid-column-endgrid-row-start/grid-row-end 的简写属性。

3. grid-area

定义网格项目的区域,可以是命名的区域或网格线的组合。

4. justify-self

定义单个网格项目在单元格内水平方向的对齐方式,覆盖容器的 justify-items 属性。

描述
stretch 默认值,拉伸以填充单元格。
start 左对齐。
end 右对齐。
center 水平居中对齐。

5. align-self

定义单个网格项目在单元格内垂直方向的对齐方式,覆盖容器的 align-items 属性。

描述
stretch 默认值,拉伸以填充单元格。
start 顶部对齐。
end 底部对齐。
center 垂直居中对齐。

6. place-self

align-selfjustify-self 的简写属性。

Grid 实际应用示例

示例 1:基本网格布局

<div class="grid-container"> 
    <div class="item">1</div> 
    <div class="item">2</div> 
    <div class="item">3</div> 
    <div class="item">4</div> 
    <div class="item">5</div> 
    <div class="item">6</div> 
</div> 

<style> 
.grid-container { /* 选择器:class 为 grid-container 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(3, 1fr); /* 属性:grid-template-columns,使用 repeat 函数定义 3 列,每列宽度为 1 份剩余空间 */
    grid-template-rows: repeat(2, 100px); /* 属性:grid-template-rows,使用 repeat 函数定义 2 行,每行高度为 100 像素 */
    gap: 10px; /* 属性:gap,设置网格项目之间的间隙为 10 像素 */
}

.item { /* 选择器:class 为 item 的元素 */
    background-color: #e0f7fa; /* 属性:background-color,设置背景颜色为浅蓝色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    text-align: center; /* 属性:text-align,设置文本对齐方式为居中 */
    border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
}
</style> 

示例 2:响应式网格

<div class="responsive-grid"> 
    <div class="item">1</div> 
    <div class="item">2</div> 
    <div class="item">3</div> 
    <div class="item">4</div> 
    <div class="item">5</div> 
</div> 

<style> 
.responsive-grid { /* 选择器:class 为 responsive-grid 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); /* 属性:grid-template-columns,使用 repeat(auto-fit, minmax(200px, 1fr)) 创建自适应网格,每列最小宽度为 200 像素,最大为 1 份剩余空间 */
    gap: 10px; /* 属性:gap,设置网格项目之间的间隙为 10 像素 */
}

.item { /* 选择器:class 为 item 的元素 */
    background-color: #e8f5e8; /* 属性:background-color,设置背景颜色为浅绿色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
    text-align: center; /* 属性:text-align,设置文本对齐方式为居中 */
    border-radius: 4px; /* 属性:border-radius,设置圆角为 4 像素 */
}
</style> 

示例 3:复杂布局

<div class="complex-layout"> 
    <header class="header">头部</header> 
    <aside class="sidebar">侧边栏</aside> 
    <main class="main">主内容</main> 
    <section class="widget1">小部件 1</section> 
    <section class="widget2">小部件 2</section> 
    <footer class="footer">底部</footer> 
</div> 

<style> 
.complex-layout { /* 选择器:class 为 complex-layout 的元素 */
    display: grid; /* 属性:display,设置为 grid,创建一个块级网格容器 */
    grid-template-columns: 200px 1fr 1fr; /* 属性:grid-template-columns,定义 3 列,宽度分别为 200 像素、1 份、1 份剩余空间 */
    grid-template-rows: auto 1fr auto auto; /* 属性:grid-template-rows,定义 4 行,高度分别为自动、1 份剩余空间、自动、自动 */
    grid-template-areas: /* 属性:grid-template-areas,定义网格区域布局 */
        "header header header" /* 第一行:整个行都是 header 区域 */
        "sidebar main main" /* 第二行:左侧是 sidebar 区域,中间和右侧是 main 区域 */
        "sidebar widget1 widget2" /* 第三行:左侧是 sidebar 区域,中间是 widget1 区域,右侧是 widget2 区域 */
        "footer footer footer"; /* 第四行:整个行都是 footer 区域 */
    gap: 10px; /* 属性:gap,设置网格区域之间的间隙为 10 像素 */
    min-height: 100vh; /* 属性:min-height,设置最小高度为 100 视口高度,确保占满整个屏幕 */
}

.header { /* 选择器:class 为 header 的元素 */
    grid-area: header; /* 属性:grid-area,将元素分配到 header 区域 */
    background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
    color: white; /* 属性:color,设置文本颜色为白色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.sidebar { /* 选择器:class 为 sidebar 的元素 */
    grid-area: sidebar; /* 属性:grid-area,将元素分配到 sidebar 区域 */
    background-color: #f0f0f0; /* 属性:background-color,设置背景颜色为浅灰色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.main { /* 选择器:class 为 main 的元素 */
    grid-area: main; /* 属性:grid-area,将元素分配到 main 区域 */
    background-color: #ffffff; /* 属性:background-color,设置背景颜色为白色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.widget1 { /* 选择器:class 为 widget1 的元素 */
    grid-area: widget1; /* 属性:grid-area,将元素分配到 widget1 区域 */
    background-color: #e3f2fd; /* 属性:background-color,设置背景颜色为浅蓝色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.widget2 { /* 选择器:class 为 widget2 的元素 */
    grid-area: widget2; /* 属性:grid-area,将元素分配到 widget2 区域 */
    background-color: #e8f5e8; /* 属性:background-color,设置背景颜色为浅绿色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}

.footer { /* 选择器:class 为 footer 的元素 */
    grid-area: footer; /* 属性:grid-area,将元素分配到 footer 区域 */
    background-color: #333; /* 属性:background-color,设置背景颜色为深灰色 */
    color: white; /* 属性:color,设置文本颜色为白色 */
    padding: 20px; /* 属性:padding,设置内边距为 20 像素(四个方向) */
}
</style> 

示例 4:卡片网格

<div class="card-grid">
    <div class="card">
        <h3>卡片 1</h3>
        <p>这是一张卡片内容</p>
    </div>
    <div class="card">
        <h3>卡片 2</h3>
        <p>这是一张卡片内容</p>
    </div>
    <div class="card">
        <h3>卡片 3</h3>
        <p>这是一张卡片内容</p>
    </div>
    <div class="card">
        <h3>卡片 4</h3>
        <p>这是一张卡片内容</p>
    </div>
    <div class="card">
        <h3>卡片 5</h3>
        <p>这是一张卡片内容</p>
    </div>
</div>

<style>
.card-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
    gap: 20px;
    padding: 20px;
}

.card {
    background-color: #ffffff;
    border-radius: 8px;
    box-shadow: 0 2px 8px rgba(0,0,0,0.1);
    padding: 20px;
    transition: transform 0.3s ease;
}

.card:hover {
    transform: translateY(-5px);
}

.card h3 {
    margin-top: 0;
    color: #333;
}

.card p {
    color: #666;
}
</style>

Grid 使用技巧

  • 二维布局优先使用 Grid:Grid 适用于二维布局(行和列),而 Flexbox 适用于一维布局。
  • 合理使用 repeat 函数:使用 repeat() 函数可以简化重复的网格轨道定义。
  • 使用 minmax 函数创建响应式布局minmax() 函数可以确保网格轨道在不同屏幕尺寸下的合理显示。
  • 使用 auto-fit 和 auto-fill 创建自适应网格:结合 repeat()minmax() 可以创建自适应的响应式网格。
  • 合理命名网格区域:使用 grid-template-areas 可以创建清晰易懂的布局结构。
  • 注意浏览器兼容性:虽然现代浏览器都支持 Grid,但在处理旧浏览器时需要考虑兼容性。
  • 结合 Flexbox 使用:Grid 和 Flexbox 可以结合使用,Grid 用于整体布局,Flexbox 用于局部对齐。

Grid 总结

  • CSS Grid 是一种二维布局模型,用于在容器中对项目进行行和列的排列。
  • 网格容器通过 display: grid;display: inline-grid; 创建。
  • Grid 容器属性控制整个容器的布局方式,如网格轨道大小、对齐方式等。
  • Grid 项目属性控制单个项目的行为,如位置、大小、对齐方式等。
  • Grid 可以轻松创建复杂的布局结构,如响应式网格、卡片布局、复杂页面布局等。
  • Grid 是现代 CSS 布局的重要工具,掌握它可以大大提高布局效率和灵活性。