首页
Javascript
Html

Css

Node.js
Electron
移动开发
小程序
工具类
服务端
浏览器相关
前端收藏
其他
关于
公司注册

CSS Grid网格布局指南(学习)

2019年02月28日 发布 阅读(3440) 作者:Jerman

CSS Grid学习资源

CSS Grid 花园: http://cssgridgarden.com/
Mozilla: https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Grid_Layout
Grid by example: https://gridbyexample.com/
http://grid.malven.co/


图片都是SVG,建议使用chrome浏览器浏览!

下文翻译转自: https://www.html.cn/archives/8510 (html.cn上图片展示不出来,这里添加了图片链接)

英文原著:http://chris.house/blog/a-complete-guide-css-grid-layout/
CSS-tricks付费与作者保持最新更新:https://css-tricks.com/snippets/css/complete-guide-grid/


CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行。通过将 CSS 规则应用于 父元素 (成为 Grid Container 网格容器)和其 子元素(成为 Grid Items 网格项),你就可以轻松使用 Grid(网格) 布局。

简介

CSS Grid(网格) 布局(又称为 “Grid(网格)” ),是一个二维的基于网格的布局系统,它的目标是完全改变我们基于网格的用户界面的布局方式。CSS 一直用来布局我们的网页,但一直以来都存在这样或那样的问题。一开始我们用表格(table),然后是浮动(float),再是定位(postion)和内嵌块(inline-block),但是所有这些方法本质上都是只是 hack 而已,并且遗漏了很多重要的功能(例如垂直居中)。Flexbox 的出现很大程度上改善了我们的布局方式,但它的目的是为了解决更简单的一维布局,而不是复杂的二维布局(实际上 Flexbox 和 Grid 能协同工作,而且配合得非常好)。Grid(网格) 布局是第一个专门为解决布局问题而创建的 CSS 模块,只要我们一直在制作网站,我们就一直要讨论这些问题。

有两个主要因素激发了我创建本指南的灵感。第一个是 Rachel Andrew 出色的书籍 为 CSS Grid 布局做好准备。这本书对 Grid 布局做了全面,清晰的介绍 ,也是本指南的基础。我强烈建议你购买并阅读。另一个灵感来自 Chris Coyier 的 Flexbox 布局完整指南,这也是我学习 flexbox 首选的资源。这篇文章是帮助了很多人,这点从 Google “flexbox” 排名第一就可以看出来。你会发现那篇文章和我的文章有很多相似之处,为什么不跟随最好的文章呢?

本指南的目的是介绍存在于最新版本的规范中 Grid(网格) 概念。所以我不会覆盖过时的 IE 语法,而且随着规范的逐渐成熟,我会尽我最大的努力去更新这个指南。

基础知识和浏览器支持

首先,你必须使用 display: grid 将容器元素定义为一个 grid(网格) 布局,使用 grid-template-columnsgrid-template-rows 设置 列 和 行 的尺寸大小,然后通过 grid-columngrid-row 将其子元素放入这个 grid(网格) 中。与 flexbox 类似,网格项(grid items)的源(HTML结构)顺序无关紧要。你的 CSS 可以以任何顺序放置它们,这使得使用 媒体查询(media queries)重新排列网格变得非常容易。定义整个页面的布局,然后完全重新排列布局以适应不同的屏幕宽度,这些都只需要几行 CSS ,想象一下就让人兴奋。Grid(网格) 布局是有史以来最强大的 CSS 模块之一。

截至2017年3月,许多浏览器都提供了对 CSS Grid 的原生支持,而且无需加浏览器前缀:Chrome(包括 Android ),Firefox,Edge,Safari(包括iOS)和 Opera 。 另一方面,Internet Explorer 10和11支持它,但是是一个过时的语法实现。 现在是时候使用 Grid 布局网页了!

这个浏览器支持 CSS Grid 的数据,来自 Caniuse ,你可以查看更多的细节。 数字表示支持以上功能的浏览器版本号。

桌面(Desktop) 浏览器

ChromeOperaFirefoxIEEdgeSafari
57445211*(旧语法)1610.1

手机(Mobile) / 平板(Tablet)浏览器

iOS SafariOpera MobileOpera MiniAndroidAndroid ChromeAndroid Firefox
10.346No677063

除了微软之外,浏览器厂商似乎还没有对 Grid(网格) 搞自己的一套实现(比如加前缀),直到规范完全成熟。这是一件好事,因为这意味着我们不必担心学习多个语法。

在生产中使用 Grid 只是时间问题。 但现在是学习的时候了。

重要术语

