盘点 CSS Grid
display: grid; 或者 inline-grid; 可以实现 grid 布局。
二者区别是:
- inline-grid 容器外部盒子保持内联特性,因此可以和图片文字在同一行显示;
- grid 容器保持块状特性,宽度默认为 100%,不和内联元素在一行显示。
| 作用在 grid 容器上 | 作用在 grid 子项上 |
|---|---|
| grid-template-columns | grid-column-start |
| grid-template-rows | grid-column-end |
| grid-template-areas | grid-row-start |
| grid-template | grid-row-end |
| grid-auto-columns | grid-column |
| grid-auto-rows | grid-row |
| grid-auto-flow | grid-area |
| grid | justify-self |
| justify-items | align-self |
| align-items | place-self |
| place-items | |
| justify-content | |
| align-content | |
| place-content | |
| column-gap | |
| row-gap | |
| gap |
grid-template-columns/rows
grid-template-columns 和 grid-template-rows 是用于定义 CSS Grid 布局的两个属性,默认值是 auto。
它们分别用于指定网格容器的列和行的大小和结构。 grid-template-columns 设置列的宽度,单元格的宽度 grid-template-rows 设置行的高度,单元格的高度
单位
px:像素单位,用于指定固定宽度的列或行。%:百分比单位,用于指定相对于网格容器宽度的列或行的大小。fr:fraction(分数)单位,用于指定网格容器中可用空间的比例分配。em:相对于当前元素的字体大小的单位,用于指定列或行的大小。rem:相对于根元素(html 元素)的字体大小的单位,用于指定列或行的大小。vw:视口宽度的百分比单位,用于指定列或行的大小。vh:视口高度的百分比单位,用于指定列或行的大小。auto:自动计算列或行的大小,根据内容自动调整。min-content:设置大小为内容的最小尺寸。max-content:设置大小为内容的最大尺寸。
函数
repeat():用于重复指定数量的列或行,是一个只能在这两个属性用的函数。minmax():用于指定列或行的最小和最大尺寸。fit-content():用于指定列或行的最大尺寸,并允许内容溢出。auto-fill:自动填充网格线,网格容器会根据列或行的尺寸重复创建尽可能多的轨道,并在容器内填满它们。auto-fit:与auto-fill类似,但任何未被内容占用的轨道将会被收缩并且不会占据空间。
网格线可以像下面这样命名:
CSSgrid-template-columns: [first] 100px [line2] 100px [line3] auto [end];
grid-template-areas
grid-template-areas 是一个用于定义网格布局的 CSS 属性,它允许你通过指定网格区域来创建复杂的布局。
grid-template-areas 属性接受一个字符串,其中每个字符代表一个网格单元。字符串中的每个单词代表一个区域,区域之间用空格分隔。每个区域可以包含一个或多个网格单元。
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
grid-template-rows: 1fr 1fr 1fr;
grid-template-areas:
'header header header'
'sidebar content content'
'. footer .';
}区域名可以包含任意字符,包括空格和特殊字符。区域名之间用空格分隔,每个区域名代表一个网格区域。例如,header、sidebar 和 content 是三个不同的区域名。
空区域可以用点(.)表示,表示该区域不包含任何网格单元。例如,在上面的例子中,footer 区域两侧有一个空区域,表示该区域不包含任何网格单元。
然后,grid 子项就可以使用 grid-area 属性来指定它们应该放置在哪个区域中。
.header {
grid-area: header;
}
.sidebar {
grid-area: sidebar;
}
.content {
grid-area: content;
}
.footer {
grid-area: footer;
}grid-template
grid-template 是一个简写属性,用于同时设置 grid-template-columns、grid-template-rows 和 grid-template-areas 属性。
可以给该属性传入行和列的值:
.container {
display: grid;
grid-template: 1fr 1fr 1fr / repeat(3, 1fr);
}也可以传入区域名和行高列宽:
.container {
display: grid;
grid-template: 'header header header' 50px 'sidebar content content' 1fr 'footer footer footer' 50px / 1fr 1fr 1fr;
}警告
grid-template 缩写在涉及到 areas 的时候 repeat() 函数不能使用。
grid-auto-columns/rows
grid-auto-columns 和 grid-auto-rows 属性的作用是指定任何自动生成的网格(也称为隐式网格)的尺寸大小。
当你在网格容器中定义了 grid-template-columns 和 grid-template-rows 属性,但网格项的数量超过了定义的网格轨道数量时,浏览器会自动生成额外的网格轨道。这些额外的网格轨道被称为隐式网格。
.container {
display: grid;
grid-template-columns: 100px 100px;
grid-auto-rows: 50px;
}grid-auto-flow
grid-auto-flow 属性用于控制隐式网格项的放置顺序,可选属性值有 row、column 和 dense。
row:默认值,按行顺序放置隐式网格项。column:按列顺序放置隐式网格项。dense:按最紧密的方式填充隐式网格项,即使这会导致网格项的顺序与源代码中的顺序不一致。
grid
熟练使用 grid 缩写属性,是掌握网格布局的重要标志之一。
grid 属性的缩写规则比较复杂。它允许你同时设置以下属性:
grid-template-rows和grid-template-columnsgrid-template-areasgrid-auto-rows和grid-auto-columnsgrid-auto-flow
整体写法可以分为四大类:
grid:none:表示不使用网格布局。grid:[grid-template]:表示只使用grid-template属性。grid:[grid-template-rows] [grid-auto-flow && dense?] / [grid-auto-columns]:表示规定网格行高与列宽,同时规定隐式网格项的放置顺序为 row。grid:[grid-template-rows] / [grid-auto-flow && dense?][grid-auto-columns]:表示规定网格行高与列宽,同时规定隐式网格项的放置顺序为 column。
gap
gap 属性用于设置网格项之间的间距。它是一个简写属性,可以同时设置行间距和列间距。
gap: 10px;:设置行间距和列间距为 10 像素。row-gap: 10px;:设置行间距为 10 像素。column-gap: 10px;:设置列间距为 10 像素。gap: 10px 20px;:设置行间距为 10 像素,列间距为 20 像素。
排列方式
justify-items
justify-items 属性用于设置网格项在网格容器中的水平对齐方式。
start:将网格项的起始边缘对齐到网格容器的起始边缘。end:将网格项的结束边缘对齐到网格容器的结束边缘。center:将网格项在网格容器中居中对齐。stretch:将网格项拉伸以填充整个网格单元格。
align-items
align-items 属性用于设置网格项在网格容器中的垂直对齐方式。
start:将网格项的起始边缘对齐到网格容器的起始边缘。end:将网格项的结束边缘对齐到网格容器的结束边缘。center:将网格项在网格容器中居中对齐。stretch:将网格项拉伸以填充整个网格单元格。baseline:将网格项的基线对齐到网格容器的基线。
警告
- normal 是默认值,会根据使用场景的不同表现为 stretch 或者 start。
- 如果 grid 子项是具有内在尺寸或具有内在比例的元素,则此时 normal 的表现类似于 start 属性值的表现。
place-items
place-items 是一个简写属性,用于同时设置 align-items 和 justify-items 属性。
place-items: start;:将网格项的起始边缘对齐到网格容器的起始边缘。place-items: end;:将网格项的结束边缘对齐到网格容器的结束边缘。place-items: center;:将网格项在网格容器中居中对齐。place-items: stretch;:将网格项拉伸以填充整个网格单元格。place-items: baseline;:将网格项的基线对齐到网格容器的基线。place-items: start end;:将网格项的起始边缘对齐到网格容器的起始边缘,将网格项的结束边缘对齐到网格容器的结束边缘。
当传入两个值,第一个值表示 align-items,第二个值表示 justify-items。
justify-content
justify-content 属性用于设置网格容器内的网格项在水平方向上的对齐方式。
start:将网格项对齐到容器的起始边缘。end:将网格项对齐到容器的结束边缘。center:将网格项在容器中居中对齐。space-between:将网格项在容器中均匀分布,第一个网格项对齐到容器的起始边缘,最后一个网格项对齐到容器的结束边缘,剩余的网格项均匀分布。space-around:将网格项在容器中均匀分布,每个网格项两侧的间距相等,网格项之间的间距是网格项两侧间距的一半。space-evenly:将网格项在容器中均匀分布,每个网格项之间的间距相等,包括网格项与容器边缘之间的间距。
align-content
align-content 属性用于设置网格容器内的网格项在垂直方向上的对齐方式。
start:将网格项对齐到容器的起始边缘。end:将网格项对齐到容器的结束边缘。center:将网格项在容器中居中对齐。space-between:将网格项在容器中均匀分布,第一个网格项对齐到容器的起始边缘,最后一个网格项对齐到容器的结束边缘,剩余的网格项均匀分布。space-around:将网格项在容器中均匀分布,每个网格项两侧的间距相等,网格项之间的间距是网格项两侧间距的一半。space-evenly:将网格项在容器中均匀分布,每个网格项之间的间距相等,包括网格项与容器边缘之间的间距。
place-content
place-content 属性用于同时设置 align-content 和 justify-content 属性。
place-content: start;:将网格项对齐到容器的起始边缘。place-content: end;:将网格项对齐到容器的结束边缘。place-content: center;:将网格项在容器中居中对齐。place-content: space-between;:将网格项在容器中均匀分布,第一个网格项对齐到容器的起始边缘,最后一个网格项对齐到容器的结束边缘,剩余的网格项均匀分布。place-content: space-around;:将网格项在容器中均匀分布,每个网格项两侧的间距相等,网格项之间的间距是网格项两侧间距的一半。place-content: space-evenly;:将网格项在容器中均匀分布,每个网格项之间的间距相等,包括网格项与容器边缘之间的间距。place-content: start end;:将网格项对齐到容器的起始边缘,将网格项对齐到容器的结束边缘。
当传入两个值,第一个值表示 align-content,第二个值表示 justify-content。
grid 项目区间范围设置属性
.item-1 {
/* 也可以传入负数表示倒着数 */
grid-column-start: 1;
grid-column-end: 3;
grid-row-start: 1;
grid-row-end: 3;
}
.item-2 {
grid-row: 1 / 3;
grid-column: 1 / 3;
}
.item-3 {
grid-area: 1 / 1 / 3 / 3;
}span 关键字
grid-column-start: span 2;表示网格项的起始列是当前列,结束列是当前列的下一列,即跨越两列。- 不建议 grid-column-start 和 grid-column-end 同时使用span 语法,因为完全没有必要,且不会产生任何效果。
grid 项目对齐方式
.item {
justify-self: auto | normal | stretch | start | end | center | baseline;
align-self: auto | normal | stretch | start | end | center | baseline;
}