本文基于MDN网格布局教程系统拆解CSS Grid的核心概念和常用属性。内容涵盖grid容器的创建与列轨道的定义、fr单位的比例分配机制、显式网格与隐式网格的自动生成规则、minmax函数的自适应尺寸控制、auto-fill关键字的自动填充列、基于网格线的元素精确放置以及grid-template-areas的区域命名布局方法。每个知识点均配有代码示例和渲染原理分析。1. grid-template-columns与轨道定义网格布局的起点是将一个元素声明为grid容器然后用grid-template-columns属性定义网格的列轨道。与flexbox的单轴排列不同grid从一开始就建立二维的列与行结构。先看一个基础示例HTML包含一个container容器和多个直接子项divclasscontainerdivOne/divdivTwo/divdivThree/divdivFour/divdivFive/divdivSix/div/div只设置display: grid不会产生可见的列结构.container{display:grid;}此时子项仍然垂直堆叠因为默认的grid只有一列所有子项沿这唯一列从上到下排列。这与display: block的外观相似但内部的布局模型已经切换为网格。定义列轨道需要使用grid-template-columns属性.container{display:grid;grid-template-columns:200px 200px 200px;}这行代码创建了三列每列宽度200像素。六个子项按照从左到右、从上到下的顺序自动填充到这三个列中。前三个子项占据第一行的三列后三个子项自动折到第二行。浏览器根据列数和子项数量自动计算需要的行数无需手动指定grid-template-rows。grid-template-columns接受任意数量的长度值用空格分隔。每个值定义一个列轨道的宽度。轨道数量决定了每行能容纳的子项数量。值的类型可以是px、em、百分比等任何CSS长度单位。如果子项总数不能被列数整除最后一行的剩余格子会留空。例如七个子项在三列网格中会生成三行最后一行只有一个子项右边两个格子为空。2. fr单位的弹性比例分配fr单位是Grid布局中专用的弹性长度单位代表网格容器中可用空间的一份。它与flexbox中的flex-grow比例概念类似但作用于网格轨道层面。将三列从固定像素改为fr单位.container{display:grid;grid-template-columns:1fr 1fr 1fr;}fr单位的计算逻辑是先扣除所有固定尺寸轨道和间隙占用的空间剩余空间按fr系数总和等分每个轨道获得对应份数的空间。三个1fr意味着三等分可用空间每列宽度相等。当容器宽度变化时每列的fr值不变但对应的实际像素宽度会动态缩放。fr可以设置不同的比例值.container{display:grid;grid-template-columns:2fr 1fr 1fr;}比例总和为42加1加1。第一列获得可用空间的四分之二后两列各得四分之一。第一列永远是其他列的两倍宽无论容器如何缩放。fr可以与固定长度混合使用.container{display:grid;grid-template-columns:300px 2fr 1fr;}第一列固定300像素浏览器先扣除这300像素和间隙剩余可用空间按2比1分配给第二列和第三列。fr只分配可用空间已占用的固定空间不参与弹性分配。这种混合模式在侧边栏固定宽度、主内容区自适应的布局中非常实用。3. 显式网格与隐式网格的自动生成显式网格是通过grid-template-columns和grid-template-rows明确声明的行与列。隐式网格是当子项数量超过显式网格容量时浏览器自动生成的额外轨道。当定义了grid-template-columns但未定义grid-template-rows时行轨道全部属于隐式网格。隐式行的默认高度为auto即根据内容自动调整。不同行的内容不同行高也会不同。通过grid-auto-rows可以控制隐式行的高度.container{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:100px;gap:20px;}所有隐式生成的行统一为100像素高度。如果某个网格项的内容超过100像素内容会溢出单元格边界。这种固定高度在内容可控的场景中能保持整齐的外观但在内容动态变化时有溢出风险。隐式列也有对应的grid-auto-columns属性控制隐式列的宽度。在默认的基于行的自动放置模式下隐式列较少被触发但在使用grid-auto-flow: column改变放置方向后隐式列就变得重要。理解显式与隐式的区别对于调试网格布局至关重要。当子项出现在意料之外的位置时往往是因为它落入了隐式网格而开发者没有为其设置尺寸。显式网格提供精确控制隐式网格提供容错和弹性。4. minmax函数与内容的动态适配minmax函数为网格轨道设置尺寸的取值区间同时指定最小值和最大值。它解决了固定高度导致内容溢出、而auto高度又可能过小的矛盾。基本用法是将grid-auto-rows的值从固定像素改为minmax.container{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:minmax(100px,auto);gap:20px;}minmax(100px, auto)的含义是轨道高度至少为100像素如果内容高度超过100像素轨道自动扩展以容纳内容。浏览器在计算每个单元格的实际高度时先取内容需要的高度再与最小值100像素比较取较大者。minmax的两个参数有严格的约束条件。第一个参数是最小值第二个参数是最大值最小值必须小于或等于最大值。常用组合除了minmax(100px, auto)外还有minmax(0, 1fr)用于创建完全弹性且允许收缩到零的轨道以及minmax(200px, 1fr)用于同时限定最小值和弹性上限。minmax不仅适用于隐式行也可以用在grid-template-columns和grid-template-rows中定义显式轨道。例如grid-template-columns: minmax(200px, 1fr) 2fr定义两列第一列在200像素和弹性空间之间取值第二列占剩余空间的两份。5. auto-fill关键字的自动列填充auto-fill是repeat函数中的一个关键字用于替代固定的重复次数。它让浏览器根据容器宽度自动计算能容纳的列数。与minmax结合使用可以创建自适应列布局.container{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-auto-rows:minmax(100px,auto);gap:20px;}auto-fill的工作机制是浏览器计算容器可用宽度用它除以minmax中指定的最小值200像素向下取整得到能容纳的列数。例如容器宽900像素可以容纳4列900除以200取整为4。这4列的宽度并非恰好200像素因为minmax的第二个参数1fr会将剩余空间分配给所有列。900像素减去间隙后每个列的实际宽度会大于200像素。当容器宽度缩小时列数可能减少为3列每列仍保持至少200像素。当容器宽度增大时列数增加以填充空间。整个过程无需媒体查询网格自动响应。与auto-fill相似的还有auto-fit关键字。两者的区别在于当子项数量少于列数时auto-fill会保留空轨道占据的空间而auto-fit会将空轨道折叠让实际内容占据更多空间。在子项数量不确定的场景中auto-fill适合需要保持列结构的布局auto-fit适合需要内容撑满容器的布局。6. 基于网格线的元素精确放置网格布局中每条轨道边界都是一条编号的网格线。列线从1开始从左到右递增行线从1开始从上到下递增。通过指定元素跨越的起止线号可以将元素精确放置到任意网格区域。一个典型的页面布局包含页头、侧边栏、主内容和页脚四个区域.container{display:grid;grid-template-columns:1fr 3fr;gap:20px;}header{grid-column:1 / 3;grid-row:1;}article{grid-column:2;grid-row:2;}aside{grid-column:1;grid-row:2;}footer{grid-column:1 / 3;grid-row:3;}grid-column和grid-row是缩写属性用斜杠分隔起始线和结束线。grid-column: 1 / 3表示从第1条列线延伸到第3条列线跨越第1列和第2列。grid-row: 1等价于grid-row: 1 / 2只占一行时可以省略结束线。grid-column: 2表示起始于第2条线默认跨一列等价于grid-column: 2 / 3。同理grid-row: 2从第2条行线开始跨一行。网格线的编号也可以用负值-1表示最后一条线-2表示倒数第二条线。header设置grid-column: 1 / -1可以一直跨越到网格的最右端无论总列数如何变化。负数定位仅适用于显式网格隐式网格的线编号不可靠。7. grid-template-areas的区域命名放置基于线的放置方式精确但不够直观需要计算线号。grid-template-areas提供了一种可视化的区域放置方式在CSS代码中直接描述网格的布局结构。同样的四区域布局可以用grid-template-areas重写.container{display:grid;grid-template-areas:header headersidebar contentfooter footer;grid-template-columns:1fr 3fr;gap:20px;}header{grid-area:header;}article{grid-area:content;}aside{grid-area:sidebar;}footer{grid-area:footer;}grid-template-areas的值是一个字符串数组每个字符串代表网格的一行。字符串内的单词用空格分隔每个单词对应一个单元格。相同的单词占据的单元格必须形成一个矩形区域且单词不能在不同位置分散出现。三行两列的命名区域定义了六个单元格。第一行两个单元格都命名为headerheader元素横跨两列。第二行左侧为sidebar右侧为content。第三行两个单元格都是footer。子元素通过grid-area属性引用grid-template-areas中定义的名称。grid-area的值不需要加引号直接使用区域名称。这个过程将命名区域绑定到具体的DOM元素上。如果需要留空某个单元格使用句点符号代替区域名。例如将布局改为三列grid-template-areas:header header headersidebar . contentfooter footer footer;中间一列用点号占位该单元格保持空白左右两侧分别为sidebar和content。这种留空方式在需要视觉分隔或预留空间的布局中很实用。grid-template-areas的最大优势在于布局结构一目了然修改布局只需调整字符串中的名称排列不需要重新计算线号。还在纠结 CSS 样式写得杂乱无章、布局频频踩坑收藏此文持续跟进后续分享 CSS 高效简写、兼容适配方案、经典布局案例、样式避坑干货从基础样式到实战排版一站式学透快速提升前端页面编写能力
跟着 MDN 学CSS day_41:显式轨道、隐式网格与区域命名放置
发布时间:2026/6/1 18:31:56
本文基于MDN网格布局教程系统拆解CSS Grid的核心概念和常用属性。内容涵盖grid容器的创建与列轨道的定义、fr单位的比例分配机制、显式网格与隐式网格的自动生成规则、minmax函数的自适应尺寸控制、auto-fill关键字的自动填充列、基于网格线的元素精确放置以及grid-template-areas的区域命名布局方法。每个知识点均配有代码示例和渲染原理分析。1. grid-template-columns与轨道定义网格布局的起点是将一个元素声明为grid容器然后用grid-template-columns属性定义网格的列轨道。与flexbox的单轴排列不同grid从一开始就建立二维的列与行结构。先看一个基础示例HTML包含一个container容器和多个直接子项divclasscontainerdivOne/divdivTwo/divdivThree/divdivFour/divdivFive/divdivSix/div/div只设置display: grid不会产生可见的列结构.container{display:grid;}此时子项仍然垂直堆叠因为默认的grid只有一列所有子项沿这唯一列从上到下排列。这与display: block的外观相似但内部的布局模型已经切换为网格。定义列轨道需要使用grid-template-columns属性.container{display:grid;grid-template-columns:200px 200px 200px;}这行代码创建了三列每列宽度200像素。六个子项按照从左到右、从上到下的顺序自动填充到这三个列中。前三个子项占据第一行的三列后三个子项自动折到第二行。浏览器根据列数和子项数量自动计算需要的行数无需手动指定grid-template-rows。grid-template-columns接受任意数量的长度值用空格分隔。每个值定义一个列轨道的宽度。轨道数量决定了每行能容纳的子项数量。值的类型可以是px、em、百分比等任何CSS长度单位。如果子项总数不能被列数整除最后一行的剩余格子会留空。例如七个子项在三列网格中会生成三行最后一行只有一个子项右边两个格子为空。2. fr单位的弹性比例分配fr单位是Grid布局中专用的弹性长度单位代表网格容器中可用空间的一份。它与flexbox中的flex-grow比例概念类似但作用于网格轨道层面。将三列从固定像素改为fr单位.container{display:grid;grid-template-columns:1fr 1fr 1fr;}fr单位的计算逻辑是先扣除所有固定尺寸轨道和间隙占用的空间剩余空间按fr系数总和等分每个轨道获得对应份数的空间。三个1fr意味着三等分可用空间每列宽度相等。当容器宽度变化时每列的fr值不变但对应的实际像素宽度会动态缩放。fr可以设置不同的比例值.container{display:grid;grid-template-columns:2fr 1fr 1fr;}比例总和为42加1加1。第一列获得可用空间的四分之二后两列各得四分之一。第一列永远是其他列的两倍宽无论容器如何缩放。fr可以与固定长度混合使用.container{display:grid;grid-template-columns:300px 2fr 1fr;}第一列固定300像素浏览器先扣除这300像素和间隙剩余可用空间按2比1分配给第二列和第三列。fr只分配可用空间已占用的固定空间不参与弹性分配。这种混合模式在侧边栏固定宽度、主内容区自适应的布局中非常实用。3. 显式网格与隐式网格的自动生成显式网格是通过grid-template-columns和grid-template-rows明确声明的行与列。隐式网格是当子项数量超过显式网格容量时浏览器自动生成的额外轨道。当定义了grid-template-columns但未定义grid-template-rows时行轨道全部属于隐式网格。隐式行的默认高度为auto即根据内容自动调整。不同行的内容不同行高也会不同。通过grid-auto-rows可以控制隐式行的高度.container{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:100px;gap:20px;}所有隐式生成的行统一为100像素高度。如果某个网格项的内容超过100像素内容会溢出单元格边界。这种固定高度在内容可控的场景中能保持整齐的外观但在内容动态变化时有溢出风险。隐式列也有对应的grid-auto-columns属性控制隐式列的宽度。在默认的基于行的自动放置模式下隐式列较少被触发但在使用grid-auto-flow: column改变放置方向后隐式列就变得重要。理解显式与隐式的区别对于调试网格布局至关重要。当子项出现在意料之外的位置时往往是因为它落入了隐式网格而开发者没有为其设置尺寸。显式网格提供精确控制隐式网格提供容错和弹性。4. minmax函数与内容的动态适配minmax函数为网格轨道设置尺寸的取值区间同时指定最小值和最大值。它解决了固定高度导致内容溢出、而auto高度又可能过小的矛盾。基本用法是将grid-auto-rows的值从固定像素改为minmax.container{display:grid;grid-template-columns:repeat(3,1fr);grid-auto-rows:minmax(100px,auto);gap:20px;}minmax(100px, auto)的含义是轨道高度至少为100像素如果内容高度超过100像素轨道自动扩展以容纳内容。浏览器在计算每个单元格的实际高度时先取内容需要的高度再与最小值100像素比较取较大者。minmax的两个参数有严格的约束条件。第一个参数是最小值第二个参数是最大值最小值必须小于或等于最大值。常用组合除了minmax(100px, auto)外还有minmax(0, 1fr)用于创建完全弹性且允许收缩到零的轨道以及minmax(200px, 1fr)用于同时限定最小值和弹性上限。minmax不仅适用于隐式行也可以用在grid-template-columns和grid-template-rows中定义显式轨道。例如grid-template-columns: minmax(200px, 1fr) 2fr定义两列第一列在200像素和弹性空间之间取值第二列占剩余空间的两份。5. auto-fill关键字的自动列填充auto-fill是repeat函数中的一个关键字用于替代固定的重复次数。它让浏览器根据容器宽度自动计算能容纳的列数。与minmax结合使用可以创建自适应列布局.container{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));grid-auto-rows:minmax(100px,auto);gap:20px;}auto-fill的工作机制是浏览器计算容器可用宽度用它除以minmax中指定的最小值200像素向下取整得到能容纳的列数。例如容器宽900像素可以容纳4列900除以200取整为4。这4列的宽度并非恰好200像素因为minmax的第二个参数1fr会将剩余空间分配给所有列。900像素减去间隙后每个列的实际宽度会大于200像素。当容器宽度缩小时列数可能减少为3列每列仍保持至少200像素。当容器宽度增大时列数增加以填充空间。整个过程无需媒体查询网格自动响应。与auto-fill相似的还有auto-fit关键字。两者的区别在于当子项数量少于列数时auto-fill会保留空轨道占据的空间而auto-fit会将空轨道折叠让实际内容占据更多空间。在子项数量不确定的场景中auto-fill适合需要保持列结构的布局auto-fit适合需要内容撑满容器的布局。6. 基于网格线的元素精确放置网格布局中每条轨道边界都是一条编号的网格线。列线从1开始从左到右递增行线从1开始从上到下递增。通过指定元素跨越的起止线号可以将元素精确放置到任意网格区域。一个典型的页面布局包含页头、侧边栏、主内容和页脚四个区域.container{display:grid;grid-template-columns:1fr 3fr;gap:20px;}header{grid-column:1 / 3;grid-row:1;}article{grid-column:2;grid-row:2;}aside{grid-column:1;grid-row:2;}footer{grid-column:1 / 3;grid-row:3;}grid-column和grid-row是缩写属性用斜杠分隔起始线和结束线。grid-column: 1 / 3表示从第1条列线延伸到第3条列线跨越第1列和第2列。grid-row: 1等价于grid-row: 1 / 2只占一行时可以省略结束线。grid-column: 2表示起始于第2条线默认跨一列等价于grid-column: 2 / 3。同理grid-row: 2从第2条行线开始跨一行。网格线的编号也可以用负值-1表示最后一条线-2表示倒数第二条线。header设置grid-column: 1 / -1可以一直跨越到网格的最右端无论总列数如何变化。负数定位仅适用于显式网格隐式网格的线编号不可靠。7. grid-template-areas的区域命名放置基于线的放置方式精确但不够直观需要计算线号。grid-template-areas提供了一种可视化的区域放置方式在CSS代码中直接描述网格的布局结构。同样的四区域布局可以用grid-template-areas重写.container{display:grid;grid-template-areas:header headersidebar contentfooter footer;grid-template-columns:1fr 3fr;gap:20px;}header{grid-area:header;}article{grid-area:content;}aside{grid-area:sidebar;}footer{grid-area:footer;}grid-template-areas的值是一个字符串数组每个字符串代表网格的一行。字符串内的单词用空格分隔每个单词对应一个单元格。相同的单词占据的单元格必须形成一个矩形区域且单词不能在不同位置分散出现。三行两列的命名区域定义了六个单元格。第一行两个单元格都命名为headerheader元素横跨两列。第二行左侧为sidebar右侧为content。第三行两个单元格都是footer。子元素通过grid-area属性引用grid-template-areas中定义的名称。grid-area的值不需要加引号直接使用区域名称。这个过程将命名区域绑定到具体的DOM元素上。如果需要留空某个单元格使用句点符号代替区域名。例如将布局改为三列grid-template-areas:header header headersidebar . contentfooter footer footer;中间一列用点号占位该单元格保持空白左右两侧分别为sidebar和content。这种留空方式在需要视觉分隔或预留空间的布局中很实用。grid-template-areas的最大优势在于布局结构一目了然修改布局只需调整字符串中的名称排列不需要重新计算线号。还在纠结 CSS 样式写得杂乱无章、布局频频踩坑收藏此文持续跟进后续分享 CSS 高效简写、兼容适配方案、经典布局案例、样式避坑干货从基础样式到实战排版一站式学透快速提升前端页面编写能力