在深入了解 Grid 的概念之前,理解术语是很重要的。由于这里涉及的术语在概念上都很相似,如果不先记住 Grid 规范定义的含义,很容易混淆它们。但是别担心,术语并不多。

网格容器(Grid Container)

应用 display: grid 的元素。这是所有 网格项(grid item)的直接父级元素。在这个例子中,container 就是 网格容器(Grid Container)

  1. <div class="container">
  2. <div class="item item-1"></div>
  3. <div class="item item-2"></div>
  4. <div class="item item-3"></div>
  5. </div>

网格项(Grid Item)

网格容器(Grid Container)的子元素(例如直接子元素)。这里 item 元素就是网格项(Grid Item),但是 sub-item 不是。

  1. <div class="container">
  2. <div class="item"></div>
  3. <div class="item">
  4. <p class="sub-item"></p>
  5. </div>
  6. <div class="item"></div>
  7. </div>

网格线(Grid Line)

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

网格线(Grid Line)

网格轨道(Grid Track)

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

网格轨道(Grid Track)

网格单元格(Grid Cell)

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

网格单元格(Grid Cell)

网格区域(Grid Area)

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

网格区域(Grid Area)

Grid(网格) 属性目录

网格容器(Grid Container) 属性

网格项(Grid Items) 属性

父元素 网格容器(Grid Container) 属性

display

将元素定义为网格容器,并为其内容建立新的 网格格式上下文

值:

  • grid :生成一个块级网格
  • inline-grid :生成一个内联网格
  1. .container {
  2. display: grid | inline-grid;
  3. }

注意:通过嵌套元素(也称为子网格,即 subgrid )向下传递网格参数的能力已移至 CSS Grid 规范的 Level 2 版本。这里有 一个快速解释

回到属性列表

grid-template-columns / grid-template-rows

使用空格分隔的值列表,用来定义网格的列和行。这些值表示 网格轨道(Grid Track) 大小,它们之间的空格表示网格线。

值:
<track-size>: 可以是长度值,百分比,或者等份网格容器中可用空间(使用 fr 单位)
<line-name>:你可以选择的任意名称

  1. .container {
  2. grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
  3. grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
  4. }

示例:

当你在 网格轨道(Grid Track) 值之间留出空格时,网格线会自动分配正数和负数名称:

  1. .container {
  2. grid-template-columns: 40px 50px auto 50px 40px;
  3. grid-template-rows: 25% 100px auto;
  4. }

网格线名称

但是你可以明确的指定网格线(Grid Line)名称,例如值。请注意网格线名称的括号语法:

  1. .container {
  2. grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  3. grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
  4. }

网格线多个名称

请注意,一条网格线(Grid Line)可以有多个名称。例如,这里的第二条 行网格线(row grid lines) 将有两个名字:row1-end 和 row2-start :

  1. .container {
  2. grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
  3. }

如果你的定义包含多个重复值,则可以使用 repeat() 表示法来简化定义:

  1. .container {
  2. grid-template-columns: repeat(3, 20px [col-start]);
  3. }

上面的代码等价于:

  1. .container {
  2. grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
  3. }

如果多行共享相同的名称,则可以通过其网格线名称和计数来引用它们。

  1. .item {
  2. grid-column-start: col-start 2;
  3. }

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

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

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

  1. .container {
  2. grid-template-columns: 1fr 50px 1fr 1fr;
  3. }

回到属性列表

grid-template-areas

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

值:

  • <grid-area-name>:由网格项的 grid-area 指定的网格区域名称
  • .(点号) :代表一个空的网格单元
  • none:不定义网格区域
  1. .container {
  2. grid-template-areas:
  3. "<grid-area-name> | . | none | ..."
  4. "...";
  5. }

示例:

  1. .item-a {
  2. grid-area: header;
  3. }
  4. .item-b {
  5. grid-area: main;
  6. }
  7. .item-c {
  8. grid-area: sidebar;
  9. }
  10. .item-d {
  11. grid-area: footer;
  12. }
  13. .container {
  14. grid-template-columns: 50px 50px 50px 50px;
  15. grid-template-rows: auto;
  16. grid-template-areas:
  17. "header header header header"
  18. "main main . sidebar"
  19. "footer footer footer footer";
  20. }

上面的代码将创建一个 4 列宽 3 行高的网格。整个顶行将由 header 区域组成。中间一排将由两个 main 区域,一个是空单元格,一个 sidebar 区域组成。最后一行全是 footer 区域组成。

网格区域名称模板

你的声明中的每一行都需要有相同数量的单元格。

你可以使用任意数量的相邻的 点. 来声明单个空单元格。 只要这些点.之间没有空隙隔开,他们就代表一个单独的单元格。

