Grid布局目录
一.什么是Grid布局?
Flex布局是轴线布局,只能指定“项目"针对轴线的位置,可以看作是一维布局
Grid布局则是将容器划分成
“行”和“列",产生单元格,然后指定“项目所在"的单元格,可以看作是二维布局,Grid布局远比Flex强大
布局方式(常用三种)
- 传统布局方式 利用 position属性+ display 属性+float属性布局,兼容性最好,但是效率低,麻烦!
- flex布局 有一套属性,效率高,兼容性强
- Grid布局 网格布局(Grid)是最强大的css布局方案。但是知识点较多,学习成本相对困难些,目前的兼容性不如flex好!
浏览器兼容性
基本概念
- 容器(有容器属性)
- 项目(有项目属性)
二.容器属性
- 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
1. grid-template-* 分配单位
你想要多少行或者列,就填写相应属性值的个数,不填写,自动分配
/* 三列,每一列100px */
grid-template-columns: 100px 100px 100px;
/* 行,每一行100px */
grid-template-rows: 100px 100px 100px 100px;
1.repeat() 重复的次数与值
第一个参数是重复的次数, 第二个参数是参数所要的重复的值要带单位
2.auto-fill 自适应
有时, 单元格大小是固定的, 但是容器的大小不确定, 这个属性就会自动适应填充/分配
/* auto-fill 容器没有设置宽高时,可以设为自适应 */
grid-template-columns: repeat(auto-fill,100px);
3.fr 比例关系
为了方便表示比例关系, 网格布局提供了fr关键字( fraction的缩写,意为"片段")
/* fr: 分了三列, 每列占三分之一 */
grid-template-columns: repeat(3,1fr);
/* 左边占六分之一,中间占六分之二,右边占六分之三 */
grid-template-columns: 1fr 2fr 3fr;
4.minmax() 最大值与最小值
函数产生一个长度范围, 表示长度就在这个范围之中, 它接受两个参数, 分别是最小值和最大值
/* minmax() 最小不会超过150px, 最大不会超过1fr */
grid-template-columns: 1fr minmax(150px,1fr);
5.auto
剩下的宽度自适应, 随着浏览器剩下的宽度自适应
/* auto 第二个盒子,剩下的宽度自适应 */
grid-template-columns: 100px auto 100px;
6.网格线
网格线,可以用方括号定义网格线名称,方便以后的引用
/* 辅助定位用的 */
grid-template-columns: [c1] 100px [c2] 100px [c3] 100px [c4];
2.grid-row-gap和grid-column-gap间距
item (项目) 相互之间的距离
/* 1. row-gap item之间行与行的间距 */
/* row-gap: 20px; */
/* 2. column-gap item之间列于列之间的距离 */
/* column-gap: 20px; */
/* 3. gap 复合属性,行于列之间的复合属性(行与列的间距),只写一个行于列都会生效 */
gap: 20px;
- 注意∶根据最新标准,上面三个属性名的grd-前缀已经删除,grid- colum-gap和grid-row-gap写成 column-gap和row-gap,grid-gap写成gap
3.grid-template-areas
一个区域由单个或多个单元格组成,由你决定(具体使用,需要在项目属性里面设置)
4.grid-auto-flow 子元素排序方式
划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是“先行后列即先填满第一行,再开始放入第二行(就是子元素的排放顺序)
5.justify-items(水平方向)/align-items(垂直方向)
控制子项的在单元格内水平对齐方式和垂直对齐方式, 子项的对齐方式
/* 1.子项水平对齐方式 */
justify-items: start | end | center | strech;
/* 2子项垂直齐方式 */
align-items: center;
/* 3.复合属性: justify-items|align-items */
place-itmes: 垂直对齐方式 水平对齐方式;
6.justify-content(水平方向) / align-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;
/* 整体的水平和垂直对齐方式 */
justify-content: center;
align-content: center;
7.grid-auto-columns / grid-auto-rows
用来设置多出来的项目宽和高
/* 设置多出来的行/列的宽 */
grid-auto-rows: 50px;
8.总结
| 属性 | 值 | 作用 |
|---|---|---|
| grid-template-columns | 100px 100px 100px; | 三列, 每一列100px |
| grid-template-rows: | 100px 100px 100px ; | 三行, 每一行100px |
| grid-template-rows / columns: | repeat(5,100px); | 参数1:重复的次数 参数2:重复的值 |
| repeat( auto-fill ,100px); | 容器没有设置宽高时,可以设为列自适应 | |
| repeat(3, 1fr ); | fr 分了三列, 每列占三分之一 | |
| minmax(150px, 1fr) | 最小不会超过150px, 最大不会超过1fr | |
| 100px auto100px; | 第二个盒子,剩下的宽度自适应 | |
| [c1] 100px [c2] 100px [c3] 100px [c4]; | 网格线 | |
| row-gap | 20px; | item之间行与行的间距 |
| column-gap | 20px; | item之间列与列之间的距离 |
| gap | 20px; 20px; | gap 行于列之间的复合属性 |
| grid-template-areas | 'a a a' 'b b b' 'c c c'; | 区域的单元格 |
| grid-auto-flow | column | 子元素排序.方式 |
| justify-items | center | 控制子项水平与垂直的对齐方式 |
| justify-content | center | 控制整体的水平和垂直对齐方 |
| grid-auto-rows | 50px | 设置多出来的行/列的宽 |
三.子项属性
- grid-column-start
- grid-column-end
- grid-row-start
- grid-row-end
- gid- column(1和2的简写形式)
- grd-roW(3和4的简写形式
- grid-area
- justity-self
- align-self
- pace-sef(8和9的简写形式)
1.grid-column-start / grid-column-end
用来指定item的列的网格线,具体位置, 根据在哪跟网格线, 进行排列
/* 网格线从第一根开始 */
grid-column-start: 1;
/* 网格线从第三根开始 */
grid-column-end: 3;
/* 复合属性,从第一根网格线开始,到第三根网格线结束 */
grid-column: 1 / 3;
2.grid-row-start / grid-row-end
用来指定item的行的网格线,具体位置, 根据在哪跟网格线, 进行排列
/* 列网格线: 1-3 */
grid-column: 1 / 3;
/* 复合属性: 行网格线: 1-3 */
grid-row: 1 / 3;
3.grid-area
制定项目放在哪一个区域
/* 容器属性,划分区域 */
grid-template-areas: 'a a a' 'b b b' 'c c c';
/* 子项属性,指定当前子项去哪个区域 */
grid-area: b;
- grid-area属性还可用作grid-row-start、grid-column-start、grid-row-end、grid-column-end的合并简写形式,直接指定项目的位置
grid-area: <row-start>/<column-start>/<row-end>/<column-end>;
4.justify-self / align-self / place=self
justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目(水平方向) align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目(垂直方向)
justify-self: start | end | center | strech;
align-self: start | end | center | strech;
place-self属性是align-self属性和justify-self属性的合并简写形式place-self:center center;
5.子项属性总结
| 属性 | 作用 |
|---|---|
| grid-column-start: 1; | 从列的网格线第一根开始/ |
| grid-column-end: 3; | 从列的网格线从第三根结束 |
| grid-column: 1 / 3; | 从列的网格线第一根开始到网格线从第三根结束 |
| grid-row: 1 / 3; | 从行的网格线第一根开始到网格线从第三根结束 |
| grid-area: b; | 指定当前子项去哪个区域, 配合容器的grid-template-areas使用 |
| justify-self: centert; | 当前的子项水平居中 |
| align-self: center; | 当前子项垂直居中= |
本文使用 mdnice 排版