Grid 布局
前言
这是作者的学习笔记,没有添加修饰就呈现上来了,感兴趣的可以看一看哟,也欢迎各位大佬指出我笔记的错误,大家一起进步!!
1. 什么是Grid布局
Flex布局是轴线布局,只能指定“项目”针对轴线的位置,可以看作为一维布局,Grid布局则是将容器划分成“行”和“列”,产生单元格,然后指定“项目所在”的单元格,可以看作是二维布局,Grid布局远比Flex布局强大。
2. 布局方式 ——常用三种
-
传统布局方式:利用position属性+display属性+float属性布局,兼容性最好,但是效率低,麻烦!
-
Flex布局:有自己的一套属性,效率高,学习成本低,兼容性强。
-
Grid布局:网格布局是最强大的CSS布局方案,但是知识点比较多,学习成本相对困难,目前的兼容性不如Flex好。
3. 基本概念
1.容器——有容器属性
2.项目——有项目属性
最重要的图!!!!!!
4. 容器属性
- grid-template-columns
- grid-template-rows
- grid-row-gap
- grid-column-gap
- grid-gap(3,4的缩写)
- grid-template-areas
- grid-auto-flow
- justify-items
- align-items
- place-items(8,9的缩写)
- justify-content
- align-content
- place-content(11,12的缩写)
- grid-auto-columns
- grid-auto-rows
grid-template-*
你想要多少行,多少列,就填写相应属性值的个数,不填写则自动分配。
grid-template-columns
grid-template-rows
repeat()
第一个参数是重复的次数,第二个参数是所要重复的值
grid-template-columns: 100px 100px 100px;
相当于
grid-template-columns: repeat(3,100px);
auto-fill
有时单元格的大小是固定的,但是容器的大小不确定,这个属性就会自动填充
grid-template-columns: repeat(auto-fill,100px)
当将容器的固定大小去掉后,伸缩网页,容器的大小变化,auto-fill就会使得里面的元素自行填充。
图1:将页面变小,容器变小时:
图2:将页面拉伸,容器变大时:
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="test.css">
</head>
<body>
<div class="main">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
<div class="item item-6">6</div>
<div class="item item-7">7</div>
<div class="item item-8">8</div>
<div class="item item-9">9</div>
<div class="item item-10">10</div>
</div>
</body>
</html>
.main{
display: grid;
/* width: 600px;
height: 600px; */
border: 10px solid skyblue;
grid-template-columns:repeat(auto-fill, 100px) ;
grid-template-rows: 100px 100px 100px 100px ;
}
.item-1{
background-color: wheat;
}
.item-2{
background-color: blue;
}
.item-3{
background-color: violet;
}
.item-4{
background-color: red;
}
.item-5{
background-color: rgb(17, 128, 34);
}
.item-6{
background-color: rgb(15, 66, 123);
}
.item-7{
background-color: rgb(161, 38, 130);
}
.item-8{
background-color: rgb(198, 109, 128);
}
.item-9{
background-color: rgb(3, 232, 248);
}
.item-10{
background-color: rgb(166, 249, 11);
}
fr
为了方便表示比例关系,网格布局提供了fr关键字(fraction的缩写,意为“片段”)
grid-template-columns: repeat(4,1fr);
宽度平均分成4份
grid-template-columns: 1fr 2fr 3fr;
minmax()
函数产生一个长度范围,表示长度就在这个范围之中,它接收两个参数,分别为最小值和最大值
grid-template-columns: 1fr minmax(150px,1fr) //也要去除容器宽高
最小:
最大:
auto
由浏览器自己决定长度
grid-template-columns: 100px auto 100px;
网格线
可以用方括号定义网格线名称,方便以后的引用
grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4]
没什么效果,是以后用来定位用的。
grid-*-gap
现在已经去除了grid前缀,变成了row-gap和column-gap.
row-gap:行与行之间的距离
column-gap:列与列之间的距离
想要同时改变可以使用 gap
row-gap:30px;
column-gap:40px;
gap:50px;
grid-template-area
一个区域由一个或者多个单元格组成,由你决定(具体使用,需要在项目属性里设置)
.main{
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns:[c1] 100px [c2]100px [c3]100px[c4] ;/*此时定义了三列均为100px,如果不定义行,则默认将元素撑到底部*/
grid-template-rows: 100px 100px 100px 100px ;
gap:10px;
grid-template-areas: 'a b c' 'd e f' 'g h i' 'j k l';
}
grid-template-areas:'a b c'
'd e f'
'g h i';
grid-template-areas:'a a a'
'b b b'
'c c c';
/*具有同样标识的为同一块区域*/
grid-template-areas:'a . c'
'd . f'
'g . i';
区域不需要利用,则使用点 “ . " 来表示
区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为 区域名-start,终止网格线自动命名为区域名-end
grid-auto-flow
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是”先行后列“,即先填满第一行,再开始放入第二行(就是子元素的排放顺序)
grid-auto-flow: row;
grid-auto-flow: column;
当元素大小不一利用 grid-auto-flow: row 时:
解决方法:利用
grid-auto-flow: row dense
justify-items(水平方向) / align-items(垂直方向)
设置单元格内容的水平和垂直的对齐方式,是容器属性,对容器内所有的属性有效。
justify-items: start | end | center | stretch
start: 在项目左边对齐
end: 在项目的右边对齐
center: 在项目的中间对齐
align-items: start | end | center | stretch
start: 在项目上边对齐
end: 在项目的下边对齐
center: 在项目的中间对齐
**place-items: center center ** 水平竖直方向对齐方式
justify-content(水平方向)/align-content(垂直方向)
Content ? 见上面基本概念的图
设置整个内容区域的水平和垂直的对齐方式
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
grid-auto-columns/rows
用来设置多出来的项目的宽和高,控制的是隐式行/列(即我们没有定义的行列)。
grid-auto-rows:控制隐式行的高度
grid-auto-columns: 控制隐式列的宽度
比如:
.main{
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns:[c1] 100px [c2]100px [c3]100px[c4] ;/*此时定义了三列均为100px,如果不定义行,则默认将元素撑到底部*/
grid-template-rows: 100px 100px 100px ;
gap:10px;
grid-template-areas: 'a b c' 'd e f' 'g h i' 'j k l';
grid-auto-flow: row;
/*place-items: center center;*/
}
我只设置了 3 x 3 的高度
效果图如下:
利用 grid-auto-rows后:
在上述例子中,你可能会发现我们利用 grid-auto-columns对项目进行改变,10号元素没有变化,这是因为10号元素位于隐式行而不位于隐式列中,我们利用
grid-template-columns:[c1] 100px [c2]100px [c3]100px[c4] ; grid-template-rows: 100px 100px 100px ;
定义了三行三列,10号元素位于4行1列,为隐式行,不为隐式列,所以grid-auto-columns对于10号元素没用,而grid-auto-rows对它有用。
5. 项目属性
[!tip]
- grid-column-start
- grid-column-end
- grid-row-start
- grid-row-end
- grid-column(1,2的简写形式)
- grid-row(3,4的简写形式)
- grid-area
- justify-self
- align-self
- place-self(8,9的简写形式)
grid-column/row
可以添加到项目的CSS属性中,利用网格线选择占用网格的多少,
grid-column:跨列占用多少
grid-row:跨行占用多少
写法:
grid-column:2 / 4
等同于
grid-column-start:2
grid-column-end:4
另一种写法:
grid-column-start: span 2; 从起始线向右跨2格
grid-column-end: span 2; 从结束线向左跨2格
运用:
.item-1{
background-color: wheat;
grid-column-start: 2;
grid-column-end: 4;
} /*从第2条列网格线开始,到第4条列网格线结束*/
或者
.item-1{
background-color: wheat;
grid-column:2 / 4;
} /*从第2条列网格线开始,到第4条列网格线结束*/
.item-1{
background-color: wheat;
grid-row-start: 2;
grid-row-end: 4;
}
或者
.item-1{
background-color: wheat;
grid-row:2 / 4 ;
}
更多写法:
grid-column-end: span 2;
grid-column-start: span 2; //效果相同
从起始线向右跨2格
从结束线向左跨2格
grid-area
可以为项目指定区域,还可以用作grid-row-start grid-column-start grid-row-end grid-column-end的合并简写形式,直接指定项目位置
例子:
.main{
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns:[c1] 100px [c2]100px [c3]100px[c4] ;/*此时定义了三列均为100px,如果不定义行,则默认将元素撑到底部*/
grid-template-rows: 100px 100px 100px ;
gap:10px;
grid-template-areas:
'a b c'
'z z z'
'g h i'
'j k l';
grid-auto-flow: row;
/*place-items: center center;*/
grid-auto-rows: 150px;
grid-auto-columns: 100px;
}
.item-1{
background-color: wheat;
grid-area:z;
}
grid-area: < row-start > / < column-start > / < row-end > < column-end >
justify-self / align-self / place-self
justify-self属性设置单元格内容的水平位置,和justify-items的用法完全一致,但是只作用于单个单元格
align-self属性设置单元格内容的垂直位置,和align-items的用法完全一致,但是只作用于单个单元格
align-self: start | end | center | stretch ;
place-self属性是align-self 和 justify-self 属性的合并简写形式
place-self: center center;
总结
Grid 布局不仅是工具,更是一种 结构化思维 的体现——将页面视为模块化网格的组合,让代码设计与视觉稿高度统一。从简单的等分布局到杂志级复杂排版,Grid 都展现出强大的掌控力。掌握它,你便拥有了网页空间的“造物主”视角!