注意你 不能 用这个语法来命名网格线,只是命名 网格区域 。当你使用这种语法时,区域两端的网格线实际上会自动命名。如果你的网格区域的名字是 foo,该区域的起始行网格线 和 起始列网格线 的名称将为 foo-start,而最后一条行网格线 和 最后一条列网格线 的名称将为 foo-end。这意味着某些网格线可能有多个名字,如上例中最左边的网格线,它将有三个名称:header-start,main-start 和 footer-start 。

回到属性列表

grid-template

用于定义 grid-template-rowsgrid-template-columnsgrid-template-areas 简写属性。

值:

  1. .container {
  2. grid-template: none | <grid-template-rows> / <grid-template-columns>;
  3. }

这个属性也接受一个更复杂但非常方便的语法来指定三个上诉属性。这里有一个例子:

  1. .container {
  2. grid-template:
  3. [row1-start] "header header header" 25px [row1-end]
  4. [row2-start] "footer footer footer" 25px [row2-end]
  5. / auto 50px auto;
  6. }

等价于:

  1. .container {
  2. grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  3. grid-template-columns: auto 50px auto;
  4. grid-template-areas:
  5. "header header header"
  6. "footer footer footer";
  7. }

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

回到属性列表

grid-column-gap / grid-row-gap

指定网格线(grid lines)的大小。你可以把它想象为设置列/行之间间距的宽度。

值:

  • <line-size> :长度值
  1. .container {
  2. grid-column-gap: <line-size>;
  3. grid-row-gap: <line-size>;
  4. }

示例:

  1. .container {
  2. grid-template-columns: 100px 50px 100px;
  3. grid-template-rows: 80px auto 80px;
  4. grid-column-gap: 10px;
  5. grid-row-gap: 15px;
  6. }

网格单元间距

只能在 列/行 之间创建间距,网格外部边缘不会有这个间距。

注意:这两个属性将删除 grid- 前缀,就是将 grid-column-gapgrid-row-gap重命名为 column-gaprow-gap。 Chrome 68+,Safari 11.2 Release 50+ 和Opera 54+ 已经支持无前缀的属性。

回到属性列表

grid-gap

grid-column-gapgrid-row-gap 的简写语法

值:

  • <grid-row-gap> <grid-column-gap>:长度值
  1. .container {
  2. grid-gap: <grid-row-gap> <grid-column-gap>;
  3. }

示例:

  1. .container {
  2. grid-template-columns: 100px 50px 100px;
  3. grid-template-rows: 80px auto 80px;
  4. grid-gap: 15px 10px;
  5. }

如果grid-row-gap没有定义,那么就会被设置为等同于 grid-column-gap 的值。例如下面的代码是等价的:

  1. .container{
  2. /* 设置 grid-column-gap 和 grid-row-gap */
  3. grid-column-gap: 10px;
  4. grid-row-gap: 10px;
  5. /* 等价于 */
  6. grid-gap: 10px 10px;
  7. /* 等价于 */
  8. grid-gap: 10px;
  9. }

注意:这个属性将删除 grid- 前缀,就是将 grid-gap 重命名为 gap。 Chrome 68+,Safari 11.2 Release 50+ 和Opera 54+ 已经支持无前缀的属性。

回到属性列表

justify-items

沿着 inline(行)轴线对齐网格项(grid items)(相反的属性是 align-items 沿着 block(列)轴线对齐)。此值适用于容器内的所有网格项。

值:

  • start:将网格项对齐到其单元格的左侧起始边缘(左侧对齐)
  • end:将网格项对齐到其单元格的右侧结束边缘(右侧对齐)
  • center:将网格项对齐到其单元格的水平中间位置(水平居中对齐)
  • stretch:填满单元格的宽度(默认值)
  1. .container {
  2. justify-items: start | end | center | stretch;
  3. }

示例:

  1. .container {
  2. justify-items: start;
  3. }

左对齐,justify-items 设置为 start 的例子

  1. .container{
  2. justify-items: end;
  3. }

右对齐,justify-items 设置为 end 的例子

  1. .container{
  2. justify-items: center;
  3. }

水平居中对齐,justify-items 设置为 center 的例子

  1. .container{
  2. justify-items: stretch;
  3. }

拉伸,justify-items 设置为 stretch 的例子

这些行为也可以通过每个单独网格项(grid items) 的 justify-self 属性设置。

回到属性列表

align-items

沿着 block(列)轴线对齐网格项(grid items)(相反的属性是 justify-items 沿着 inline(行)轴线对齐)。此值适用于容器内的所有网格项。

