目录
1.grid布局的含义
grid布局,也被称为网格布局,是将页面中的父元素划分成一个一个的小格子,然后通过这些小格子进行合并来制作出各种不同的效果。
2.grid布局中的基础概念
grid容器:采用grid布局的父元素
grid内容:显示项目的区域
grid项目:grid布局中每一个格子内部放置的元素
行:横向
列:纵向
网格线:网格布局中的横向和纵向的线条
单元格:横纵线交汇的区域被称为单元格
间距:网格与网格之间的距离
3.grid布局中的容器属性
3.1 容器触发网格
将某个元素的display属性设置为grid或者incline-grid,那么这个元素就会成为grid父容器,它的子元素将成为grid子元素。
属性 | 说明 |
grid | 块网格 |
incline-grid | 行内块网格 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
3.2 设置行列
行属性:grid-template-rows
列属性:grid-template-columns
一共有6种取值方式:
(1)初数值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列,行高100px,列宽100px */
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(2)百分比
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:20% 30% 50%;/*三行在总高的占比分别是20% 30% 50%*/
grid-template-columns:20% 20% 60%;/*三列在总宽的占比分别是20% 20% 60%*/
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(3)以 fr 为单位的数据(作为分配可用空间的比例系数)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:1fr 2fr 3fr;/*第一行占1/6,第二行占2/6,第三行占3/6*/
grid-template-columns:1fr 1fr 1fr;/*第一行占1/3,第二行占1/3,第三行占1/3*/
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(4) repeat() 函数
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows: repeat(3, 100px);/*相当于 grid-template-rows: 100px 100px 100px*/
grid-template-columns:repeat(3,100px);/*相当于 grid-template-rows: 100px 100px 100px*/
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(5)自动填充
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows: repeat(3, 100px);/*相当于 grid-template-rows: 100px 100px 100px*/
grid-template-columns:repeat(auto-fill,30%);
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(6)minmax(min,max)函数
注意:如果条件允许,则一直使用最大值,如果条件不满足则使用中间值,如果剩下的距离不足以显示距离大小,则使用最小值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:100px 100px minmax(100px,200px);
grid-template-columns:repeat(auto-fill,30%);
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
(6)auto自动
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:100px auto 100px;
grid-template-columns:auto 100px 100px;
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
3.3 调整间距
- 行间距属性:grid-row-gap
- 列间距属性:grid-column-gap
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
grid-row-gap: 10px;
grid-column-gap: 20px;
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
效果如下:
- grid-gap:第一个参数代表行间距,第二个代表列间距
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
/*开启grid布局*/
display: grid;
/* 设置行列 */
/* 3行3列*/
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
/*间距*/
grid-gap: 10px 20px;/*相当于grid-row-gap: 10px;grid-column-gap: 20px;*/
}
</style>
</head>
<body>
<span>这是一个span标签</span>
<div class="box"></div>
<span>这是一个span标签</span>
</body>
</html>
3.4 grid-auto-flow元素排布
属性 | 说明 |
row | 默认值,先行后列,在必要时增加新行 |
column | 先列后行,在必要时新增新列 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
margin: 0 auto;
/* 开启grid布局 */
display: grid;
/* 设置行列 */
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
grid-auto-flow: row;
}
.box>div {
border: 1px dashed red;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>
效果如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
margin: 0 auto;
/* 开启grid布局 */
display: grid;
/* 设置行列 */
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
grid-auto-flow: column;
}
.box>div {
border: 1px dashed red;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>
效果如下:
3.5 对齐方式
3.5.1 项目位于单元格中的对齐方式
- justify-items 属性设置单元格内容的水平位置。
- align-items 属性设置单元格内容的垂直位置。
- place-items 是两者的复合属性,接收两个参数,第一个是align-items,第二个是justify-items,如果只写一个参数则表示两个属性相同。
属性值 | 说明 |
start | 紧靠单元格起始位置(左或上),默认 |
end | 紧靠单元格结束位置(右或下) |
center | 居中 |
stretch | 拉伸,默认值,占满整个单元格 |
/*对齐方式*/
justify-items: start;
效果如下:
/*对齐方式*/
justify-items: end;
/*对齐方式*/
justify-items: center;
/*对齐方式*/
justify-items: stretch;
/*对齐方式*/
align-items: start;
/*对齐方式*/
align-items: end;
/*对齐方式*/
align-items: center;
/*对齐方式*/
align-items: stretch;
/*对齐方式*/
place-items: stretch start;/*相当于 align-items: stretch;justify-items: start;*/
3.5.2 网格位于容器中的对齐方式
- justify-content 属性控制整个内容区域在容器里面的水平位置
- align-content 属性控制整个内容区域的垂直位置
- place-content 是两者的复合属性,接收两个参数,第一个是align-content,第二个是justify-content,如果只写一个参数则表示两个属性相同
属性值 | 说明 |
start | 紧靠起始位置(左或上) |
end | 紧靠结束位置(右或下) |
center | 居中 |
stretch | 项目大小没有指定时,拉伸占据整个网格容器; |
place-around | 行或列平均分布,首尾行或列与两端的距离等于行或列间距的一半; |
space-between | 行或列平均分布,首尾行或列与两端没有间距; |
space-evenly | 行或列平均分布,首尾行或列与两端的距离等于行或列间距; |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
margin: 0 auto;
/* 开启grid布局 */
display: grid;
/* 设置行列 */
grid-template-rows:100px 100px 100px;
grid-template-columns:100px 100px 100px;
/* 网格位于容器中的对齐方式 */
align-content: start;
}
.box>div {
border: 1px dashed red;
}
</style>
</head>
<body>
<div class="box">
<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>
</body>
</html>
/* 网格位于容器中的对齐方式 */
align-content: end;
/* 网格位于容器中的对齐方式 */
align-content: center;
/* 网格位于容器中的对齐方式 */
align-content: stretch;
/* 网格位于容器中的对齐方式 */
align-content: space-around;
/* 网格位于容器中的对齐方式 */
align-content: space-between;
/* 网格位于容器中的对齐方式 */
align-content: space-evenly;
/* 网格位于容器中的对齐方式 */
place-content: center space-between;/*相当于align-content: center;justify-content: space-between;*/
4.grid布局中的项目属性
4.1 合并单元格
合并单元格是将划分好的网格,通过让元素使用网格线占位的形式,来达到合并的效果。
属性 | 说明 |
grid-column-start | 纵向网格线开始占位 |
grid-column-end | 纵向网格线结束占位 |
grid-row-start | 横向网格线开始占位 |
grid-row-end | 横向网格线结束占位 |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
margin: 0 auto;
/* 开启grid布局 */
display: grid;
/* 设置行列 */
grid-template-rows:repeat(2,100px);
grid-template-columns:repeat(4,100px);
grid-gap: 10px 10px;
}
.box>div {
border: 1px dashed red;
background-color: coral;
}
.box1 {
grid-column-start:1;
grid-column-end:5
}
</style>
</head>
<body>
<div class="box">
<div class="box1">1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
width: 500px;
height: 500px;
border: 5px solid gray;
margin: 0 auto;
/* 开启grid布局 */
display: grid;
/* 设置行列 */
grid-template-rows:repeat(4,100px);
grid-template-columns:repeat(4,100px);
grid-gap: 10px 10px;
}
.box>div {
border: 1px dashed red;
background-color: coral;
}
.box1 {
grid-column-start:1;
grid-column-end:3;
grid-row-start:1;
grid-row-end:3;
}
</style>
</head>
<body>
<div class="box">
<div class="box1">1</div>
<div class="box2">2</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
<div>7</div>
<div>8</div>
<div>9</div>
</div>
</body>
</html>