Grid布局
一、前言
Grid布局是css最强大的布局,它和Flexbox布局差不多,只是grid看作是二维布局,而flexbox看作是一维布局。在一些数据可视化的页面布局中,使用grid布局能让你爽到上天。
Grid布局的属性又可以分为俩类:容器属性和项目属性。
二、网格布局中的概念
2.0 容器
网格布局的区域,我们成为“容器”,“容器”内采用网格定位的子元素,成为“项目”
1 | <div id="container"> |
如最外层的 div
元素就是容易,里面的 10个div
为项目,但是 其中最后一个 div
元素中 包含的 span
元素 就不能称之为 项目。它只能是容器的顶层子元素,grid布局只对项目有效。
2.1行和列
容器里面的水平区域称为"行(row)",垂直区域称为"列(column)"。如下图 长方形内的区域就是列,椭圆形内的区域就是行
2.2 cell
单元格:行和列交叉的区域。n行和m列会产生n*m
个单元格
2.3 网格线
如图红色的线即为网格线
三、容器属性
3.1 display属性
怎么启用grid布局,我们知道在使用flexbox布局的时候,我们设置display:flex;
同理设置grid布局:display:grid | inline-grid;
默认情况下容器为块级元素。
注意:当我们设置网格布局以后,容器子元素(项目)的 float、display:inline-blick、display:table-cell、vertical-align、column-设置失效
3.2 grid-template-columns/grid-template-rows
grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。
用法:
1 | grid-template-columns: <track-size> ... | <line-name> <track-size> ...; |
-
track-size:定义网格单元的宽高,其单位可以是一个长度(如px、em、rem、vw、vh)或百分比,也可以是网格中自由空间的份数(单位为fr)。
-
line-name:定义网格线的名称,它不是必须值。可以一个你选择的任意名字,当没有显示设定时,它的名字以数字表示。
1 | <style> |
3.2 repeat(repeatNum,value)
当你想定义重复部分的时候,可以使用repeat()函数去简化。
1 | .container { |
这个函数有时候也可以这么使用如下代码
1 | .container { |
其实他就是重复了俩次即
1 | 100 50 30 100 50 30 |
3.3 auto-fill
因为单元格的大小是可以固定的,如果我们要想在容器中尽可能的多装单元格,可以设置 auto-fill
关键字,表示自动填充。如下代码 容器最大宽度是400px, item的宽度是100px;
1 | <style> |
3.4 fr
fr
这个单位有点和flexbox
中的flex-grow
类似,如下代码
1 | .container{ |
3.5 minmax(min,max)
该函数表示一个区间长度的范围。
1 | grid-template-columns:minmax(100px,2fr); //100px < length <2fr |
3.6 auto
这个关键字的意思就是让浏览器去决定长度大小
1 | grid-template-columns:200px auto 200px; |
如果不设置单元格的min-width,第二列等于该列单元格的最大宽度。
3.7 网格线的名称
grid-template-columns
和grid-template-rows
在设置的时候,还可以设置每一根线的名字,一根网格线可以有多个名字,如下代码:
1 | .container{ |
有了网格线名字之后,我们就可以利用名字去定位项目了。(详细会在项目属性的时候讲解)。
我们在命名网格线名字的时候,最好是 xxx-start / xxx-end
的格式去命名,虽然系统会隐式的在我们名字之后加上start/end
;
3.8 间距
grid-row-gap
设置行与行之间的距离,grid-column-gap
设置列与列之间的距离。
简写属性:grid-gap:<grid-row-gap><grid-column-gap>
3.9 区域
一个区域由单个或者多个单元格组成,grid-template-areas
用于定义区域。
1 | .container{ |
如果某些区域不需要使用,则我们可以使用点来表示(.),即该单元格不属于任何区域。
1 | grid-template-areas: 'a . c' |
4.0 网格元素方向 grid-auto-flow
这个属性有点和flexbox
布局中的flex-direction:row/column
属性类似。
grid-auto-flow:row
子元素会先行后列的形式排列;
grid-auto-flow:column
子元素会先列后行的形式排列;
grid-auto-flow:row dense
:“先行后列”,并且尽可能紧密填满,尽量不出现空格。
grid-auto-flow: column dense
:表示"先列后行",并且尽量填满空格。
1 | **grid-auto-flow:row:** |
1 | **grid-auto-flow:row dense:** |
4.1 justify-items 属性,align-items 属性
这俩个属性和flexbox
中:justify-content和align-items
属性一样;
place-items
属性是align-items
属性和justify-items
属性的合并简写形式
1 | place-items:<align-items> <justify-items> |
4.2 justify-content 属性,align-content 属性
justify-content
属性是整个内容区域在容器里面的水平位置(左中右),align-content
属性是整个内容区域的垂直位置;
它的值中有一个是:space-evenly
:项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。
其他属性和justify-items
属性一样用法。
place-content
属性是align-content
属性和justify-content
属性的合并简写形式。
1 | place-content: <align-content> <justify-content> |
4.3 grid-auto-rows 属性,grid-auto-columns 属性
这俩个属性用来设置多余的行高和列宽。
1 | #container{ |
第八和第九为多余生产的,行高为 50px
四、项目属性
1.0 网格线(grid-column-start/end,gird-row-start/column)
项目的位置是可以指定位置的,其实就是指定网格线的位置
1 |
|
网格线的简写grid-colunm: grid-column-start/end
grid-row: grid-row-start/end
1 | .item { |
也可以用span
标示跨域了多少个格,如上面的代码改为 grid-column:1 / span 3
:
1.1 区域:grid-area
区域可以有任意数量的网格单元组成。直接上代码
1 | #container{ |
grid-area
还可以是 : <grid-row-start> / <grid-column-srart> / <grid-row-end> /<grid-column-end>
的简写形式
1 | .item-1{ |
1.2 justify-self/align-self
这俩个属性就是设置项目自身的水平和垂直位置。和flexbox
中的属性align-self
类似
其简写属性:place-self:<align-self> <justify-self>;
五、总结
grid
布局和flexbox
有许多相识的地方,但grid
布局在数据可视化页面布局中,运用起来十分舒服,笔者在平常开发中一般很少使用grid
布局,😆。不过并不影响它的强大性哇。