值:

  • start:将网格项对齐到其单元格的顶部起始边缘(顶部对齐)
  • end:将网格项对齐到其单元格的底部结束边缘(底部对齐)
  • center:将网格项对齐到其单元格的垂直中间位置(垂直居中对齐)
  • stretch:填满单元格的高度(默认值)
  1. .container {
  2. align-items: start | end | center | stretch;
  3. }

示例:

  1. .container {
  2. align-items: start;
  3. }

顶部对齐,align-items 设置为 start 的例子

  1. .container {
  2. align-items: end;
  3. }

底部对齐,align-items 设置为 end 的例子

  1. .container {
  2. align-items: center;
  3. }

垂直居中对齐,align-items 设置为 center 的例子

  1. .container {
  2. align-items: stretch;
  3. }

拉伸,align-items 设置为 stretch 的例子

这些行为也可以通过每个单独网格项(grid items) 的 align-self 属性设置。

回到属性列表

place-items

place-items 是设置 align-itemsjustify-items 的简写形式。

值:

  • <align-items> <justify-items>:第一个值设置 align-items 属性,第二个值设置 justify-items 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。

除 Edge 之外的所有主要浏览器都支持 place-items 简写属性。

有关更多详细信息,请参阅align-itemsjustify-items

回到属性列表

justify-content

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

值:

  • start:将网格对齐到 网格容器(grid container) 的左侧起始边缘(左侧对齐)
  • end:将网格对齐到 网格容器 的右侧结束边缘(右侧对齐)
  • center:将网格对齐到 网格容器 的水平中间位置(水平居中对齐)
  • stretch:调整 网格项(grid items) 的宽度,允许该网格填充满整个 网格容器 的宽度
  • space-around:在每个网格项之间放置一个均匀的空间,左右两端放置一半的空间
  • space-between:在每个网格项之间放置一个均匀的空间,左右两端没有空间
  • space-evenly:在每个网格项目之间放置一个均匀的空间,左右两端放置一个均匀的空间
  1. .container {
  2. justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  3. }

示例:

  1. .container {
  2. justify-content: start;
  3. }

左侧对齐,justify-content 设置为 start 的例子

  1. .container {
  2. justify-content: end;
  3. }

右侧对齐,justify-content 设置为 end 的例子

  1. .container {
  2. justify-content: center;
  3. }

水平居中对齐,justify-content 设置为 center 的例子

  1. .container {
  2. justify-content: stretch;
  3. }

拉伸,justify-content 设置为 stretch 的例子

  1. .container {
  2. justify-content: space-around;
  3. }

justify-content 设置为 space-around 的例子

  1. .container {
  2. justify-content: space-between;
  3. }

justify-content 设置为 space-between 的例子

  1. .container {
  2. justify-content: space-evenly;
  3. }

justify-content 设置为 space-evenly 的例子

回到属性列表

align-content

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

值:

  • start:将网格对齐到 网格容器(grid container) 的顶部起始边缘(顶部对齐)
  • end:将网格对齐到 网格容器 的底部结束边缘(底部对齐)
  • center:将网格对齐到 网格容器 的垂直中间位置(垂直居中对齐)
  • stretch:调整 网格项(grid items) 的高度,允许该网格填充满整个 网格容器 的高度
  • space-around:在每个网格项之间放置一个均匀的空间,上下两端放置一半的空间
  • space-between:在每个网格项之间放置一个均匀的空间,上下两端没有空间
  • space-evenly:在每个网格项目之间放置一个均匀的空间,上下两端放置一个均匀的空间
  1. .container {
  2. align-content: start | end | center | stretch | space-around | space-between | space-evenly;
  3. }

示例:

  1. .container {
  2. align-content: start;
  3. }

顶部对齐,align-content 设置为 start 的例子

  1. .container {
  2. align-content: end;
  3. }

底部对齐,align-content 设置为 end 的例子

  1. .container {
  2. align-content: center;
  3. }

垂直居中对齐,align-content 设置为 center 的例子

  1. .container {
  2. align-content: stretch;
  3. }

拉伸,align-content 设置为 stretch 的例子

  1. .container {
  2. align-content: space-around;
  3. }

align-content 设置为 space-around 的例子

  1. .container {
  2. align-content: space-between;
  3. }

align-content 设置为 space-between 的例子

  1. .container {
  2. align-content: space-evenly;
  3. }

align-content 设置为 space-evenly 的例子

回到属性列表

place-content

place-content 是设置 align-contentjustify-content 的简写形式。

值:

  • <align-content> <justify-content>:第一个值设置 align-content 属性,第二个值设置 justify-content 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。

除 Edge 之外的所有主要浏览器都支持 place-content 简写属性。

有关更多详细信息,请参阅align-contentjustify-content

回到属性列表

grid-auto-columns / grid-auto-rows

