一、布局知识
1.布局发展进程
2.网格布局简介
网格布局(grid)是最强大的 CSS 布局方案。
它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了
3.Grid与Flex比较
-
Flexbox是一维布局,只能在一条直线上放置内容区块
-
Grid是二维布局,根据设计需求将内容区块放置在任何地方
二、基本概念
1.容器和项目
采用网格布局的区域,称为"容器"(container)。容器内部采用网格定位的子元素,称为"项目"(item)
项目1
项目2
项目3
最外层的类名为warp的div为整个容器,三个儿子元素div为项目
注意:Grid 布局只对项目生效,对里面项目里子元素不起作用
2.行和列
容器里面的水平区域称为"行"(row),垂直区域称为"列"(column)
3.单元格
行和列的交叉区域,称为"单元格"(cell)。
正常情况下,n行和m列会产生n x m个单元格。比如,3行3列会产生9个单元格。
上图每一个颜色的格子都为一格单元格
4.图形
- 网格线(grid line)
row line:行线
column:列线 - trank:网格轨道,或列线和列线之所形成的区域,用来摆放子元素
- gap:网格间距,行线和行线,或列线和列线之间所形成的不可利用的区域,用来分隔元素
- cell:网格单元格,由行线和列线所风格出来的区域,用来摆放子元素
三、容器属性
1.display属性
指定一个容器采用网格布局
div {
display: grid;
}
2.grid-template-columns 属性,grid-template-rows 属性
-
grid-template-columns 属性定义每一列的列宽
-
grid-template-rows 属性定义每一行的行高
设置一个为3行3列,列宽和行高都是100px的网格布局
.container {
display: grid;
grid-template-columns: 100px 100px 100px; /* 设置网格为三列,每一列宽度为100px */
grid-template-rows: 100px 100px 100px; /* 设置网格为三行,每一行高度为100px */
}
除了使用绝对单位,也可以使用百分比设置行高和列宽
.container {
display: grid;
grid-template-columns: 33.33% 33.33% 33.33%; /* 设置网格为三列,每一列占比容器宽度的33.33% */
grid-template-rows: 33.33% 33.33% 33.33%; /* 设置网格为三行,每一行占比容器高度的33.33% */
}
2.1 repeat()函数
-
如果网格有很多,要写很多重复值的时候,此时用repeat()函数
.container { display: grid; grid-template-columns: repeat(3, 33.33%); /* 设置容器分成3列,每列占比总容器宽度的33.33% */ grid-template-rows: repeat(3, 33.33%); /* 设置容器分成3行,每列占比总容器高度的33.33% */ }
-
repeat()重复某种模式也是可以的
.container { display: grid; rid-template-columns: repeat(2, 100px 20px 80px) /* 设置容器分成6列2组,每组3列,宽度分别为100px,20px,80px */ }
2.2 auto-fill 关键字
有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充
.container {
display: grid;
grid-template-columns: repeat(auto-fill, 100px); /* 设置容器的宽度为100px,然后自动填充,直到容器不能放置更多的列 */
}
2.3 fr 关键字
为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍
.container {
display: grid;
grid-template-columns: 1fr 1fr; /* 设置容器为2列,2列的占容器的宽度占比为1:1 */
grid-template-rows: repeate(5,100px);
}
-
fr可以与绝对长度的单位结合使用,这时会非常方便
.container { display: grid; grid-template-columns: 150px 1fr 2fr; /* 设置容器为3列,第一列的宽度为150像素,第二列的宽度是第三列的一半 */ }
2.4 minmax() 函数
minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值
.container {
display: grid;
grid-template-columns: 1fr 1fr minmax(100px, 1fr); /* 设置容器为3列,第一列和第二列的占比相同,第三列的宽度不小于100px,不大于1fr */
}
2.5 auto 关键字
auto关键字表示由浏览器自己决定长度
grid-template-columns: 100px auto 100px;
- 上面代码中,第二列的宽度,基本上等于该列单元格的最大宽度,除非单元格内容设置了min-width,且这个值大于最大宽度
2.6 网格线的名称
grid-template-columns属性和grid-template-rows属性里面,还可以使用方括号,指定每一根网格线的名字,方便以后的引用
.container {
display: grid;
grid-template-columns: [c1] 100px [c2] 100px [c3] auto [c4];
grid-template-rows: [r1] 100px [r2] 100px [r3] auto [r4];
}
- 方括号里面依次表示每根线的名字,网格布局允许同一根线有多个名字,比如[fifth-line row-5]
3.grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性
3.1 grid-row-gap 属性,grid-column-gap 属性
grid-row-gap属性设置行与行的间隔(行间距),grid-column-gap属性设置列与列的间隔(列间距)
.container {
grid-row-gap: 20px; /* 设置行间距为20px */
grid-column-gap: 20px; /* 设置列间距为20px */
}
3.2 grid-gap属性
grid-gap属性是grid-column-gap和grid-row-gap的合并简写形式
-
语法1
.container { /* grid-gap:
; */ grid-gap: 20px 20px; /* 设置行间距和列间距为分别20px */ } -
语法2:如果grid-gap省略了第二个值,浏览器认为第二个值等于第一个值
.container { grid-gap: 20px; /* 也表示设置行间距和列间距为分别20px */ }
4.grid-template-areas 属性
网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成。grid-template-areas属性用于定义区域
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-template-areas: 'a b c'
'd e f'
'g h i';
}
上面代码先划分出9个单元格,然后将其定名为a到i的九个区域,分别对应这九个单元格
多个单元格合并如下
grid-template-areas: 'a a a'
'b b b'
'c c c';
上面代码将9个单元格分成a、b、c三个区域。
5.grid-auto-flow 属性
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"
grid-auto-flow: column;
6.justify-items 属性,align-items 属性,place-items 属性
6.1 justify-items 属性
justify-items属性设置单元格内容的水平位置(左中右),align-items属性设置单元格内容的垂直位置(上中下)
-
语法
.container { justify-items: start | end | center | stretch; align-items: start | end | center | stretch; }
两个两个属性的写法完全相同,都可以取下面这些值
- start:对齐单元格的起始边缘。
- end:对齐单元格的结束边缘。
- center:单元格内部居中。
- stretch:拉伸,占满单元格的整个宽度(默认值)。
.container {
justify-items: start; /* 设置水平方向对齐方式为左对齐 */
}
.container {
align-items: start; /* 设置垂直方向对齐方式为上对齐 */
}
6.2 place-items属性
place-items属性是align-items属性和justify-items属性的合并简写形式。
.container {
/* place-items: ; */
place-items: start end; /* 设置水平方向为左对齐,垂直方向为下对齐 */
}
- 如果省略第二个值,则浏览器认为与第一个值相等
7.justify-content 属性,align-content 属性,place-content 属性
7.1 justify-content 属性,align-content 属性
justify-content属性是整个内容区域在容器里面的水平位置(左中右),align-content属性是整个内容区域的垂直位置(上中下)
.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
这两个属性的写法完全相同,都可以取下面这些值。(下面的图都以justify-content属性为例,align-content属性的图完全一样,只是将水平方向改成垂直方向。)
-
start - 对齐容器的起始边框
-
end - 对齐容器的结束边框
-
center - 容器内部居中
-
stretch - 项目大小没有指定时,拉伸占据整个网格容器
-
pace-around - 每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
-
space-between - 项目与项目的间隔相等,项目与容器边框之间没有间隔
-
space-evenly - 项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
7.2 place-items 属性
place-content属性是align-content属性和justify-content属性的合并简写形式
.container {
/* place-content: */
place-content: space-around space-evenly;
}
- 如果省略第二个值,浏览器就会假定第二个值等于第一个值
8.grid-auto-columns 属性,grid-auto-rows 属性
-
有时候,一些项目的指定位置,在现有网格的外部。比如网格只有3列,但是某一个项目指定在第5行。这时,浏览器会自动生成多余的网格,以便放置项目。
-
grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns和grid-template-rows完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。
-
示例
定义一个3行3列的grid网格布局,其中有两个元素在网格布局之外,8号项目指定在第4行,9号项目指定在第5行
.container {
display: grid;
/* 设置容器为一个3行3列,行高与列宽都为100px的布局 */
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
grid-auto-rows: 50px; /* 为多出来的8号项目和9号项目自动创建两个行,并设置行高为50px */
}
-
grid-auto-rows: 50px; 表示为多出来的8号项目和9号项目自动创建两个行,并设置行高为50px
9.grid-template 属性,grid 属性
9.1 grid-template 属性
grid-template属性是grid-template-columns、grid-template-rows和grid-template-areas这三个属性的合并简写形式
9.2 grid 属性
grid属性是grid-template-rows、grid-template-columns、grid-template-areas、 grid-auto-rows、grid-auto-columns、grid-auto-flow这六个属性的合并简写形式
四、项目属性
1.grid-column-start 属性,grid-column-end 属性,grid-row-start 属性,grid-row-end 属性
1.1 项目的位置是可以指定的,具体方法就是指定项目的四个边框,分别定位在哪根网格线(合并单元格)
- grid-column-start属性:左边框所在的垂直网格线
- grid-column-end属性:右边框所在的垂直网格线
- grid-row-start属性:上边框所在的水平网格线
- grid-row-end属性:下边框所在的水平网格线
例如
.item-1 {
/* 将元素的位置放到第1根列线开始,第3跟列线结束 */
grid-column-start: 1;
grid-column-end: 3;
/* 将元素的位置放到第2根行线开始,第4跟行线结束 */
grid-row-start: 2;
grid-row-end: 4;
}
1.2 除了指定为第几个网格线,还可以指定为网格线的名字
.item-1 {
/* 定位第一根列线和最后一根列线的名字 */
grid-column-start: header-start;
grid-column-end: header-end;
}
1.3 用span关键字,表示"跨越",即左右边框(上下边框)之间跨越多少个网格
.item-1 {
/* 表示项目的左边框距离右边框跨越2个网格 */
grid-column-start: span 2;
/* 表示项目的右边框距离左边框跨越2个网格,效果与上面效果一样 */
/* grid-column-end: span 2; */
}
2.grid-column 属性,grid-row 属性
grid-column属性是grid-column-start和grid-column-end的合并简写形式
grid-row属性是grid-row-start属性和grid-row-end的合并简写形式
-
例子
.item-1 { /* 语法:grid-column:起始网格线 / 结束网格线 */ grid-column: 1 / 3; /* 第一根列线到第三根列线 */ grid-row: 1 / 3; /* 第一根行线到第三根行线 */ }
3.grid-area 属性
grid-area属性指定项目放在哪一个区域
.item-1 {
/* 将1号项目放到e区域 */
grid-area: e;
}
grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置
-
语法
.item { grid-area:
/ / / ; } -
例子
.item-1 { grid-area: 1 / 1 / 3 / 3; }
4.justify-self 属性,align-self 属性,place-self 属性
4.1 justify-self 属性,align-self 属性
justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目
align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目
取值
start:对齐单元格的起始边缘
end:对齐单元格的结束边缘
center:单元格内部居中
stretch:拉伸,占满单元格的整个宽度(默认值)-
语法
.item { justify-self: start | end | center | stretch; align-self: start | end | center | stretch; }
-
例子
.item-a { /* 将项目置于单元格的起始边缘 */ justify-self: start; }
4.2 place-self 属性
place-self属性是align-self属性和justify-self属性的合并简写形式
-
语法
.item-a { /* place-self:
; */ /* 将项目设置垂直方向单元格内部居中,以及水平方向单元格内部居中 */ place-self: center center; }