你真的了解Grid布局吗?

本文深入讲解CSS Grid布局,包括Grid的基本概念、容器属性、项目属性及兼容性问题。通过实例展示如何利用Grid创建灵活的网页布局。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Grid网格布局

概述:Grid将容器划分为一个个网格,通过任意组合不同的网格,做出你想想要的布局

Gridflex布局相似,将整个Grid分为了容器子项(格子)

 

Grid容器的三个重要的概念:

  1. 行和列
  2. 单元格
  3. 网格线

 

行和列

行和列的概念和栅格系统的的概念相似

单元格在水平方向排成一路为一行

单元格在竖直方向上拍成一路为一列

 

单元格

作为容器的最小单位,Grid网格由一个个单元格组成

 

网格线

用来隔开单元格的交叉线。网格线将每一行、每一列的单元格分割成全封闭的矩形

每行、每列网格线的数量是当前行数和列数加一;全封闭嘛

网格线也是控制单元格大小的因素之一;

 

Grid容器属性(常用的)

  1.指定一个Grid容器    

  display属性值:

    grid:指定一个元素采用网格布局,默认情况下容器都是块级元素独占一行

    inline-grid:指定为行内Grid

  2.设置Grid行数和列数

  grid-template-rows: 指定行数

  grid-template-columns: 指定列数

先做一个3 x 3的网格

 

 

 

.container{
width: 300px;
height: 300px;
display: grid;
grid-template-rows: 100px 100px 100px;
grid-template-columns: 100px 100px 100px;
background-color: #123456;
margin: 200px;
}
.container div{
width: 100px;
height: 100px;
background-clip: content-box;
padding: 5px;
border: 1px solid #fff;
background-color: #eee;
display: flex;
justify-content: center;
align-items: center;
box-sizing: border-box;
}
<div class="container">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>

还可以使用结合属性:grid-template

grid-template: 100px 100px 100px/100px 100px 100px;

 

新单位fr

  fraction 的缩写,意为"片段" 可以理解为当前单元格所占该行/列的比例、

 

上述代码可以改为

grid-template-rows: 1fr 1fr 1fr;

grid-template-columns: 1fr 1fr 1fr;

如果行数或者列数特别多的情况下,这样写就显得特别的繁琐;

于是乎就有了一个repeat( )函数

grid-template-rows: repeat(3,1fr);
grid-template-columns: repeat(3,1fr);

repeat()

第一个参数是设置行/列数

第二个参数是设置每一行/列所占的当前容器的份额

 

第二个参数可以填多个值

grid-template-rows: repeat(3,1fr );
grid-template-columns: repeat(3,1fr 50px);

先看结果:

 

 

 

理解:

容器被分为3列,每一列又被分成了 1fr 50px,也就是说被分为了6

内容区为1的元素占了 1fr+50px中的 1fr

内容区为2的元素占了 1fr+50px中的 50px

 

那么问题来了,为什么6是完整的?

其实每一个div都是完整的,只不过2有一半被3遮住了而已

6有一半超出了grid容器

为什么 3 5 9会遮住前一个div呢?

这就要提到网格线的作用了,网格线的作用不仅仅是分割每一个单元格

在分割单元格的同时也规定了每个单一格的水平和垂直方向上的起始位置和结束位置

3的其实位置就是在1fr+50px这里,也就是第二条列网线的位置,结束位置是第三条网格线

 

审查元素能很好的看的网格线的情况和单元格的分布

 

 

minmax( ) auto

auto 单元格宽度/高度自适应

grid-template-rows: repeat(3,1fr );
grid-template-columns: 50px auto 50px;

第二列多余的宽会随这Grip容器的变化而改变

第三列网格线会改变

      

 

 

minmax( ) 单元格宽度/高度在(minmax)范围内

 

grid-template-rows: repeat(3,1fr );
grid-template-columns: 50px minmax(120px,1fr) 50px;

这里的1fr表示剩余的位置。因为没有别的列占剩余空间。

如果最大值部分超出grip容器的容量,只会分配最大剩余容量

 

 

3.grip-gap设置行/列直接的间隙

 

grip-gap5px 5px 行间隙5 列间隙5

 

简写:grip-gap5px

 

 

你也可以分开写两个属性

 

grid-column-gap5px;

 

grid-row-gap5px;

 

 

 

4.grid-template-areas在网格内指定区域

改属性必须配合子项中的grid-area来使用

 

grid-area用来规定区域的名字

 

你可把grid-area当成画布,把grid-area所指定的区域当作画块