指定任何自动生成的网格轨道(grid tracks)(又名隐式网格轨道)的大小。当网格中的网格项多于单元格时,或者当网格项位于显式网格之外时,就会创建隐式轨道。(参见显式网格和隐式网格之间的区别

值:

  • <track-size>:可以是长度值,百分比,或者等份网格容器中可用空间的分数(使用 fr 单位)
  1. .container {
  2. grid-auto-columns: <track-size> ...;
  3. grid-auto-rows: <track-size> ...;
  4. }

为了说明如何创建隐式网格轨道,请考虑一下以下的代码:

  1. .container {
  2. grid-template-columns: 60px 60px;
  3. grid-template-rows: 90px 90px
  4. }

网格模板

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

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

  1. .item-a {
  2. grid-column: 1 / 2;
  3. grid-row: 2 / 3;
  4. }
  5. .item-b {
  6. grid-column: 5 / 6;
  7. grid-row: 2 / 3;
  8. }

隐式网格轨道示例

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

  1. .container {
  2. grid-auto-columns: 60px;
  3. }

隐式网格轨道示例

回到属性列表

grid-auto-flow

如果你有一些没有明确放置在网格上的网格项(grid items),自动放置算法 会自动放置这些网格项。该属性控制自动布局算法如何工作。

值:

  • row:告诉自动布局算法依次填充每行,根据需要添加新行 (默认)
  • column:告诉自动布局算法依次填入每列,根据需要添加新列
  • dense:告诉自动布局算法在稍后出现较小的网格项时,尝试填充网格中较早的空缺
  1. .container {
  2. grid-auto-flow: row | column | row dense | column dense
  3. }

请注意,dense 只会更改网格项的可视顺序,并可能导致它们出现乱序,这对可访问性不利。

示例:

考虑以下 HTML :

  1. <section class="container">
  2. <div class="item-a">item-a</div>
  3. <div class="item-b">item-b</div>
  4. <div class="item-c">item-c</div>
  5. <div class="item-d">item-d</div>
  6. <div class="item-e">item-e</div>
  7. </section>

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

  1. .container {
  2. display: grid;
  3. grid-template-columns: 60px 60px 60px 60px 60px;
  4. grid-template-rows: 30px 30px;
  5. grid-auto-flow: row;
  6. }

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

  1. .item-a {
  2. grid-column: 1;
  3. grid-row: 1 / 3;
  4. }
  5. .item-e {
  6. grid-column: 5;
  7. grid-row: 1 / 3;
  8. }

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

自动放置算法

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

  1. .container {
  2. display: grid;
  3. grid-template-columns: 60px 60px 60px 60px 60px;
  4. grid-template-rows: 30px 30px;
  5. grid-auto-flow: column;
  6. }

自动放置算法

回到属性列表

grid

在一个声明中设置所有以下属性的简写: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 。(注意:您只能在单个网格声明中指定显式或隐式网格属性)。

值:

  • none:将所有子属性设置为其初始值。
  • <grid-template>:与grid-template 简写的工作方式相同。
  • <grid-template-rows> / [ auto-flow && dense? ] <grid-auto-columns>? :将grid-template-rows 设置为指定的值。 如果 auto-flow 关键字位于斜杠的右侧,则会将 grid-auto-flow 设置为 column。 如果另外指定了 dense 关键字,则自动放置算法使用 “dense” 算法。 如果省略 grid-auto-columns ,则将其设置为 auto
  • [ auto-flow && dense? ] <grid-auto-rows>? / <grid-template-columns>:将 grid-template-columns 设置为指定值。 如果 auto-flow 关键字位于斜杠的左侧,则会将grid-auto-flow 设置为 row 。 如果另外指定了 dense 关键字,则自动放置算法使用 “dense” 打包算法。 如果省略 grid-auto-rows ,则将其设置为 auto

例子:

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

  1. .container {
  2. grid: 100px 300px / 3fr 1fr;
  3. }
  1. .container {
  2. grid-template-rows: 100px 300px;
  3. grid-template-columns: 3fr 1fr;
  4. }

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

  1. .container {
  2. grid: auto-flow / 200px 1fr;
  3. }
  1. .container {
  2. grid-auto-flow: row;
  3. grid-template-columns: 200px 1fr;
  4. }

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

  1. .container {
  2. grid: auto-flow dense 100px / 1fr 2fr;
  3. }
  1. .container {
  2. grid-auto-flow: row dense;
  3. grid-auto-rows: 100px;
  4. grid-template-columns: 1fr 2fr;
  5. }

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

  1. .container {
  2. grid: 100px 300px / auto-flow 200px;
  3. }
  1. .container {
  2. grid-template-rows: 100px 300px;
  3. grid-auto-flow: column;
  4. grid-auto-columns: 200px;
  5. }

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

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

等价于:

  1. .container {
  2. grid-template-areas:
  3. "header header header"
  4. "footer footer footer";
  5. grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
  6. grid-template-columns: auto 50px auto;
  7. }

子元素 网格项(Grid Items) 属性

注意:floatdisplay: inline-blockdisplay: table-cellvertical-aligncolumn-* 属性对网格项无效。

回到属性列表

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 是网格项结束的网格线。

值:

  • <line> :可以是一个数字引用一个编号的网格线,或者一个名字来引用一个命名的网格线
  • span <number> :该网格项将跨越所提供的网格轨道数量
  • span <name> :该网格项将跨越到它与提供的名称位置
  • auto:表示自动放置,自动跨度,默认会扩展一个网格轨道的宽度或者高度
  1. .item {
  2. grid-column-start: <number> | <name> | span <number> | span <name> | auto
  3. grid-column-end: <number> | <name> | span <number> | span <name> | auto
  4. grid-row-start: <number> | <name> | span <number> | span <name> | auto
  5. grid-row-end: <number> | <name> | span <number> | span <name> | auto
  6. }

示例:

  1. .item-a {
  2. grid-column-start: 2;
  3. grid-column-end: five;
  4. grid-row-start: row1-start
  5. grid-row-end: 3;
  6. }

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

  1. .item-b {
  2. grid-column-start: 1;
  3. grid-column-end: span col4-start;
  4. grid-row-start: 2
  5. grid-row-end: span 2
  6. }

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

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

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

回到属性列表

grid-column / grid-row

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

值:

  • <start-line> / <end-line>:每个网格项都接受所有相同的值,作为普通书写的版本,包括跨度
  1. .item {
  2. grid-column: <start-line> / <end-line> | <start-line> / span <value>;
  3. grid-row: <start-line> / <end-line> | <start-line> / span <value>;
  4. }

示例:

  1. .item-c {
  2. grid-column: 3 / span 2;
  3. grid-row: third-line / 4;
  4. }

网格项位置简写形式

如果没有声明分隔线结束位置,则该网格项默认占据 1 个网格轨道。

回到属性列表

grid-area

为网格项提供一个名称,以便可以 被使用网格容器 grid-template-areas 属性创建的模板进行引用。 另外,这个属性可以用作grid-row-start + grid-column-start + grid-row-end + grid-column-end 的简写。

值:

  • <name>:你所选的名称
  • <row-start> / <column-start> / <row-end> / <column-end>:数字或分隔线名称
  1. .item {
  2. grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
  3. }

示例:

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

  1. .item-d {
  2. grid-area: header
  3. }

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

  1. .item-d {
  2. grid-area: 1 / col4-start / last-line / 6
  3. }

网格区域

回到属性列表

justify-self

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

值:

  • start:将网格项对齐到其单元格的左侧起始边缘(左侧对齐)
  • end:将网格项对齐到其单元格的右侧结束边缘(右侧对齐)
  • center:将网格项对齐到其单元格的水平中间位置(水平居中对齐)
  • stretch:填满单元格的宽度(默认值)
  1. .item {
  2. justify-self: start | end | center | stretch;
  3. }

示例:

  1. .item-a {
  2. justify-self: start;
  3. }

左对齐,将 justify-self 设置为 start 的例子

  1. .item-a {
  2. justify-self: end;
  3. }

右对齐,将 justify-self 设置为 end 的例子

  1. .item-a {
  2. justify-self: center;
  3. }

水平居中对齐,将 justify-self 设置为 center 的例子

  1. .item-a {
  2. justify-self: stretch;
  3. }

填充宽度,将 justify-self 设置为 stretch 的例子

要为网格中的所有网格项设置 行轴线(row axis) 线上对齐方式,也可以在 网格容器 上设置 justify-items 属性。

回到属性列表

align-self

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

值:

  • start:将网格项对齐到其单元格的顶部起始边缘(顶部对齐)
  • end:将网格项对齐到其单元格的底部结束边缘(底部对齐)
  • center:将网格项对齐到其单元格的垂直中间位置(垂直居中对齐)
  • stretch:填满单元格的高度(默认值)
  1. .item{
  2. align-self: start | end | center | stretch;
  3. }

示例:

  1. .item-a {
  2. align-self: start;
  3. }

顶部对齐,将 align-self 设置为 start 的例子

  1. .item-a {
  2. align-self: end;
  3. }

底部对齐,将 align-self 设置为 end 的例子

  1. .item-a {
  2. align-self: center;
  3. }

垂直居中对齐,将 align-self 设置为 center 的例子

  1. .item-a {
  2. align-self: stretch;
  3. }

填充高度,将 align-self 设置为 stretch 的例子

要为网格中的所有网格项设置 列轴线(column axis) 上的对齐方式,也可以在 网格容器 上设置 align-items 属性。

回到属性列表

place-self

place-self 是设置 align-selfjustify-self 的简写形式。

值:

  • auto – 布局模式的 “默认” 对齐方式。
  • <align-self> <justify-self>:第一个值设置 align-self 属性,第二个值设置 justify-self 属性。如果省略第二个值,则将第一个值同时分配给这两个属性。

示例:

  1. .item-a {
  2. place-self: center;
  3. }

居中,将 place-self 设置为 center 的例子

  1. .item-a {
  2. place-self: center stretch;
  3. }

居中,将 place-self 设置为 center stretch 的例子

除 Edge 之外的所有主要浏览器都支持 place-self 简写属性。

动画(Animation)

根据 CSS Grid 布局模块 Level 1 规范,有 5 个可应用动画的网格属性:

  • grid-gapgrid-row-gapgrid-column-gap 作为长度,百分比或 calc。
  • grid-template-columnsgrid-template-rows 作为长度,百分比或 calc 的简单列表,只要列表中长度、百分比或calc组件的值不同即可。

浏览器支持CSS网格属性

截至今天(2018年5月7日),在测试的几个浏览器中仅实现 (grid-)gap(grid-)row-gap(grid-)column-gap 的动画。

浏览器支持可设置动画的网格属性:

浏览器(grid-)gap, (grid-)row-gap, (grid-)column-gapgrid-template-columnsgrid-template-rows
Firefox 55+,Firefox 53+ Mobile
Safari 11.0.2
Chrome 66+
Chrome for Android 66+, Opera Mini 33+
Edge 16+

CSS网格布局:动画演示

https://codepen.io/matuzo/pen/rmQvMG

版权声明:本站文章除特别声明外,均采用署名-非商业性使用-禁止演绎 4.0 国际 许可协议,如需转载,请注明出处
  • 使用@font-face自定义网页字体

    网页上设置的字体,一般是windows/MAC系统自带有的才会正常渲染出来,一般为微软雅黑,宋体等这样的常见字体,如果网页使用的字体,系统没有,那就要自定义了,如何自定义呢? 使用font-face

    发布:2021-12-14 阅读(5617)

  • height:100%不能继承min-height:100%,怎么解决?

    后台系统经常遇到的问题,父元素设置了`min-height:100%`,子元素设置`height:100%`,然哦你会发现,子元素的100%不生效

    发布:2021-07-16 阅读(2281)

  • 移动端为什么要用box-sizing:border-box?

    提到Box-sizing,先前的一篇文章也提到过,其实在布局的时候很好用,可以省去很多多余的代码,至于兼容性,目前还只能在移动端应用多,因为它是CSS3的属性。大家看几个例子,应该就一目了然了。

    发布:2020-12-10 阅读(2581)

  • Sass、LESS 和 Stylus区别总结

    CSS 预处理器技术已经非常的成熟了,而且也涌现出了越来越多的 CSS 的预处理器框架。本文便总结下 Sass、Less CSS、Stylus这三个预处理器的区别和各自的基本语法。

    发布:2019-10-16 阅读(2895)

  • 使用 media query 进行 IE 的 CSS Hack

    通过 media query 进行 CSS 的 hack。在 IE 中它们可以识别出这些特殊的符号 \0,\, 以及 \9,然后结合 media query 可以更好进行样式的区分

    发布:2019-08-07 阅读(2265)

  • Css Grid fr单位

    css fr 单位是一个自适应单位,fr单位被用于在一系列长度值中分配剩余空间,如果多个已指定了多个部分,则剩下的空间根据各自的数字按比例分配。

    发布:2019-02-28 阅读(4310)

  • CSS Grid网格布局指南(学习)

    CSS网格布局是CSS中最强大的布局系统。它是一个二维系统,这意味着它可以处理列和行,不像flexbox主要是一维系统。CSS网格布局用于将页面分割成数个主要区域,或者用来定义组件内部元素间大小、位置和图层之间的关系。像表格一样,网格布局让我们能够按行或列来对齐元素。 但是,使用CSS网格可能还是比CSS表格更容易布局。 例如,网格容器的子元素可以自己定位,以便它们像CSS定位的元素一样,真正的有重叠和层次。

    发布:2019-02-28 阅读(3440)

  • 什么是Sass,SCSS与它是什么关系?

    什么是Sass,SCSS与它是什么关系?

    发布:2019-02-26 阅读(3520)

  • css3 自定义浏览器滚动条(scrollbar)

    通过-webkit-scrollbar自定义浏览器滚动条,支持webkit的浏览器可正常显示(如chrome,safari,QQ浏览器,360极速等)

    发布:2019-01-28 阅读(3402)

  • CSS中伪类和伪元素总结

    css伪类和伪元素有什么区别?

    发布:2019-01-14 阅读(2716)

  • 视窗单位vm,vh,vmin,vmax

    记录下响应式布局单位(视窗单位:viewport units)的应用,最近用electron开发桌面应用,用到vh,vw还是蛮方便的.

    发布:2019-01-09 阅读(2489)

  • 妙法攻略:渐变虚框及边框滚动动画的纯CSS实现

    CSS3实现滚动边框,渐变边框

    发布:2018-12-07 来源:张鑫旭

  • CSS3 手册

    CSS3 是层叠样式表(Cascading Style Sheets)语言的最新版本,旨在扩展CSS2.1。它带来了许多期待已久的新特性, 例如圆角、阴影、gradients(渐变) 、transitions(过渡) 与 animations(动画) 。以及新的布局方式,如 multi-columns 、 flexible box 与 grid layouts。实验性特性以浏览器引擎为前缀(vendor-prefixed),应避免在生产环境中使用,或极其谨慎地使用,因为将来它们的语法和语义都有可能被更改。

    发布:2018-11-06 来源:mozilla

  • 探究 CSS 解析原理

    浏览器 CSS 模块负责 CSS 脚本解析,并为每个 Element 计算出样式。CSS 模块虽小,但是计算量大,设计不好往往成为浏览器性能的瓶颈。

    发布:2017-12-15 阅读(2681)

  • [布局概念] 关于CSS-BFC深入理解

    BFC(Block formatting context)直译为&amp;quot;块级格式化上下文&amp;quot;。它**是一个独立的渲染区域**,只有**Block\-level box**参与(在下面有解释), 它规定了内部的Block\-level Box如何布局,并且与这个区域外部毫不相干。

    发布:2017-06-09 阅读(2868)

  • 移动端retina屏1px细边框问题

    retina屏下(window.devicepixelratio>1),1px的边框会被渲染成2px,看起会比较粗,如何解决?

    发布:2017-02-15 阅读(3558)

  • 隐藏input type=number元素,右侧的上下箭头

    通过CSS隐藏input='number'时,右侧的箭头

    发布:2015-08-21 阅读(14717)

  • 移动端 UC浏览器字体放大的问题

    在做移动端页面时,发现UC浏览器在文字居多的页面(如文章页面、关于我们页面),字体会自动放大。其他的浏览器都没有问题~~

    发布:2015-08-17 阅读(2400)

  • 利用rgba和filter设置CSS背景颜色半透明且不影响子元素,兼容IE6-8

    css设置子元素半透明,兼容IE6-8

    发布:2013-05-28 阅读(2696)

  • text-overflow:clip | ellipsis 单行截断文字

    利用CSS截断单行文字,溢出的显示"..."

    发布:2012-11-23 阅读(3380)

  • 禁止<textarea>标签右下角拉动

    HTML标签textarea在大部分浏览器中只要指定行(rows)和列(cols)属性,就可以规定 textarea 的尺寸,大小就不会改变,不过更好的办法是使用 CSS 的 height 和 width 属性,但是Chrome,Safari和FireFox渲染的效果不同,可以拖动右下角图标改变大小

    发布:2012-11-14 阅读(3377)

  • 去掉Chrome,Safari等浏览器input,select,textarea等form元素的高亮效果

    chrome、safari等现代浏览器,input,textarea,select等一些Form元素,会有一个默认的高亮样式

    发布:2012-11-13 阅读(3808)

  • CSS设置超链接a:link,a:visited,a:hover,a:active的顺序

    CSS针对超链接4个状态的设置是有顺序的,顺序不对,a链接的各种状态可能不会生效

    发布:2012-10-23 阅读(3905)

  • CSS常用hack技巧

    在当前的WEB前端页面制作中,鉴于市面上浏览器种类繁多(IE6-IE9、firefox、Chrome、Safari、Opera等等),各种浏览器对CSS的解析效果会有所不同(少数),所以要想让页面完全的兼容所有浏览器,就必须要用css hack。可能不同的开发人员,使用的hack方式不一样,但最终的目的都是希望各种浏览器渲染出同样的页面效果

    发布:2012-10-16 阅读(2492)

  • 利用CSS制作尖角

    用两个◆制作尖角(引用腾讯微博中的做法)

    发布:2012-10-15 阅读(2668)