CSS Grid 布局系统详解及使用技巧

阅读时长 14 分钟读完

前言

CSS Grid 是一种强大的布局系统,它可以轻松地实现复杂的网格布局。在本文中,我们将深入了解 CSS Grid 的各种特性及使用技巧,并结合实例代码进行讲解。希望本文能够帮助读者更好地掌握 CSS Grid。

CSS Grid 简介

CSS Grid 是一种二维网格布局系统,它能够将页面划分为行和列,并将内容放置在对应的单元格中。与传统的布局方式相比,CSS Grid 具有更高的灵活性和可扩展性。通过 CSS Grid,我们可以轻松地实现复杂的布局,例如多列布局、响应式布局、圣杯布局等。

CSS Grid 基本概念

在学习 CSS Grid 之前,我们需要了解一些基本概念。

网格容器(Grid Container)

网格容器是一个元素,它包含了一个或多个网格项(Grid Item)。网格容器通过设置 display: grid 来声明自己是一个网格容器。

网格项(Grid Item)

网格项是网格布局中的基本单位,它是网格容器中的一个子元素。网格项可以是任意元素,例如 div、p、img 等。通过设置网格项的属性,我们可以控制它在网格容器中的位置和大小。

-- -------------------- ---- -------
---------- -
  -------- -----
-

----- -
  ----------------- -----
  -------- -----
  ------- --- ----- -----
-
展开代码

网格线(Grid Line)

网格线是网格容器中的一条虚拟线,它用于定义网格行或网格列。网格线可以通过设置 grid-template-rowsgrid-template-columns 来定义。网格线的编号从 1 开始,依次递增。

在上面的例子中,我们定义了三行和三列。第一行的高度为 100px,第二行的高度为 200px,第三行的高度为 300px。第一列和第三列的宽度都为 1fr,第二列的宽度为 2fr。

网格单元格(Grid Cell)

网格单元格是网格容器中的一个矩形区域,它由相邻的网格线所定义。网格单元格可以是一个网格项,也可以是多个网格项的合并。通过设置 grid-row-startgrid-row-endgrid-column-startgrid-column-end 属性,我们可以控制网格单元格的位置和大小。

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
-

------ -
  --------------- --
  ------------- --
  ------------------ --
  ---------------- --
-

------ -
  --------------- --
  ------------- --
  ------------------ --
  ---------------- --
-
展开代码

在上面的例子中,我们定义了一个 3 行 3 列的网格布局。通过设置 item1 的属性,我们将它放置在第 1 行到第 2 行,第 1 列到第 2 列的区域中。通过设置 item2 的属性,我们将它放置在第 2 行到第 3 行,第 2 列到第 3 列的区域中。

CSS Grid 属性详解

grid-template-rows 和 grid-template-columns

grid-template-rowsgrid-template-columns 用于定义网格行和网格列的大小和数量。它们接受一个由空格分隔的值列表,每个值表示一个网格行或网格列的大小。可以使用长度单位(如 px、em、rem)或百分比来定义大小。还可以使用 fr 单位来定义相对比例,例如 1fr 2fr 1fr 表示第一列和第三列的宽度为第二列的一半。

在上面的例子中,我们定义了三行和三列。第一行的高度为 100px,第二行的高度为 200px,第三行的高度为 300px。第一列和第三列的宽度都为 1fr,第二列的宽度为 2fr。

grid-row-start、grid-row-end、grid-column-start 和 grid-column-end

grid-row-startgrid-row-endgrid-column-startgrid-column-end 用于控制网格项在网格容器中的位置和大小。它们接受一个整数或一个关键字,关键字包括 spanstartend

  • grid-row-start:网格项的起始行。
  • grid-row-end:网格项的结束行。
  • grid-column-start:网格项的起始列。
  • grid-column-end:网格项的结束列。
-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
-

------ -
  --------------- --
  ------------- --
  ------------------ --
  ---------------- --
-

------ -
  --------------- --
  ------------- --
  ------------------ --
  ---------------- --
-
展开代码

在上面的例子中,我们定义了一个 3 行 3 列的网格布局。通过设置 item1 的属性,我们将它放置在第 1 行到第 2 行,第 1 列到第 2 列的区域中。通过设置 item2 的属性,我们将它放置在第 2 行到第 3 行,第 2 列到第 3 列的区域中。

grid-row 和 grid-column

grid-rowgrid-columngrid-row-startgrid-row-endgrid-column-startgrid-column-end 的缩写形式。它们接受一个由空格分隔的值列表,每个值表示一个网格行或网格列的起始位置和结束位置。可以使用整数或关键字来定义位置,例如 1 / span 2 表示从第 1 行开始,跨越 2 行。

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
-

------ -
  --------- - - ---- --
  ------------ - - ---- --
-

------ -
  --------- - - ---- --
  ------------ - - ---- --