通过画块的拼接来获取想要的布局;

 

你可以轻轻松松的做出如下布局(而且大小可以自适应)

 

 

代码如下:

.container{
width: 100vw;
height: 100vh;
display: grid;
grid-template: repeat(4,1fr)/repeat(4,1fr);
grid-template-areas: "hl m m hr"
"hl m m hr"
"al al ar ar "
"f f f f ";
background: #eee;
grid-gap: .7em
}
.container .main{
grid-area: m;
background-color: #f1c40f
}
.container .asideL{
grid-area: al;
background-color: #4ff10f
}
.container .asideR{
grid-area: ar;
background-color: #0ff1cb
}
.container .headerL{
grid-area: hl;
background-color: #0f26f1
}
.container .headerR{
grid-area: hr;
background-color: #9e0ff1
}
.container .footer{
grid-area: f;
background-color: #f10f1a
}
<div class="container">
<div class="main"></div>
<div class="headerL"></div>
<div class="headerR"></div>
<div class="asideL"></div>
<div class="asideR"></div>
<div class="footer"></div>
</div>

突然感觉页面布局居然如此简单

 

注意:在grid-template-areas内所指定的命名区域必须是矩形,不然浏览器不渲染

grid-templategrid-template-columnsgrid-template-rowsgrid-template-areas

 

5.grid-auto-flow设置单元格排列的方向。

属性值:

row 从水平方向自左向右排列(默认)

column从竖直方向自上向下排列

row dense:从水平方向自左向右排列,自动填补空格,尽可能排满

column dense:从竖直方向自上向下排列,尽可能排满

 

6.justify-items/align-items设置单元格内的水平方向/垂直方向对其方式

属性值:

start对齐单元格的起始边缘。

end对齐单元格的结束边缘。

center单元格内部居中。

stretch拉伸,占满单元格的整个宽度(默认值)

place-itemsjustify-itemsalign-items的合并属性

7.justify-content/align-content设置grid网格内所有单元格水平方向/垂直方向对其方式

属性值:

start对齐容器的起始边框。

end:对齐容器的结束边框。

center:容器内部居中。

stretch:项目大小没有指定时,拉伸占据整个网格容器。

space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍。

space-between项目与项目的间隔相等,项目与容器边框之间没有间隔。

space-evenly:项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。

place-contentalign-contentjustify-content的合并属性

 

 

Grid项目属性(常用的)

 

1.grid-column/grid-row:根据网格线来指定单元格位置

 

background-color: red;
grid-column: 2 / 3;
grid-row: 1 / 2;

这里的意思是该单元格

X方向上所占的位置是第二根网格线到第三根网格线

Y方向上所占的位置是第一根网格线到第三根网格线

2. grid-area: 指定单元格在那个区域

grid-area:grid-column/grid-row的合成属性

 

grid-area: 1/2/2/3;

也可以指定是哪个已命名的区域,配个grid-template-areas使用

 

3. justify-self/align-self:单元格内容对齐方式

 

start对齐单元格的起始边缘。

 

end对齐单元格的结束边缘。

 

center单元格内部居中。

 

stretch拉伸,占满单元格的整个宽度(默认值)。

 

 

Grid网格兼容问题:

 

 如果对内容有疑问,欢迎交流讨论

参考链接:

http://www.ruanyifeng.com/blog/2019/03/grid-layout-tutorial.html

https://www.jianshu.com/p/21fc2c091b98

 

转载于:https://www.cnblogs.com/yongG/p/11511265.html

