Grid布局
01 简介
Grid 布局是 CSS 中最强大的布局方案,它将网页划分成一一个个网格,可以任意组合不同的网格,做出各种各样的布局。
与 flex 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行。
Grid属性分为两类,一类作用于grid容器,一类作用于grid子项目上
属性繁多,按需选用
参考:CSS Grid 布局完全指南(图解 Grid 详细教程)
https://www.html.cn/archives/8510#prop-grid-template-columns-rows
02 网格容器(Grid Container)的属性
display
grid-template-columns
grid-template-rows
grid-template-areas
grid-template
grid-column-gap
grid-row-gap
grid-gap
justify-items
align-items
place-items
justify-content
align-content
place-content
grid-auto-columns
grid-auto-rows
网格项(Grid Items) 属性
grid-column-start
grid-column-end
grid-row-start
grid-row-end
grid-column
grid-row
grid-area
justify-self
align-self
place-self
网格线(Grid Line)
组成网格线的分界线。它们可以是列网格线(column grid lines),也可以是行网格线(row grid lines)并且居于行或列的任意一侧。
网格轨道(Grid Track)
两个相邻的网格线之间为网格轨道,可以认为它们是网格的列或行
网格单元(Grid Cell)
两个相邻的列网格线和两个相邻的行网格线组成的是网格单元,它是最小的网格单元
网格区(Grid Area)
网格区是由任意数量网格单元组成
03 容器中的属性
- display属性 将元素定义为网格容器,并为其内容建立新的 网格格式上下文
.container {
display: grid | inline-grid |subgrid;
}
//grid :生成一个块级网格
//inline-grid :生成一个内联网格
//subgrid:如果网格容器本身是网格项(嵌套网格容器),此属性用来继承其父网格容器的列、行大小
- grid-template属性
(1)使用以空格分隔的多个值来定义网格的列和行
此属性用在容器(container)上面
.container {
grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
}
// track-size: 可以使用css长度(px、em等)、百分比、或用分数(用 fr 单位)
//line-name:可以选择任何名字
(2)grid-template-areas
通过引用 grid-area 属性指定的 网格区域(Grid Area) 名称来定义网格模板
.container {
grid-template-areas: none|
"grid-area-name|. grid-area-name|. grid-area-name|. ..."
"grid-area-name|. grid-area-name|. grid-area-name|. ..."
"......";
}
//grid-area-name:使用 grid-area 属性设置的网格区域的名称
//“.”:点号代表一个空网格单元
//none:没有定义网格区域
grid-template
在单个声明中定义 grid-template-rows、grid-template-columns、grid-template-areas的简写
(简写可读性较差)
- none:将三个属性都设置为其初始值。所谓初始值默认为一行一列一个区域,也就是说回归到块元素本质,就是一个块。网格布局某些方面来说就是把我们的一个块给它用一种格子的形式把他区分为多个格子,也可以理解成是多个块。
- subgrid:把 grid-template-rows 和 grid-template-columns 设置为subgrid,并且 grid-template-areas 设置为初始值。简单强调一下,第一:所谓的把行跟列设置为subgrid就是说还是得自己定义一下行和列,都自己定义了,就不必再简写了;第二:把网格区域定义为初始值,就是每个区域的大小都是一个网格单元,如果是这样其实就没必要去定义它。subgrid是目前为止所有浏览器都不兼容,那么在这里它依然适用,所以跟大家说一下:不推荐大家使用,只需了解知道即可。
- grid-template-rows / grid-template-columns:把 grid-template-rows 和 grid-template-columns 设置为指定值,与此同时,设置 grid-template-areas 为none
- gap属性
指定网格线的大小,可以想象为设置列/行之间间距的宽度,也可以说是网格轨道之间的间距
.container {
grid-column-gap: <line-size>;
grid-row-gap: <line-size>;
}
//line-size:一个长度值
grid-gap
grid-row-gap 和 grid-column-gap 的缩写
.container {
grid-gap: <grid-row-gap> <grid-column-gap>;
}
//如果没有指定 grid-row-gap,则会被设置为与 grid-column-gap 相同的值
-
items属性
(1)justify-items
沿着行轴对齐网格内的内容
.container {
justify-items: start | end | center | stretch;
}
//start:内容与网格区域的左端对齐
//end:内容与网格区域的右端对齐
//center:内容位于网格区域的中间位置
//stretch:内容宽度占据整个网格区域空间(默认值)
(2)align-items
沿着列轴对齐网格内的内容
.container {
align-items: start | end | center | stretch;
}
//start:内容与网格区域的顶端对齐
//end:内容与网格区域的底部对齐
//center:内容位于网格区域的垂直中心位置
//stretch:内容高度占据整个网格区域空间(默认值)
(3)place-items
设置 justify-items 和 align-items 的简写形式
书写顺序为先列轴属性值后行轴属性值
.container {
place-items: center;
}
//表示水平居中
- content属性
(1)justify-content
设置网格容器内的网格沿着行轴对齐网格的对齐方式
.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
//start:网格与网格容器的左边对齐
//end:网格与网格容器的右边对齐
//center:网格与网格容器的中间对齐
//stretch:调整 grid item 的大小,让宽度填充整个网格容器
//space-around:在 grid item 之间设置均等宽度的空白间隙,其外边缘间隙大小为中间空白间隙宽度的一半
//space-between:在 grid item 之间设置均等宽度的空白间隙,其外边缘无间隙
//space-evenly:在每个 grid item 之间设置均等宽度的空白间隙,包括外边缘
(2)align-content
设置网格容器内的网格沿着列轴对齐网格的对齐方式
.container {
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
//start:网格与网格容器的顶部对齐
//end:网格与网格容器的底部对齐
//center:网格与网格容器的中间对齐
//stretch:调整 grid item 的大小,让高度填充整个网格容器
//space-around:在 grid item 之间设置均等高度的空白间隙,其外边缘间隙大小为中间空白间隙宽度的一半
//space-between:在 grid item 之间设置均等高度的空白间隙,其外边缘无间隙
//space-evenly:在每个 grid item 之间设置均等高度的空白间隙,包括外边缘
设置 align-content 和 justify-content 的简写形式
书写顺序为先列轴对齐属性值后行轴对齐属性值
- grid-auto属性
指定自动生成的网格轨道(又名隐式网格轨道)的大小
隐式网格轨道在显示的定位超出指定网格范围的行或列时被创建。也就是说网格项超出,一种是太多了,还有一种分两种情况:如果说仅仅因为太多的话,我们只需要控制行就可以了,列这一块的话肯定是跟着上面是一样的。但是有时列也会超出,超出情况会在讲到网格项的地方提到过,当网格项确定在网格单元或网格区域的时候是可以控制的,控制的时候除了网格区域的名字之外,它也可以通过地址条网格线来控制,但是这个线的名字如果是超过的时候就会出来,那么在这种情况下就会自动生成隐式网格轨道。
.container {
grid-auto-columns: <track-size> ...;
grid-auto-rows: <track-size> ...;
}
//track-size:可以是一个长度值,一个百分比,或者一个*空间的一部分(使用 fr 单位)
grid-auto-flow
控制自动布局算法的工作方式
.container {
grid-auto-flow: row | column | row dense | column dense
}
//row:告诉自动布局算法依次填充每行,根据需要添加新行 (默认)
//column:告诉自动布局算法依次填充每列,根据需要添加新列
//dense:告诉自动布局算法,如果后面出现较小的 grid item,则尝试在网格中填充空洞
dense 只会更改网格项的可视顺序,并可能导致它们出现乱序,这对可访问性不利
在单个属性中设置所有以下属性的简写: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow
左对齐、右对齐这些对齐方式等不能简写,我们可以把多少行多少列以及它的区域还有隐式轨道以及他的布局方式都可以简写到 grid 里面并且同时将 sets grid-column-gap 和 grid-row-gap设置为他们的初始值,即使它们不能被此属性显示设置。
.container {
grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]];
}
//none:将所有子属性设置为其初始值。
//grid-template-rows / grid-template-columns:将 grid-template-rows 和 grid-template-columns //分别设置为指定值,将所有其他子属性设置为其初始值
//grid-auto-flow [grid-auto-rows [/ grid-auto-columns]]:接受所有与 grid-auto-flow, //grid-auto-rows 和 grid-auto-columns 相同的值。如果省略 grid-auto-columns,则将其设置为 //grid-auto-rows指定的值。如果两者都被省略,则它们被设置为它们的初始值
04 CSS函数
repeat()
fit-content()
minmax()
跟踪列表的重复片段,允许大量显示重复模式的列或行以更紧凑的形式编写。
.container {
grid-template-columns: repeat(repeat, values);
grid-template-rows: repeat(repeat, values);
}
这个函数可以用在 CSS Grid 属性 grid-template-columns 和 grid-template-rows
number:整数,确定确切的重复次数。
auto-fill:以网格项为准自动填充。
auto-fit:以网格容器为准自动填充。
length:非负长度。
percentage:相对于列轨道中网格容器的内联大小的非负百分比,以及行轨道中网格容器的块长度。
flex:单位为 fr 的非负维度,指定轨道弹性布局的系数值。
max-content:表示网格的轨道长度自适应内容最大的那个单元格。
min-content:表示网格的轨道长度自适应内容最小的那个单元格。
auto:作为最大值时,等价于 max-content。作为最小值时,它表示轨道中单元格最小长宽(由min-width/min-height)的最大值。
根据公式min(最大大小、最大值(最小大小、参数))将给定大小夹紧为可用大小。
.container {
grid-template-columns: fit-content([ <length> | <percentage> ]);
grid-template-rows: fit-content([ <length> | <percentage> ]);
}
//length:一个绝对的长度
//percentage:相对于给定轴上可用空间的百分比
- minmax()
定义了一个长宽范围的闭区间
minmax([ <length> | <percentage> | <flex> | min-content | max-content | auto ],
[ <length> | <percentage> | <flex> | min-content | max-content | auto ]);
length:非负长度。
percentage:相对于列轨道中网格容器的内联大小的非负百分比,以及行轨道中网格容器的块长度。
flex:单位为 fr 的非负维度,指定轨道弹性布局的系数值。
max-content:表示网格的轨道长度自适应内容最大的那个单元格。
min-content:表示网格的轨道长度自适应内容最小的那个单元格。
auto:作为最大值时,等价于 max-content。作为最小值时,它表示轨道中单元格最小长宽(由min-width/min-height)的最大值。
05 网格项上的属性
start / end :规定每一个网格项在那个区域当中
grid-area:跟网格区域一样
self:自身里面的对齐方式
start / end 和 grid-area 两个属性都是规划出一个网格区域,把网格项放在一个网格区域里面,唯一不同的是 start / end 是通过网格线来规划出网格区域,而 grid-area 是通过网格区域在并列网格容器当中时就定义好的网格区域,然后直接来读取这个网格区域就可以了。
使用特定网格线来确定 网格项(grid item)在网格内的位置
.item {
grid-column-start: <number> | <name> | span <number> | span <name> | auto
grid-column-end: <number> | <name> | span <number> | span <name> | auto
grid-row-start: <number> | <name> | span <number> | span <name> | auto
grid-row-end: <number> | <name> | span <number> | span <name> | auto
}
//line :可以是一个数字来指代相应编号的网格线,也可使用名称指代相应命名的网格线
//span number :网格项将跨越指定数量的网格轨道
//span name :网格项将跨越一些轨道,直到碰到指定命名的网格线
//auto:自动布局,或者自动跨度,或者跨越一个默认的轨道
//如果没有声明 grid-column-end / grid-row-end,默认情况下,该网格项将跨越1个轨道
//网格项可以相互重叠,可以使用 z-index 来控制它们的堆叠顺序
grid-column-start + grid-column-end 和 grid-row-start + grid-row-end 的简写形式
.item {
grid-column: <start-line> / <end-line> | <start-line> / span <value>;
grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}
eg:
.container > .item:nth-child(1) {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 2;
grid-row-end: 4;
}
等同于
.container > .item:nth-child(1) {
grid-column: 2 / 4;
grid-row: 2 / 4;
}
等同于
.container > .item:nth-child(1) {
grid-column: 2 / span 2;
grid-row: 2 / span 2;
}
- grid-area 属性
给 gird item 进行命名以便于使用 grid-template-areas 属性创建模板时来进行引用。
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
//name :grid-template-areas 中定义的命名
//row-start / column-start / row-end / column-end:可以是数字,也可以是网格线的名字
eg:
.container > .item-a {
grid-area: row1-start / 2 / 3 / five;
}
等同于
.container > .item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start;
grid-row-end: 3;
}
.container > .item-a {
grid-column: 2 / span 2;
grid-row: 2 / span 2;
}
等同于
.container > .item-a {
grid-area: 2 / 2 / 4 / 4;
}
沿着行轴对齐 grid-item 里的内容。
.item {
justify-self: start | end | center | stretch;
}
//start:将内容对齐到网格区域的左端
//end:将内容对齐到网格区域的右端
//center:将内容对齐到网格区域的中间
//stretch:填充网格区域的宽度(默认值)
(2)align-self
沿着列轴对齐 grid-item 里的内容
.item {
align-self: start | end | center | stretch;
}
//start:将内容对齐到网格区域的顶部
//end:将内容对齐到网格区域的底部
//center:将内容对齐到网格区域的中间
//stretch:填充网格区域的高度(默认值)
参考:网格布局
https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Grid_Layout/Basic_Concepts_of_Grid_Layout
本文地址:https://blog.csdn.net/m0_52386161/article/details/112518571
上一篇: Vs2019+Qt+Opencv环境配置心得(图文)
下一篇: AI怎么把线条转换成色块?