-
展开代码

在上面的例子中,我们使用了 grid-rowgrid-column 的缩写形式,与之前的例子等价。通过设置 item1 的属性,我们将它放置在第 1 行到第 2 行,第 1 列到第 2 列的区域中。通过设置 item2 的属性,我们将它放置在第 2 行到第 3 行,第 2 列到第 3 列的区域中。

grid-template-areas

grid-template-areas 用于定义网格布局中的区域。它接受一个字符串,字符串中的每个单词表示一个网格单元格。可以使用 . 表示空单元格,使用引号包裹的字符串表示一个命名区域。可以使用 grid-area 属性将网格项放置到对应的区域中。

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
  --------------------
    ------- ------ -------
    -------- ---- -----
    -------- ------ --------
-

------- -
  ---------- -------
-

-------- -
  ---------- --------
-

----- -
  ---------- -----
-

------- -
  ---------- -------
-
展开代码

在上面的例子中,我们定义了一个 3 行 3 列的网格布局,使用 grid-template-areas 定义了三个区域。通过设置网格项的 grid-area 属性,我们将它们分别放置在对应的区域中。

grid-auto-rows 和 grid-auto-columns

grid-auto-rowsgrid-auto-columns 用于定义自动创建的网格行和网格列的大小。当一个网格项放置在一个未定义的网格行或网格列上时,网格容器会自动创建一个网格行或网格列,并使用 grid-auto-rowsgrid-auto-columns 定义的大小。

在上面的例子中,我们定义了三行和三列,以及 grid-auto-rowsgrid-auto-columns。当一个网格项放置在一个未定义的网格行或网格列上时,网格容器会自动创建一个高度为 100px、宽度为 100px 的网格行或网格列。

grid-auto-flow

grid-auto-flow 用于定义自动创建的网格行和网格列的放置方式。它有两个可选值:rowcolumn。默认值为 row。当值为 row 时,网格容器会先自动创建网格行,然后按顺序放置网格项。当值为 column 时,网格容器会先自动创建网格列,然后按顺序放置网格项。

在上面的例子中,我们将 grid-auto-flow 设置为 column,网格容器会先自动创建网格列,然后按顺序放置网格项。

justify-items 和 align-items

justify-itemsalign-items 用于定义网格项在网格单元格中的水平对齐方式和垂直对齐方式。它们接受一个关键字,包括 startendcenterstretchbaseline

在上面的例子中,我们将 justify-itemsalign-items 设置为 center,网格项会在网格单元格中居中对齐。

justify-content 和 align-content

justify-contentalign-content 用于定义网格单元格在网格容器中的水平对齐方式和垂直对齐方式。它们接受一个关键字,包括 startendcenterstretchspace-between 等。

在上面的例子中,我们将 justify-contentalign-content 设置为 center,网格单元格会在网格容器中居中对齐。

justify-self 和 align-self

justify-selfalign-self 用于定义单个网格项在网格单元格中的水平对齐方式和垂直对齐方式。它们接受一个关键字,包括 startendcenterstretchbaseline

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
-

------ -
  ------------- -------
  ----------- -------
-
展开代码

在上面的例子中,我们将 item1justify-selfalign-self 设置为 center,它会在网格单元格中居中对齐。

CSS Grid 使用技巧

响应式布局

CSS Grid 可以轻松地实现响应式布局。通过设置不同的网格行和网格列,我们可以在不同的屏幕尺寸下呈现不同的布局。

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ----- ----- ------
  ---------------------- --- --- ----
-

------ ----------- ------ -
  ---------- -
    ------------------- ----- ----- ------
    ---------------------- ----
  -
-
展开代码

在上面的例子中,我们使用了媒体查询,当屏幕宽度小于 768px 时,修改了网格行和网格列的大小和数量,实现了响应式布局。

圣杯布局

圣杯布局是一种常见的多列布局,它包含一个固定宽度的中间列和两个自适应宽度的侧边栏。通过 CSS Grid,我们可以轻松地实现圣杯布局。

-- -------------------- ---- -------
---------- -
  -------- -----
  ------------------- ------
  ---------------------- --- ----- ----
-

----- -
  ----------------- -----
-

------ -
  ----------------- -----
-

----- -
  ----------------- -----
  ------------------ --
  ---------------- --
-
展开代码

在上面的例子中,我们定义了一个 1 行 3 列的网格布局,通过设置 maingrid-column-startgrid-column-end 属性,将它放置在中间列。通过设置 leftright 的背景色,可以看出它们分别位于左侧和右侧。

自适应网格项

有时候,我们希望网格项的大小可以自适应内容。通过设置 grid-auto-rowsgrid-auto-columns,我们可以实现自适应网格项。

在上面的例子中,我们将 grid-auto-rows

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/678554fa5638eae96002f68d

纠错
反馈

纠错反馈