Grid
布局是微软在2010年提出来的一种新的布局方式,到2016年的时候提交了该布局的草案,通过这三四年的发展,grid
布局慢慢变的成熟,兼容性也愈来愈好,能够适当学起来用起来了css
本次学习的几个点:html
- CSS布局发展过程
- Grid布局的优势以及相关术语介绍
- Grid布局的使用
- 注意事项、备注
- 参考资料
在咱们开始学习前,先了解下它能用在什么状况下ios
例如这个页面就是用grid布局的:css3
Grid布局浏览器
在了解和学习网格布局以前,咱们先了解下什么是网格,网格是一组相交的水平和垂直线,它定义了网格的行和列bash
table
表格布局:table
比其余 html
标记占更多的字节、布局比较死板不灵活、会阻挡浏览器渲染引擎的渲染顺序从而使得加载速度慢float
+ position
方式布局:使用 float
浮动和 position
定位去布局,float
会使得元素脱离文档流,浮动高度塌陷,还须要额外的清除浮动解决这种高度塌陷、不易于垂直居中等问题flexbox
弹性布局:一维布局,最适合应用于程序的组件和比较小规模的布局,比较好用并且支持性较好grid
网格布局:二维布局,适用于大规模的布局例如:下面这两种类型的布局就很适合用grid布局:网络
~备注~dom
本人认为Grid
布局的出现并非要取代上面的几种布局方式,并且跟上面的几种方式一块儿结合使用,用更简洁的代码实现页面布局wordpress
固定或弹性的轨道尺寸:能够给每一个轨道设置固定的尺寸,也能够设置auto
| 1fr
| 10%
等弹性的尺寸,实际展现的轨道大小会随着父级的宽高变化而变化函数
定位项目:能够给每一个子项设置具体所占据的位置
建立隐式的轨道:当子项设置的定位位置超出了父级设定的轨道大小,会建立隐式的轨道
对齐控制:和flexbox
同样,有多种对齐方式的控制
控制重叠内容,直接在子项上设置z-index
的值便可
pc端的浏览器的兼容性仍是不错的,IE10和11须要添加-ms-
来实现兼容
移动端须要注意的是:ios10.3版本如下不支持,使用需斟酌或者作好兼容处理
Grid Container
: 网格容器,一个元素应用了 display: grid;
后就是一个网格容器了,它是全部网格项的父元素,例以下面的代码里<div class="grid"></div>
就是网格容器// html
<div class="grid">
<div class="grid-item1">grid-item1</div>
<div class="grid-item2">grid-item2</div>
<div class="grid-item3">grid-item3</div>
<div class="grid-item4">grid-item4</div>
<div class="grid-item5">grid-item5</div>
<div class="grid-item6">grid-item6</div>
</div>
//css
.grid {
display: grid;
}
复制代码
Grid item
: 网格项,上面的 grid-item
就是网格子项
Grid Line
: 网格线,组成网格项的分界线,虚拟的,下图的3×4的网格里有4条水平网格线和5条垂直网格线
Grid track
: 轨道,网格轨道,两个相邻的网格线之间为网格轨道以下图:共有7个网格轨道,水平方向3个网格轨道,垂直方向4个网格轨道
Grid Cell
: 网格单元,两个相邻的列网格线和两个相邻的行网格线组成的网格单元,网格项是HTML里的dom元素,而网格单元是定义网格容器的时候分割出来的网格单元Grid area
: 网格区域: 四个网格线包围的总区域,与网格单元不一样的是,网格单元必须是相邻的网格线fr
单位:剩余空间分配数,用于在一系列长度值中分配剩余空间,按数字比例分配例如:
网格总宽度若是是600px,那么下面这种设置中,1fr = (600 - 50 - 150) * (1 / (1+3)) = 100px
.grid {
grid-template-columns: 50px 1fr 3fr 150px;
}
复制代码
display
它的值为:
display: grid;
:设置为容器元素display: inline-grid
设置为容器元素,且为行内网格display: subgrid
:若是网格容器自己是网格项,此属性用来继承父网格容器的列和行大小它的兼容性不好,基本能够先不了解
grid-template
: 定义行与列的轨道大小,它是一个复合写法,具体属性包含了:grid-template-rows
: 水平方向划分行,值为每一行的高度,空格分隔grid-template-columns
: 垂直方向划分列,值为每一列的宽度,空格分隔grid-template-areas
: 网格划分区域,值为命名语法:
.container {
grid-template-rows: <track-size> | <line-name> <track-size>;
grid-template-columns: <track-size> | <line-name> <track-size>;
grid-template-areas:
<grid-area-name> | . | none
<grid-area-name> | . | none
}
// 复合写法:
.container {
grid-template: <grid-template-rows> / <grid-template-columns>
}
复制代码
<track-size>
: 可使用css的长度单位、百分比、auto或者一个新的单位fr
其中 auto
是用来表示剩下的长度 单位 fr
:除去其余的设定的固定的宽度之外,剩下的按比例分,相似于flex中的flex: n;
<line-name>
: 能够给每条网格线设置名称 [任何名称]
<grid-area-name>
: 区域名称 "任何名称"
.container {
grid-template-rows: [第一条行线] 25% 100px auto;
grid-template-columns: [第一条列线] 100px 20px auto 40px;
}
复制代码
表现为以下:
grid-template-areas
: 设置区域名称的
grid-gap
:行和列之间的间隔宽度 , 它是两个属性的复合写法grid-gap-rows
: 行与行之间的间隔
grid-gap-columns
: 列与列之间的间隔
.container {
grid-gap-rows: 20px;
grid-gap-columns: 10px;
}
// 复合写法:
.container {
grid-gap: 20px 10px;
}
复制代码
place-items
: 每一个单元格内部的水平垂直对齐方式的复合写法justify-items
: 水平方向对齐方式align-items
: 垂直方向对齐方式两个属性的值都有如下几种
stretch
: 默认值,水平|垂直 内容拉伸填充start
: 水平|垂直 (宽度|高度)收缩为内容大小,(左侧|上侧)对齐end
:水平|垂直 (宽度|高度)收缩为内容大小,(右侧|下侧)对齐center
:水平|垂直 (宽度|高度)收缩为内容大小,居中对齐
.container {
place-items: <align-items> / <justify-items>;
}
复制代码
place-content
: 如下两个属性的复合写法,是表示网络单元的水平布局方式justify-content
: 仅在网格总宽度小于grid容器宽度时候有效果值分为如下几种:
- stretch:拉伸,宽度填满grid容器,须要定的网格尺寸为auto的时候有效,若是定死宽度则没法拉伸
- start:左对齐
- end:右对齐
- center:居中对齐
- space-between:两端对齐
- space-around: 每一个grid子项两侧都环绕互不干扰的等宽的空白间距,最终视觉上边缘两侧的空白只有中间空白宽度一半
- space-evenly:每一个grid子项两侧空白间距彻底相等
align-content
: 网络元素的垂直方向布局方式, 若是grid子项只有一行则不生效,它的值同上grid-auto
: 如下三个属性的复合写法grid-auto-rows
:网格项目多余设置的单元格,会建立隐式轨道
grid-auto-columns
:网格项目多余设置的单元格,会建立隐式轨道
.container {
grid-auto-rows: 100px;
grid-auto-columns: 70px;
}
复制代码
grid-auto-flow
: 控制没有明确指定位置的grid子项的放置方式值分为如下几种:
- row: 默认值,没有指定位置的网格按顺序水平方向排列
- column: 没有指定位置的网格垂直顺序排列
- row dense:自动排列启动密集排序,水平方向
- column dense:自动排列启动密集排序,垂直方向
看示例 demo
grid
: 如下几个属性的复合写法:grid-template-rows
grid-template-columns
grid-template-areas
grid-auto-rows
grid-auto-columns
grid-auto-flow
具体设置值以下:
1.grid:none:全部子属性都是初始化的值
2.grid: <grid-template>
3.grid: <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>?
4.grid: auto-flow & dense ? <grid-auto-rows> ? / <grid-template-columns>
复制代码
auto-flow
: 表示的值为 row
| column
,可是统一使用 auto-flow
来表示,具体须要看它放置的位置在哪里,若是放置在 /
的左侧,就表示 grid-auto-flow: row
, 若是放在右侧,就表示 grid-auto-flow: column
grid: 100px 60px / 1fr 2fr
至关于:
grid-template-rows: 100px 60px;
grid-template-columns: 1fr 2fr;
3.grid: 100px 60px / auto-flow 1fr 2fr
至关于:
grid-template-rows: 100px 60px;
grid-auto-columns: 1fr 2fr;
grid-auto-flow: column
4.grid: auto-flow dense 100px 60px / 1fr 2fr;
至关于:
grid-auto-rows: 100px 60px
grid-template-columns: 1fr 2fr;
grid-auto-flow: row dense
复制代码
使用grid复合写法的例子: grid复合写法demo
以上属性都是外层容器属性的值
grid-column
: 如下两个属性的复合写法grid-column-start
grid-column-end
.item {
grid-column-start: <name> | <number> | span <name> | span <number>
grid-column: <start-line> <end-line>
}
复制代码
值的含义:
<name>
自定义网格线的名称
<number>
从第几条网格线开始
span <name>
当前网格会自动扩充,直到命中指定的网格线名称
span <number>
当前网格会自动跨越指定的网格数量
auto
全自动,包括定位和跨度
例如:下图中的item-a
定义了它从第一条水平方向的网格线到第三条水平方向的网格线,从第2条垂直网格线到第3条垂直网格线,也就是占据了第一、2行第2列
grid-row
: 如下两个属性的复合写法grid-row-start
grid-row-end
.item {
grid-row-start: <name> | <number> | span <name> | span <number>
grid-row: <start-line> <end-line>
}
复制代码
grid-area
: 当前网格所占区域,使用grid-template-areas
自定义网络区域,使用grid-area
让grid子项指定这些使用区域,就自动进行了区域分布 例如:grid-area:
<name> 区域名称,由容器属性grid-template-area建立
<row-start> / <column-start> / <row-end> / <column-end> 占据网格区域的纵横起始位置
复制代码
justify-self
: 单个网格元素的水平对齐方式值分为如下几种:
- stretch(默认):拉伸,水平填充
- start 水平尺寸收缩为内容大小,沿着网格线左侧对齐
- end 水平尺寸收缩为内容大小, 沿着网格线右侧对齐
- center 水平尺寸收缩为内容大小,当前区域内部水平居中对齐显示
align-self
: 单个网格元素的垂直对齐方式 例如:
- stretch(默认):拉伸,垂直填充
- start 垂直尺寸收缩为内容大小,沿着网格线上侧对齐
- end 垂直尺寸收缩为内容大小, 沿着网格线下侧对齐
- center 垂直尺寸收缩为内容大小,当前区域内部垂直居中对齐显示
以上两个属性可使用 place-self
去写 place-items:<align-self> / <justify-self>
repeat()
: 跟踪列表的重复片断,容许大量重复显示模式的行或列以以更紧凑的方式编写可用范围:grid-template-columns
和 grid-template-rows
语法: repeat(<repeat>, <value>)
<repeat>
: 取值有如下几种:
1. 整数,肯定确切的重复次数
2. `<auto-fill>`: 以网格项为准自动填充,须要结合minmax()函数来使用
3. `<auto-fit>` : 以网格容器为准自动填充,须要结合minmax()函数来使用
复制代码
<value>
: 取值有如下几种:
1. 固定长度
2. 百分比
3. fr单位
4. max-content: 表示网格的轨道长度自适应内容最大的那个单元格
5. min-content:表示网格的轨道长度自适应内容最小的那个单元格
6. auto:不推荐使用
复制代码
能够屡次使用
grid-template-columns: 20px auto repeat(3, 1fr) 40px
fit-content()
:参数是长度值或百分比公式:min(maximum size, max(minimum size, argument))
它在内容的最小值和参数中取一个最大值,而后再在内容的最大值中取一个最小值
当内容少时,它取内容的长度,若是内容多,内容长度大于参数长度时,它取参数长度,能够理解为它能够控制最大值是多少
minmax(min, max)
:定义了长度范围区间取值:
1. 固定长度
2. 百分比
3. fr单位
4. max-content: 表示网格的轨道长度自适应内容最大的那个单元格
5. min-content:表示网格的轨道长度自适应内容最小的那个单元格
6. auto:不推荐使用
复制代码
- 当元素设置了网格布局,column、float、clear、vertical-align属性无效
- grid布局是二维布局,适合布局总体