❕Grid
a two-dimensional grid-based layout system
Last updated
a two-dimensional grid-based layout system
Last updated
CSS grid layout,又称 CSS grid 或 grid,是一种基于二维网格的布局系统,它擅长将页面划分成行和列。
和 table 一样,grid 也能让元素对齐到 row 和 column 中。但 grid 能更容易地实现更多其它布局,比如它的子元素可以 position(定位)自己,即子容器实际上是 overlap(重叠)和 layer(分层)的,类似于 CSS 的 positioned elements(定位元素)。
和 flexbox 类似,grid items 的 order 也能通过 CSS 来设置,好处是可以用 media query 来灵活摆放。
grid container:设置了 display: grid
的元素
grid item:是 grid container 的(直接)子元素
grid line:是构成 gird 结构的 dividing lines,位于行或列的任意一侧
可以是 vertical 的 column grid lines
也可以是 horizontal 的 row grid lines
grid track:两条相邻 grid lines 之间的空间。可以视为 grid 的 row 或 column
grid area:被四条 grid lines 围起来的总空间。可能是由多个 grid cells 组成的
grid cell:被两条相邻 row grid lines 和两条相邻 column grid lines 围起来的空间。它是 grid 的 unit
display
定义了一个 grid container,为其内容建立了一个新的 grid formatting context(grid 格式化上下文)。
grid-template-columns
grid-template-rows
以上两个属性用“以空格分隔的 values 列表”的形式定义了 grid 的 columns 和 rows,其中 value 是 track size 的值,它们之间的空间就是 grid line。
value 的取值可以是:<track-size>
, <line-name>
。
(1)<track-size>
(2)<line-name>
grid lines 会被自动分配对应的数字,正序是从 1 到 n,倒序是从 -1 到 -n。如下:
也可以给 grid lines 命名。比如:
如果设置的 <line-name>
是重复的,可以用 repeat()
简化下。比如:
上面代码的多个 grid lines 有相同的名字,如果想引用某个 line,可以用 line name 和 count。比如:
grid-template-areas
定义了一个 grid template,通过引用“子容器”的 grid-area
属性指定的 grid area 的 name。
grid-template-areas
本身就提供了 grid structure 的可视化。看个例子:
关于 grid-template-areas
属性的相关说明:
每个 row 必须有相同数量的 cells,否则该声明会失效
连续的多个 .
只代表一个 empty cell,除非它们之间有“空格”分隔符
它不 name(命名)grid lines,只 name(命名)areas,虽然此时 area 两端的 lines 会被自动命名。比如 grid area 是 foo
,那么该 area 起始的 row line 和 column line 都叫 foo-start
,最后的 lines 都叫 foo-end
。这就意味着,有的 line 可能会有多个名字,比如上例中最左侧的 line 有三个名字 header-start
, main-start
, footer-start
当它设置的 column 的数量和 grid-template-columns
的个数不一致时
优先取 grid-template-columns
的值
若 grid-template-areas
少了,就用其它子容器补齐
若 grid-template-areas
多了,则多出来的子容器 width:auto
(整体会保证列对齐)
可以这样理解:
grid-template-columns/rows
负责 layout(布局)
grid-template-areas
负责 span(平铺/贯穿/横跨)
grid-template
是以上三个属性的缩写,格式是:
看几个例子,代码如下:
以上代码,会依次显示下面的布局:
相关说明:
格式 <grid-template-rows> / <grid-template-columns>
会把 grid-template-areas
设置成 none
当设置 grid-template: none
时,表示这三个属性的值都是它们的 initial values。也就是说,grid-template
不会隐式重置 grid properties,而通常写 none
都是想 reset 各个属性的值。所以,与缩写相比,更推荐用单个属性
此外,个人的使用感受是:不推荐用缩写。一是功能上杂糅了对 rows 和 columns 的“布局”和“贴片”,二是视觉上也怪眼花缭乱的...
有时,内容的总 size 会比 grid container 的小,此时就可以用以下属性设置 grid 在 row 或 column 上的对齐。
justify-content
:在 row axis 上分配剩余空间
align-content
:在 column axis 上分配剩余空间
place-content
缩写:<align-content> / <justify-content>
取值可以是:
start
, end
, center
stretch
space-around
, space-between
, space-evenly
用来设置 grid items 在 grid cell 里沿 row axis 或 column axis 的对齐。
justify-items
align-items
place-items
缩写:<align-items> / <justify-items>
取值可以是:
公共取值:start
, end
, center
, stretch
baseline
:align-items
属性时
指定 grid line 的 size,可以视作是 columns 之间或 rows 之间的 gutter(间距)with,不含外边缘。
row-gap
column-gap
gap
缩写:<row-gap> <column-gap>
grid-auto-colums
指定隐式创建的 track size。
隐式创建,也称自动生成。当 grid items 多于 grid cells 时,或当一个 grid item 放在了显式 grid 之外时,就会创建隐式 track。这样做的好处是,让 grid 更灵活地摆放它的 items,因为我们可以不必(显式地)指定每个 track,也不必手动放置每个 item。显式指定 track 的属性有 grid-template-rows
和 grid-template-columns
。
通过两个例子,感受下增加了 grid-auto-colums
属性之后的 UI。如下:
说明:
grid-column: 5 / 6
表示从 column line 5 到 column line 6
grid-row: 2 / 3
表示从 row line 2 到 row line 3
当有创建隐式 track 时,就会启动 auto-placement algorithm(自动放置算法)来布局 items。grid-auto-flow
属性就是用来控制该算法的工作方式的,它可以指定 items 如何流入 grid。
取值可以是:
row
(默认):依次填充每 row,并根据需要添加新 row
column
:依次填充每 column,并根据需要添加新 column
dense
:如果后面有更小的 items 来了,则尝试更早地填充 grid holes
单词“dense”:密集的,稠密的
dense 算法,会回溯找能填的 holes,所以 items 可能会乱序
单词“sparse”:稀少的,稀疏的
sparse 算法,只向前移动 items,但从来不回溯,所以 items 是有序的
看个例子:
当分别设置 grid-auto-flow
的值是 row
和 column
时,items 的布局依次如下图:
grid
缩写grid
是个缩写属性,用来设置所有 explicit(显式)和 implicit(隐式)的 grid 属性。
grid-template-rows
grid-template-columns
grid-template-areas
grid-auto-rows
grid-auto-columns
grid-auto-flow
缩写的属性值的形式看起来挺费劲的,这里就不展开介绍了,等把单个属性用熟练了再补充。
通过引用特定的 grid lines 来确定 grid item 的位置。
当 items 之间相互重叠时,可以使用 z-index
控制它们的堆叠顺序。如果没有指定 grid-xxx-end
,则 item 默认会跨 1 个 track。
grid-column-start
grid-column-end
grid-row-start
grid-row-end
grid-column
缩写:<grid-column-start> / <grid-column-end>
grid-row
缩写:<grid-row-start> / <grid-row-end>
grid-area
属性可以给 item 一个名字,以便被 grid-template-areas
属性引用。
grid-area
属性也可以用作更短的缩写。
设置本 item 在单个 grid cell 里沿 row axis 或 column axis 的对齐方式
justify-self
align-self
place-self
缩写:<align-self> / <justify-self>
作用同父容器的在 cell 内沿 axis 对齐,只是这三个属性只控制本 item。