网格布局
网格布局(grid)
网格布局是一套二维页面布局系统,以下内容来自学习css网格布局
启用网格
display 属性设为 grid 或 inline-grid 就创建了一个网格容器,容器的所有直接子节点自动成为网格项目
display: grid网格项目按行排列,网格项目占用整个容器的宽度display: inline-grid网格项目宽度由自身宽度决定display: subgrid继承其父级网格容器的行列大小,它是其父级网格容器的一个网格项目
column、float、clear 和 vertical-align 对网格容器没有效果
网格容器的一些属性
grid-template-columns 和 grid-template-rows
属性 grid-template-columns 和 grid-template-rows 用来显式定义网格,分为行轨道和列轨道
grid-template-rows 定义行尺寸,即轨道尺寸,轨道尺寸可以是任何非负的长度值(px、%、em 等)
1 |
|

grid-template-columns 用于定义列的尺寸,例如 grid-template-columns: 1fr 1fr 2fr; fr 表示按比列划分空间,前两列宽度相同,是最后一列宽度的一半,fr 可以和其它单位混用,混用时,fr 的计算基于其它单位分配后的剩余空间
1 | .grid { |

轨道最小最大尺寸设置
函数 minmax() 用来定义轨道最小/最大边界值,minmax 接收两个参数,第一个参数表示最小轨道尺寸,第二个参数表示最大轨道尺寸,长度值可以是 auto,表示轨道尺寸可以根据内容大小进行伸长或收缩
1 | .grid { |

重复的网格轨道
使用函数 repeat() 用来定义重复的网格轨道,特别是有多个相同轨道的项目,函数 repeat 接收两个参数:第一个参数表示重复的次数,第二个参数表示轨道尺寸
1 | .grid { |

1 | grid-template-columns: 30px repeat(3, 1fr) 30px; |

定义网格间隙
属性 grid-column-gap 和 grid-row-gap 定义网格间隙,网格间隙只创建在行列之间,项目和边界之间无间隙,间隙尺寸可以是任何非负的长度值
1 | .grid { |

属性 grid-gap 是 grid-row-gap 和 grid-column-gap 的简写形式,第一个值表示行间隙,第二个值表示列间隙,如果只给定一个值,即表示行间隙也表示列间隙
1 | .grid { |

1 | .grid { |

网格线命名
当利用属性 grid-template-rows 和 grid-template-columns 定义网格的时候,可以同时定义网格线的名称,网格线名称可以用来定位网格项目
为避免混淆,网格线名称应避免使用规范中的关键字(span 等)
定义网格线名称的方法是要将其放在中括号内([name-of-line]),并和网格轨道相对应
1 | .grid { |

可以给同一网格线定义多个名称,方法就是在中括号内用空格将多个名称分开,每个网格线名都可以被引用,以用来定位网格项目
1 | .grid{ |

函数 repeat() 可以定义同名网格线,多个网格线拥有同样的名字,同名的网格线会被分配一个位置编号,作为其唯一标识
1 | .grid{ |

用网格区域命名
一组区域名称要放在单引号或双引号内,每一个名称之间以空格分割,每一组名称定义一行,每一个名称定义一列
1 | .grid{ |

网格项目上的一些属性
用网格线编号定位项目
网格线本质上是用来表示网格轨道的开始和结束,每条网格线编号都以1开始,以1为步长向前编号,其中包括行列两组网格线
1 | .item1{ |

属性 grid-row 是 grid-row-start 和 grid-row-end 的简写形式
属性 grid-column 是 grid-column-start 和 grid-column-end 的简写形式
如果只指定一个值,它表示 grid-row-start 或 grid-column-start
如果两个值都指定,第一个表示 grid-row-start 或 grid-column-start 第二个值表示 grid-row-end 或 grid-column-end,而且它们之间必须使用 / 隔开
1 | .item1{ |

属性 grid-area 是 grid-column-start、grid-column-end、grid-row-start 和 grid-row-end 的简写形式
如果四个值都指定,第一个表示 grid-row-start,第二个表示 grid-column-start,第三个表示 grid-row-end,第四个表示 grid-column-end,同样的它们之间需要使用 / 进行分割
1 | .item1{ |

网格项目跨越行列
网格项目默认都占用一行和一列,但可以使用定位项目的属性来指定项目跨越多行多列
1 | .item1{ |

1 | .item1{ |

1 | .item1{ |

关键字span可以指定跨越行和列的数量
1 | .item1{ |

用网格线名称定义项目
利用命名的网格线来进行网格项目定位,注意:
1 | .item1{ |

1 | .item1{ |
用同名网格线来定位项目时,应注意在网格线名称和编号之间有一个空格

使用网格区域定位项目
网格区域名称可以用在属性 grid-row-start、grid-row-end、grid-column-start 和 grid-column-end 的值中,用来定位项目
1 | header{ |

1 | footer{ |

网格区域名称也可以用于简写属性 grid-area 的值中
1 | aside{ |

隐式网络
隐式网络用来在显式网格之外定位项目,有时在显示网格中没有足够的空间,或者要在显式网格之外定位项目就要用到隐式网格,这时可以把这些项目放置在隐式网格中
隐式网格可以通过属性 grid-auto-rows、grid-auto-columns 和 grid-auto-flow 来定义
1 | .grid{ |
上面 css 只定义了一个行轨道,项目 1 和 2高 70px,第二行轨道由隐式网格自动创建并为项目 3 和 4 分配了空间,属性 grid-auto-rows 定义了隐式网格的行轨道尺寸,即项目 3 和 4 的高度是 140px

缺省的网络布局方向是行的方向(row)
1 | .grid{ |

缺省的网格布局方向是定义为列的方向(column)

1 | .grid{ |
上例中只定义了两个列轨道尺寸 30px 和 60px
隐式网格中自动创建了其他列并给项目 3、4、5 分配空间,分配的尺寸通过 grid-auto-columns 定义

隐式命名的网格区域
网格线名称可以任意指定,但分配以 -start 和 -end 结尾的名字有额外的好处,这样隐式创建了具名网格区域,该名称可以用于项目定位
1 | .grid{ |
上例中,行和列都有名为 inner-start 和 inner-end 的网格线,它们隐式地给网格区域分配了名称(inner)
1 | item1{ |

隐式命名的网格线
隐式命名网格线和隐式命名的网格区域的工作原理恰好相反
1 | .grid{ |
定义网格区域时隐式命名了网格线的名称,这些网格线的名称是基于区域名加上 -start 或 -end 后缀组成的

1 | item1{ |

层叠网格项目
通过项目定位可以使多个项目层叠在一起,属性 z-index 可以改变层叠项目的层次
1 | .item1, |
上例中,项目 1 和 2行定位于第一条网格线,并跨越两列,两个项目都是用网格线编号进行定位,项目 1 起始于第一条列网格线,项目 2 起始于第二条网格线,这使得两个项目在第一行中间列发生了层叠
缺省情况下,项目 2 将层叠于项目 1 之上,然而,给项目 1 设置属性 z-index: 1 就使得项目 1 层叠于项目 2 之上

1 | .overlay{ |
利用 grid-template-areas 定义中的隐式网格线名称,定位了一个网格项目 overlay 并将层叠于上层

网格项目的对齐方式
网格项目可以按行或列的轴线方向实现多种对齐方式
属性 justify-items 和 justify-self 以行轴为参照对齐项目,属性 align-items 和 align-self 以列轴为参照对齐项目
属性 justify-items 和 align-items 是网格容器的属性,支持如下值
autonormalstartendcenterstretchbaselinefirst baselinelast baseline
1 | .grid{ |
在行的轴线起点处对齐

1 | .grid{ |
在行的轴线中心处对齐

1 | .grid{ |
在行的轴线方向延伸并填满整个区域,stretch 是缺省值

1 | .grid{ |
在列的轴线起点处对齐

1 | .grid{ |

1 | .grid{ |
在列的轴线终点处对齐

1 | .grid{ |
在列的轴线方向延伸并填满整个区域

1 | .grid{ |
项目定位于行轴和列轴线的中间位置

网格项目可以使用属性 align-self 和 justify-self 定义自己的对齐方式,并支持如下属性值
autonormalstartendcenterstretchbaselinefirst baselinelast baseline
1 | .item1{ |
属性 justify-self 在行的轴线方向定义对齐方式

1 | .item1{ |
属性 align-self 在列的轴线方向定义对齐方式

1 | .item1{ |
定位于行轴线和列轴线的中间位置

网格轨道的对齐方式
在网格容器中,网格轨道沿轴线方向有多种对齐方式
属性 align-content 用于定义列的网格轨道沿着行轴线对齐的方式,而属性 justify-content 用于定义行的网格轨道沿着列的轴线的对齐方式,并分别支持如下属性
normalstartendcenterstretchspace-aroundspace-betweenspace-evenlybaselinefirst baselinelast baseline
1 | .grid{ |
列的轨道在行的轴线起点处对齐,start 是缺省值

1 | .grid{ |
列的轨道在行的轴线终点处对齐

1 | .grid{ |
列的轨道在行的轴线中间对齐

1 | .grid{ |
在每一列的两侧平均分配额外空间

1 | .grid{ |
在列与列之间平均分配额外的空间

1 | .grid{ |
在列与列之间及列与边界之间平均分配额外的空间

1 | .grid{ |
行的轨道在列的轴线起点处对齐,属性 start 是缺省值

1 | .grid{ |
行的轨道在列的轴线终点处对齐

1 | .grid{ |
行的轨道在列的轴线中点处对齐

1 | .grid{ |
每一行的两侧平均分配额外空间

1 | .grid{ |
在行与行之间平均分配额外空间

1 | .grid{ |
在行与行之间及行与边界之间平均分配额外空间