CSS Grid 布局是一种强大的二维布局系统,它允许开发者在网页中同时控制行和列的排列方式,从而创建复杂的响应式设计。以下是关于 CSS Grid 布局的工作原理、使用方法以及示例的详细介绍。 ### 一、CSS Grid 布局的基础概念 CSS Grid 布局基于一个容器元素(Grid Container),在这个容器内部可以定义多个网格项(Grid Items)。通过设置容器的属性,可以控制这些网格项的位置、大小以及对齐方式。Grid 布局的核心在于其能够独立处理行和列,这使得它可以轻松地实现复杂的布局结构[^1]。 ### 二、主要的 CSS Grid 属性 #### 1. `display: grid` / `display: inline-grid` 要启用 Grid 布局,首先需要将一个元素的 `display` 属性设置为 `grid` 或 `inline-grid`。前者会创建一个块级的 Grid 容器,而后者则创建一个内联级别的 Grid 容器[^1]。 ```css .grid-container { display: grid; } ``` #### 2. `grid-template-columns` / `grid-template-rows` 这两个属性用于定义 Grid 容器中的列和行的数量及尺寸。可以通过具体的长度值(如 `px`, `em`)或相对单位(如 `fr`)来指定每列或每行的宽度/高度[^1]。 ```css .grid-container { grid-template-columns: 100px 100px 100px; /* 三列 */ grid-template-rows: auto 50px; /* 两行 */ } ``` #### 3. `grid-template-areas` 此属性允许通过命名区域的方式定义布局,使代码更具可读性。每个名称对应一个网格项,并且可以在 CSS 中直接引用这些名称进行定位[^1]。 ```css .grid-container { grid-template-areas: "header header" "sidebar content" "footer footer"; } ``` #### 4. `gap` / `grid-gap` `gap` 属性用于设置网格项之间的间距。它可以接受两个值:第一个值是行间距,第二个值是列间距。如果只提供一个值,则两者都使用相同的数值。 ```css .grid-container { gap: 10px 20px; /* 行间距10px,列间距20px */ } ``` #### 5. `grid-column` / `grid-row` 这两个属性用于控制单个网格项在其所在行或列上的位置。它们接受起始线和结束线作为参数,格式为 `start-line / end-line`。 ```css .item1 { grid-column: 1 / 3; /* 占据第一到第三列 */ grid-row: 1 / 2; /* 占据第一行 */ } ``` #### 6. `justify-items` / `align-items` 这两个属性分别控制网格项在水平方向和垂直方向上的对齐方式。常见的值包括 `start`, `end`, `center`, 和 `stretch`(默认值)。 ```css .grid-container { justify-items: center; /* 水平居中 */ align-items: start; /* 垂直左对齐 */ } ``` #### 7. `justify-content` / `align-content` 当 Grid 容器的总尺寸大于所有网格项的总尺寸时,`justify-content` 和 `align-content` 可以用来调整整个网格在容器内的对齐方式。它们同样支持 `start`, `end`, `center`, `space-between`, `space-around`, 和 `space-evenly` 等值。 ```css .grid-container { justify-content: space-between; /* 水平分布 */ align-content: center; /* 垂直居中 */ } ``` ### 三、常见的 Grid 布局设计 #### 1. 简单的 2 列布局 下面是一个简单的两列布局示例,其中包含头部、侧边栏、内容区和底部四个部分: ```html <div class="grid-container"> <div class="item1">头部</div> <div class="item2">侧边栏</div> <div class="item3">内容区</div> <div class="item4">底部</div> </div> ``` 对应的 CSS 样式可能如下所示: ```css .grid-container { display: grid; grid-template-columns: 1fr 3fr; /* 左右两列 */ grid-template-rows: auto 1fr auto; /* 上中下三行 */ gap: 10px; } .item1 { grid-column: 1 / -1; /* 跨越所有列 */ grid-row: 1; /* 第一行 */ } .item2 { grid-column: 1; /* 第一列 */ grid-row: 2; /* 第二行 */ } .item3 { grid-column: 2; /* 第二列 */ grid-row: 2; /* 第二行 */ } .item4 { grid-column: 1 / -1; /* 跨越所有列 */ grid-row: 3; /* 第三行 */ } ``` #### 2. 定制化的页面布局 对于更复杂的页面布局,可以结合 `grid-template-areas` 来提高代码的可读性和维护性。例如,一个典型的网站布局可能包括导航栏、主要内容区域、侧边栏和页脚等部分。 ```css .grid-container { display: grid; grid-template-areas: "nav nav nav" "main aside aside" "footer footer footer"; grid-template-columns: 2fr 1fr 1fr; grid-template-rows: auto 1fr auto; gap: 10px; } ``` ### 四、回退方案(Graceful Degradation) 尽管现代浏览器广泛支持 CSS Grid,但对于不支持该特性的旧版浏览器,应考虑提供替代方案。一种常见做法是使用 Flexbox、浮动布局(Floats)、定位(Positioning)或者基于表格的传统布局作为备用方案[^2]。 ```css /* 对于不支持 Grid 的浏览器 */ .grid-container { display: flex; flex-direction: column; } ``` ### 五、总结 CSS Grid 布局是一个强大的二维布局系统,它使得网页开发中的布局工作更加简洁和高效。通过合理运用各种 Grid 属性,开发者可以轻松构建出复杂且响应式的页面布局。此外,为了确保兼容性,还应注意为不支持 Grid 的浏览器提供适当的回退方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值