29-(grid)网格布局

2018-09-27  本文已影响0人  晚溪呀

构成网格结构的分界线。它们既可以是垂直的(“列网格线(column grid lines)”),也可以是水平的(“行网格线(row grid lines)”),并位于行或列的任一侧。例如,这里的黄线就是一条列网格线。

image.png

两条相邻网格线之间的空间。你可以把它们想象成网格的列或行。下图是第二条和第三条 行网格线 之间的 网格轨道(Grid Track)。

image.png

两个相邻的行和两个相邻的列网格线之间的空间。这是 Grid(网格) 系统的一个“单元”。下图是第1至第2条 行网格线 和第2至第3条 列网格线 交汇构成的 网格单元格(Grid Cell)。

image.png

4条网格线包围的总空间。一个 网格区域(Grid Area) 可以由任意数量的 网格单元格(Grid Cell) 组成。下图是 行网格线1和3,以及列网格线1和3 之间的网格区域。

image.png
  1. Columns(列) 和 rows(行)
    1.1

    指定列数:
    写入了 3 个值,这样我们就会得到 3 列。
    grid-template-columns:100px 100px 100px;
    
    指定行数:
    写入了 3 个值,这样我们就会得到 3行 。
    grid-template-rows:50px 50px;
    
    这些值决定了我们希望我们的列有多宽( 100px ),
    以及我们希望行数是多高( 50px )。
    

    1.2

    我们在这里要做的是,
    我们希望 item1 占据从第一条网格线开始,到第四条网格线结束。
    换句话说,它将独立占据整行。
    grid-column-start:1;
    grid-column-end:4;
    

    如果你不明白我们设置的只有 3 列,为什么有4条网格线呢?看看下面这个图像,


    image.png

1.3
fr 单元允许你用等分网格容器剩余可用空间来设置 网格轨道(Grid Track) 的大小 。例如,下面的代码会将每个网格项设置为网格容器宽度的三分之一:

    .container {
    grid-template-columns: 1fr 1fr 1fr;
    }

剩余可用空间是除去所有非灵活网格项之后计算得到的。在这个例子中,可用空间总量减去 50px 后,再给 fr 单元的值3等分:

    .container {
    grid-template-columns: 1fr 50px 1fr 1fr;
    }
  1. grid-template-areas
    通过引用 grid-area 属性指定的 网格区域(Grid Area) 名称来定义网格模板。重复网格区域的名称导致内容跨越这些单元格。一个点号(.)代表一个空的网格单元。这个语法本身可视作网格的可视化结构。

    2.1

    .item-a {
    grid-area:header;
    }
    .item-b {
    grid-area:main;
    }
    .item-c {
    grid-area:sidebar;
    }
    .item-d {
    grid-area:footer;
    }
    .container {
    grid-template-columns:50px 50px 50px 50px;
    grid-template-rows:auto;
    grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
    }
image.png
  1. grid-template
    用于定义 grid-template-rowsgrid-template-columnsgrid-template-areas 缩写 (shorthand) 属性。

值:

    .container {
    grid-template: none | subgrid | <grid-template-rows> / <grid-        template-columns>;

}

等价于:

    .container {
    grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px                       
    [row2-end];
    grid-template-columns: auto 50px auto;
    grid-template-areas: 
    "header header header" 
    "footer footer footer";

}

由于 grid-template 不会重置 隐式 网格属性(grid-auto-columnsgrid-auto-rows, 和 grid-auto-flow),
这可能是你想在大多数情况下做的,建议使用 grid 属性而不是 grid-template

  1. grid-column-gap / grid-row-gap
image.png
  1. justify-items
    沿着 行轴线(row axis) 对齐 网格项(grid items) 内的内容(相反的属性是 align-items 沿着列轴线对齐)。该值适用于容器内的所有网格项。

值:

image.png image.png image.png
  1. align-items
    沿着 列轴线(column axis) 对齐 网格项(grid items) 内的内容(相反的属性是 justify-items 沿着行轴线对齐)。该值适用于容器内的所有网格项。

值:

  1. justify-content

值:

image.png
  1. align-content
    有时,你的网格合计大小可能小于其 网格容器(grid container) 大小。 如果你的所有 网格项(grid items) 都使用像 px 这样的非灵活单位设置大小,在这种情况下,您可以设置网格容器内的网格的对齐方式。 此属性沿着 列轴线(column axis) 对齐网格(相反的属性是 justify-content ,沿着行轴线对齐网格)。

值:

  1. grid-auto-columns / grid-auto-rows

指定任何自动生成的网格轨道(grid tracks)(又名隐式网格轨道)的大小。在你明确定位的行或列(通过 grid-template-rows / grid-template-columns),超出定义的网格范围时,隐式网格轨道被创建了。

值:
– <track-size>:可以是长度值,百分比,或者等份网格容器中可用空间(使用 fr 单位)

    .container {
    grid-auto-columns: <track-size> ...;
    grid-auto-rows: <track-size> ...;
    }
image.png

生成了一个2×2的网格。

但现在想象一下,你使用 grid-columngrid-row 来定位你的网格项(grid items),像这样:

    .item-a {
    grid-column: 1 / 2;
    grid-row: 2 / 3;
    }
    .item-b {
    grid-column: 5 / 6;
    grid-row: 2 / 3;
    }
image.png

我们告诉 .item-b 从第 5 条列网格线开始到第 6 条列网格线结束,但我们从来没有定义过 第5 或 第6 列网格线。
因为我们引用的网格线不存在,所以创建宽度为 0 的隐式网格轨道以填补空缺。我们可以使用 grid-auto-columnsgrid-auto-rows 来指定这些隐式轨道的大小:

    .container {
    grid-auto-columns: 60px;
    }
image.png
  1. grid-auto-flow
    如果你有一些没有明确放置在网格上的网格项(grid items),自动放置算法 会自动放置这些网格项。该属性控制自动布局算法如何工作。

值:

示例:

考虑以下 HTML :

    <section class="container">
    <div class="item-a">item-a</div>
    <div class="item-b">item-b</div>
    <div class="item-c">item-c</div>
    <div class="item-d">item-d</div>
    <div class="item-e">item-e</div>
    </section>

你定义一个有 5 列和 2 行的网格,并将 grid-auto-flow 设置为 row(也就是默认值):

    .container {
    display: grid;
    grid-template-columns: 60px 60px 60px 60px 60px;
    grid-template-rows: 30px 30px;
    grid-auto-flow: row;
    }

将网格项放在网格上时,只能为其中的两个指定位置:

    .item-a {
    grid-column: 1;
    grid-row: 1 / 3;
    }
    .item-e {
    grid-column: 5;
    grid-row: 1 / 3;
    }

因为我们把 grid-auto-flow 设成了 row ,所以我们的网格看起来会是这样。注意 我们没有进行定位的网格项(item-bitem-citem-d)会这样排列在可用的行中:

image.png

相反地,如果我们把 grid-auto-flow 设成了 columnitem-bitem-citem-d会沿着列向下排列:

    .container {
    display: grid;
    grid-template-columns: 60px 60px 60px 60px 60px;
    grid-template-rows: 30px 30px;
    grid-auto-flow: column;
    }
image.png
  1. grid (缩写)
    在一个声明中设置所有以下属性的简写: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 。它还将grid-column-gapgrid-column-gap设置为初始值,即使它们不可以通过grid属性显式地设置。

值:

例子:

以下两个代码块是等效的:

    .container {
    grid: 200px auto / 1fr auto 1fr;
    }

等价于

    .container {
    grid-template-rows: 200px auto;
    grid-template-columns: 1fr auto 1fr;
    grid-template-areas: none;
    }

以下两个代码块也是等效的:

    .container {
    grid: column 1fr / auto;
    }


    .container {
    grid-auto-flow: column;
    grid-auto-rows: 1fr;
    grid-auto-columns: auto;
    }

它也接受一个更复杂但相当方便的语法来一次设置所有内容。您可以 grid-template-areasgrid-template-rowsgrid-template-columns,并所有其他的子属性都被设置为它们的初始值。这么做可以在它们网格区域内相应地指定网格线名字和网格轨道的大小。用最简单的例子来描述:

    .container {
    grid: [row1-start] "header header header" 1fr [row1-end]
    [row2-start] "footer footer footer" 25px [row2-end]
    / auto 50px auto;
    }

等价于

    .container {
    grid-template-areas: 
    "header header header"
    "footer footer footer";
    grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px         
    [row2-end];
    grid-template-columns: auto 50px auto;    
    }
  1. 子元素 网格项(Grid Items) 属性
    grid-column-start / grid-column-end / grid-row-start / grid-row-end

通过指定 网格线(grid lines) 来确定网格内 网格项(grid item) 的位置。 grid-column-start / grid-row-start 是网格项目开始的网格线,grid-column-end / grid-row-end 是网格项结束的网格线。

值:

    .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
    }

示例:

    .item-a {
    grid-column-end: five;
    grid-row-start: row1-start
    grid-row-end: 3
    }
image.png
    .item-b {
    grid-column-start: 1;
    grid-column-end: span col4-start;
    grid-row-start: 2
    grid-row-end: span 2
    }

网格项位置,grid-column-start,grid-column-end,grid-row-start,grid-row-end 的示例

如果没有声明指定 grid-column-end / grid-row-end,默认情况下,该网格项将占据1个轨道。

项目可以相互重叠。您可以使用 z-index 来控制它们的重叠顺序。

  1. grid-column / grid-row

分别为 grid-column-start + grid-column-endgrid-row-start + grid-row-end 的缩写形式。

值:

示例:

    .item-c {
    grid-column: 3 / span 2;
    grid-row: third-line / 4;
    }
image.png
  1. grid-area
    为网格项提供一个名称,以便可以 被使用网格容器 grid-template-areas 属性创建的模板进行引用。 另外,这个属性可以用作grid-row-start + grid-column-start + grid-row-end + grid-column-end 的缩写。

值:

示例:

作为为网格项分配名称的一种方法:

    .item-d {
    grid-area: header
    }

作为grid-row-start + grid-column-start + grid-row-end + grid-column-end 属性的缩写形式

    .item-d {
    grid-area: 1 / col4-start / last-line / 6
    }
image.png
  1. justify-self

沿着 行轴线(row axis) 对齐 网格项 内的内容( 相反的属性是 align-self ,沿着列轴线(column axis)对齐)。此值适用于单个网格项内的内容

值:

start:将内容对齐到网格区域的左侧
end:将内容对齐到网格区域的右侧
center:将内容对齐到网格区域的中间(水平居中)
stretch:填充整个网格区域的宽度(这是默认值)
示例:

    .item-a {
    justify-self: start;
    }
image.png
    .item-a {
    justify-self: end;
    }
image.png
    .item-a {
    justify-self: center;
    }
image.png
      .item-a {
    justify-self: stretch;
    }
image.png

17 align-self

沿着 列轴线(column axis) 对齐 网格项 内的内容( 相反的属性是 justify-self ,沿着 行轴线(row axis) 对齐)。此值适用于单个网格项内的内容。

值:

start:将内容对齐到网格区域的顶部
end:将内容对齐到网格区域的底部
center:将内容对齐到网格区域的中间(垂直居中)
stretch:填充整个网格区域的高度(这是默认值)

    .item{
    align-self: start | end | center | stretch;
    }

示例:

    .item-a {
    align-self: start;
    }
image.png
    .item-a {
    align-self: end;
    }
image.png
    .item-a {
    align-self: center;
    }
image.png
    .item-a {
    align-self: stretch;
    }
image.png
上一篇下一篇

猜你喜欢

热点阅读