[译] Grid 布局完全指南

MelindaEdga 8年前
   <h2>简介</h2>    <p>CSS 栅格布局 (亦称 "Grid"),是一个基于栅格的二维布局系统,旨在彻底改变基于网格用户界面的设计。CSS 一直以来并没有把布局做的足够好。刚开始,我们使用 tables,后来是 floats,positioning 和 inline-block,这些本质上是一些 hacks 而且许多重要功能尚未解决(例如垂直居中)。Flexbox 可以做到这些,但是它主要用来一些简单的一维布局,并不适合复杂的二维布局(当然 Flexbox 与 Grid 可以一并使用)。Grid 是第一个为了解决布局问题的 CSS 模块,只要我们做过网页,就会遇到这些问题。</p>    <p>有两件事情在激励着我创作这篇指南,首先是 Rachel Andrew 那本非常不错的书 <a href="/misc/goto?guid=4959736846254190256" rel="nofollow,noindex">Get Ready for CSS Grid Layout.</a> ,清晰透彻地介绍了 Grid,它是本篇文章的基础。我 <strong>强烈建议</strong> 你去购买并且阅读它。另一件事是 Chris Coyier 的文章 <a href="/misc/goto?guid=4958874471790150347" rel="nofollow,noindex">A Complete Guide to Flexbox</a> ,是关于 flexbox 的首选资源。它帮助了很多人,当你 Google "flexbox" 的时候,第一眼便能够看见它。或许你已经注意到我的文章与它有很大相似之处,但我们有什么理由不借鉴它呢?</p>    <p>我会把 Grid 在最新版本规范上的概念呈现出来。因此,我将不会照顾过期的 IE 语法。当规范成熟时,我将尽可能去定期更新。</p>    <h2>基础与浏览器支持</h2>    <p>开始 Grid 是简单的,你仅仅需要在容器(container)元素上定义一个栅格使用 display: grid ,并通过 grid-template-columns 与 grid-template-rows 设置行与列。通过设置 grid-column 和 grid-row 把子元素置于栅格中。与 flexbox 类似,栅格项目(items)的顺序是无关紧要的,你可以通过 CSS 来控制顺序。当使用媒体查询时,改变它们的顺序是极其简单的。假设你设计好了网页的布局,但你需要适应不同的屏幕宽度,这仅仅需要几行代码,Grid 是最为有效的模块。</p>    <p>关于 Grid 一件非常重要的事情是你还不能够在生产环境中使用它。它目前仅仅是一个 <a href="/misc/goto?guid=4959736846375187302" rel="nofollow,noindex">W3C工作草案</a> ,而且不能够被任何浏览器默认支持。虽然IE10 与 IE11 能够支持它,但使用了过期语法旧的实现。为了现在能够体验 Grid,最好的方法是使用 Chrome, Opera 或者 Firefox,并且开启特定的标志。在 Chrome 中,导航到 chrome://flags 并且开启 “experimental web platform features”。在 Opera 中同样如此(opera://flags)。在 Firefox 中,开启标志 layout.css.grid.enabled(about:config)。</p>    <p>这有一张浏览器支持表格,我将保持更新。</p>    <p>Chrome 29+ (Behind flag)</p>    <p>Safari Not supported</p>    <p>Firefox 40+ (Behind flag)</p>    <p>Opera 28+ (Behind flag)</p>    <p>IE 10+ (Old syntax)</p>    <p>Android Not supported</p>    <p>iOS Not supported</p>    <p>译者注:现在有些最新浏览器的最新版本已经能够支持,可以查看 caniuse 网站。</p>    <p>你在生产环境中使用它仅仅是一个时间问题。但是,学习正在当下!</p>    <h2>重要术语</h2>    <p>在深入了解 Grid 概念之前,了解它的术语是极为重要的。因为在此涉及到的术语概念相似,不易混淆。不过不用担心,他们并没有很多。</p>    <h3>Grid Container (栅格容器)</h3>    <p>设置 display: grid 的元素,它是所有栅格项目的直接父级元素。在这个例子中, container 是栅格的容器。</p>    <pre>  <code class="language-css"><div class="container">    <div class="item item-1"></div>    <div class="item item-2"></div>    <div class="item item-3"></div>  </div></code></pre>    <h3>Grid Item (栅格项目)</h3>    <p>栅格容器的直接子代。在这里 item 是栅格项目,而 sub-item 不是栅格项目。</p>    <pre>  <code class="language-css"><div class="container">    <div class="item"></div>     <div class="item">      <p class="sub-item"></p>    </div>    <div class="item"></div>  </div></code></pre>    <h3>Grid Line (栅格线)</h3>    <p>组成栅格结构的分割线。它们位于行与列的两侧,有的是垂直的(列栅格线),有的是水平的(行栅格线)。以下黄色线是一个列栅格线。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/df70da419aef9e7b3c3315d6f6e0c5da.png"></p>    <h3>Grid Track (栅格轨迹)</h3>    <p>相邻栅格线的区域。你可以认为他们是栅格的一行或者一列。以下是第二与第三栅格线间的栅格轨迹。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/afdb90fe7ec9be672cb5e7f84ff149da.png"></p>    <h3>Grid Cell (栅格格子)</h3>    <p>相邻行栅格线与相邻列栅格线间的区域。它是栅格的独立“单元”。以下栅格格子位于1,2行栅格线与2,3列栅格线间。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e50fdda1adb492d8e162e5c898144b46.png"></p>    <h3>Grid Area (栅格区域)</h3>    <p>被四个栅格线围绕的区域。一个栅格区域由任意数量的栅格格子组成。以下栅格区域位于1,3行栅格线与1,3列栅格线间。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4f426be7d8f6b4138562016a40440921.png"></p>    <h2>栅格属性内容表</h2>    <p>属于栅格容器的属性:</p>    <ul>     <li> <p>display</p> </li>     <li> <p>grid-template-columns</p> </li>     <li> <p>grid-template-rows</p> </li>     <li> <p>grid-template-areas</p> </li>     <li> <p>grid-column-gap</p> </li>     <li> <p>grid-row-gap</p> </li>     <li> <p>grid-gap</p> </li>     <li> <p>justify-items</p> </li>     <li> <p>align-items</p> </li>     <li> <p>justify-content</p> </li>     <li> <p>align-content</p> </li>     <li> <p>grid-auto-columns</p> </li>     <li> <p>grid-auto-rows</p> </li>     <li> <p>grid-auto-flow</p> </li>     <li> <p>grid</p> </li>    </ul>    <p>属于栅格项目的属性:</p>    <ul>     <li> <p>grid-column-start</p> </li>     <li> <p>grid-column-end</p> </li>     <li> <p>grid-row-start</p> </li>     <li> <p>grid-row-end</p> </li>     <li> <p>grid-column</p> </li>     <li> <p>grid-row</p> </li>     <li> <p>grid-area</p> </li>     <li> <p>justify-self</p> </li>     <li> <p>align-self</p> </li>    </ul>    <h2>栅格容器属性(Grid Container)</h2>    <h3>display</h3>    <p>定义该元素为栅格项目,并且为它的内容建立一个新的 <em>栅格格式上下文(grid formatting context)</em> 。</p>    <p>译者注:还记得 BFC 与 IFC 吗?</p>    <p>属性值:</p>    <ul>     <li> <p>grid生成块状栅格</p> </li>     <li> <p>inline-grid生成行间栅格</p> </li>     <li> <p>subgrid如果你的栅格容器本身是一个栅格项目的话(例如:嵌套栅格),你可以根据它的父元素而不是它自己,指定行列大小。</p> </li>    </ul>    <pre>  <code class="language-css">.container{    display: grid | inline-grid | subgrid;  }</code></pre>    <p>注意: column , float , clear 与 vertical-align 在栅格容器上无效。</p>    <h3> </h3>    <p>grid-template-columns</p>    <p>grid-template-rows</p>    <p>通过空格分隔的值定义栅格的行与列。值代表轨迹大小(track size),它们中间的间隙代表栅格线。</p>    <p>属性值:</p>    <ul>     <li> <p><track-size>可以是长度,百分比,或者栅格中的空白空间(使用 fr )</p> </li>     <li> <p><line-name>任意名字,任君选择</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-template-columns: <track-size> ... | <line-name> <track-size> ...;    grid-template-rows: <track-size> ... | <line-name> <track-size> ...;  }</code></pre>    <p>示例:</p>    <p>当你在轨迹值之间预留空格时,栅格线会被自动分配为数值名字。</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 40px 50px auto 50px 40px;    grid-template-rows: 25% 100px auto;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/a2584eed913a3a56fd42624c960b514b.png"></p>    <p>你也可以为栅格线设置名字,注意栅格线名字的括号语法:</p>    <pre>  <code class="language-css">.container{    grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];    grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d08481a918a36af283cc9754a5eeb003.png"></p>    <p>注意一条线可以有多个名字。例如,这里第二条线有两个名字:row1-end 和 row2-start。</p>    <pre>  <code class="language-css">.container{    grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];  }</code></pre>    <p>如果你定义的内容包含重复部分,你可以使用 repeat() 标记去组织它。</p>    <pre>  <code class="language-css">.container{    grid-template-columns: repeat(3, 20px [col-start]) 5%;  }</code></pre>    <p>与以下代码是等价的</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;  }</code></pre>    <p>fr 允许你设置轨迹大小为栅格容器的一部分。例如,以下示例将设置每个项目为栅格容器的三分之一。</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 1fr 1fr 1fr;  }</code></pre>    <p>空白空间将在固定项目 <em>之后</em> 被计算。在这个例子中,给 fr 分配的全部空余时间不包括 50px。</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 1fr 50px 1fr 1fr;  }</code></pre>    <h3>grid-template-areas</h3>    <p>通过指定栅格区域的名字来定义栅格模板,这样栅格项目会通过属性来指定区域。重复栅格区域的名字将会合并栅格格子,一个句点表示一个空的栅格格子。语法本身提供了一个可视化的栅格结构。</p>    <p>属性值:</p>    <ul>     <li> <p><grid-area-name>在项目中使用属性指定的栅格区域</p> </li>     <li> <p>.句点表示空白栅格格子</p> </li>     <li> <p>none不定义栅格区域</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-template-areas: "<grid-area-name> | . | none | ..."                         "..."  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.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"  }</code></pre>    <p>这将建造一个三行四列的栅格。第一行全部由 <strong>header</strong> 区域组成,第二行由两个 <strong>main</strong> 区域,一个空白格子与一个 <strong>sidebar</strong> 区域组成。最后一行全部由 <strong>footer</strong> 组成。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fc0a114d7e698e5d231a5c976399c48b.png"></p>    <p>你声明的每行都需要有相同数量的栅格格子。</p>    <p>你可以使用任意数量无空格分割的相邻句点去表示单个空白栅格格子。</p>    <p>译者注: grid-template-areas: "first . last" 与 grid-template-areas: "first ...... last" 等价。</p>    <p>注意,这种语法仅仅能命名区域,而无法命名栅格线。实际上,当你使用这种语法的时候,栅格区域两端的栅格线已被自动命名。如果你的栅格区域叫 <strong> <em>foo</em> </strong> ,栅格区域开始的行与列将被命名为 <strong> <em>foo-start</em> </strong> ,而结束的行与列将被命名为 <strong> <em>foo-end</em> </strong> 。这意味着一些栅格线会有很多名字,比如上述例子的最左边的栅格线将会有三个名字:header-start, main-start 和 footer-start。</p>    <h3>grid-template</h3>    <p>属性值:</p>    <ul>     <li> <p>none设置这三个属性为初始属性</p> </li>     <li> <p>subgrid设置 grid-template-rows 和 grid-template-columns 为 subgrid , grid-template-areas 为初始值。</p> </li>     <li> <p><grid-template-columns> / <grid-template-rows>设置 grid-template-columns 与 grid-template-rows 为各自指定的值。而 grid-template-areas 为 none 。</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-template: none | subgrid | <grid-template-columns> / <grid-template-rows>;  }</code></pre>    <p>另外,也有一个比较复杂但是方便的语法指定三个属性,示例如下</p>    <pre>  <code class="language-css">.container{    grid-template: auto 50px auto /      [row1-start] 25px "header header header" [row1-end]      [row2-start] "footer footer footer" 25px [row2-end];  }</code></pre>    <p>与以下代码是等价的:</p>    <pre>  <code class="language-css">.container{    grid-template-columns: auto 50px auto;    grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];    grid-template-areas:       "header header header"       "footer footer footer";  }</code></pre>    <p>因为 grid-template 无法 <em>隐式</em> 重置属性(,与)。或许你想做更多的事,那么推荐你使用 grid 属性去替代 grid-template 。</p>    <h3> </h3>    <p>grid-column-gap</p>    <p>grid-row-gap</p>    <p>指定栅格线的大小,你可以理解它为设置行/列间隙。</p>    <p>属性值:</p>    <ul>     <li> <p>长度值</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-column-gap: <line-size>;    grid-row-gap: <line-size>;  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 100px 50px 100px;    grid-template-rows: 80px auto 80px;     grid-column-gap: 10px;    grid-row-gap: 15px;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/6edb3ed58b9ae0997296383039b6cadf.png"></p>    <p>栅格间隙仅仅在行/列 <em>之间</em> ,不包括最外部的边。</p>    <h3>grid-gap</h3>    <p>属性值:</p>    <ul>     <li> <p>长度值</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-gap: <grid-row-gap> <grid-column-gap>;  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 100px 50px 100px;    grid-template-rows: 80px auto 80px;     grid-gap: 10px 15px;  }</code></pre>    <p>如果没有设置 grid-row-gap ,它将于 grid-column-gap 保持一致。</p>    <h3>justify-items</h3>    <p>使栅格项目中的内容与 <em>列</em> 轴对齐(相应地,与 <em>行</em> 轴对齐)。这个属性值应用在容器中的所有项目上。</p>    <p>属性值:</p>    <ul>     <li> <p>start使内容与栅格区域左侧对齐</p> </li>     <li> <p>end使内容与栅格区域右侧对齐</p> </li>     <li> <p>center使内容在栅格区域中居中</p> </li>     <li> <p>stretch使内容充满整个栅格区域的宽(默认属性)</p> </li>    </ul>    <pre>  <code class="language-css">.container{    justify-items: start | end | center | stretch;  }</code></pre>    <p>示例</p>    <pre>  <code class="language-css">.container{    justify-items: start;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b534f0d61bc096d4ee73927ec928b74b.png"></p>    <pre>  <code class="language-css">.container{    justify-items: end;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9ce6aeb535fecd4fbf754a843ef8cec2.png"></p>    <pre>  <code class="language-css">.container{    justify-items: center;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/dfb32a8985e7fb64351898e4c8b6cdcc.png"></p>    <pre>  <code class="language-css">.container{    justify-items: stretch;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3d0368c79a2b4b82c9b6a65be066e251.png"></p>    <p>这个行为也可以通过属性设置在独立的栅格项目上。</p>    <h3>align-items</h3>    <p>使栅格项目中的内容与 <em>行</em> 轴对齐(相应地,与 <em>列</em> 轴对齐)。这个属性值应用在容器中的所有项目上。</p>    <p>属性值:</p>    <ul>     <li> <p>start使内容与栅格区域顶部对齐</p> </li>     <li> <p>end使内容与栅格区域底部对齐</p> </li>     <li> <p>center使内容在栅格区域中居中</p> </li>     <li> <p>stretch使内容充满整个栅格区域的高(默认属性)</p> </li>    </ul>    <pre>  <code class="language-css">.container{    align-items: start | end | center | stretch;  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.container{    align-items: start;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d0b04fbe7a410b6d17acd72e5b940a4e.png"></p>    <pre>  <code class="language-css">.container{    align-items: end;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c33a15ab20f8f733235797ea5f8e801d.png"></p>    <pre>  <code class="language-css">.container{    align-items: center;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c5fda19e9e1f32b77d573d04036e4aa2.png"></p>    <pre>  <code class="language-css">.container{    align-items: stretch;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e6b3ee7958f3bd16b22cbe7209d1bd27.png" alt="[译] Grid 布局完全指南" width="312" height="125"></p>    <p>这个行为也可以通过属性设置在独立的栅格项目上。</p>    <h3>justify-content</h3>    <p>有时候,栅格的总大小小于栅格容器的大小,比如你使用 px 给所有的栅格项目设置了固定大小。本例中,你可以设置栅格容器中栅格的对齐。这个属性会使栅格与 <em>列</em> 轴对齐(相应地,会使栅格与 <em>行</em> 轴对齐)。</p>    <p>属性值:</p>    <ul>     <li> <p>start与栅格容器的左侧对齐</p> </li>     <li> <p>end与栅格容器的右侧对齐</p> </li>     <li> <p>center在栅格容器中居中</p> </li>     <li> <p>stretch调整栅格项目的大小,使栅格充满整个栅格容器。</p> </li>     <li> <p>space-around每两个项目之间留有相同的空白,在最左端与最右端为一半大小的空白。</p> </li>     <li> <p>space-between每两个项目之间留有相同的空白,在最左端与最右端不留空白。</p> </li>     <li> <p>space-evenly每两个项目之间留有相同的空白,包括两端。</p> </li>    </ul>    <pre>  <code class="language-css">.container {    align-content: start | end | center | stretch | space-around | space-between | space-evenly;    }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.container{    justify-content: start;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f7fa829e156aa65a30d61c747498f1ef.png"></p>    <pre>  <code class="language-css">.container{    justify-content: end;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9a311336e6a18607ad64eaab21ad3e42.png"></p>    <pre>  <code class="language-css">.container{    justify-content: center;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e4600670d010a21bad8e3a02f1c983db.png"></p>    <pre>  <code class="language-css">.container{    justify-content: stretch;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1f88e7ed0fe41315f9ea0659f0cd7215.png"></p>    <pre>  <code class="language-css">.container{    justify-content: space-around;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3b86fdb0e25e0bdc6ec3489f495da567.png"></p>    <pre>  <code class="language-css">.container{    justify-content: space-between;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/afb7cadb9b9dff6ecdf0e011c1824244.png"></p>    <pre>  <code class="language-css">.container{    justify-content: space-evenly;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1c59ad0084e1aee5a245416f19a0d658.png"></p>    <h3>align-content</h3>    <p>有时候,栅格的总大小小于栅格容器的大小,比如你使用 px 给所有的栅格项目设置了固定大小。本例中,你可以设置栅格容器中栅格的对齐。这个属性会使栅格与 <em>行</em> 轴对齐(相应地, align-content 会使栅格与 <em>列</em> 轴对齐)。</p>    <p>属性值:</p>    <ul>     <li> <p>start与栅格容器的顶部对齐</p> </li>     <li> <p>end与栅格容器的底部对齐</p> </li>     <li> <p>center在栅格容器中居中</p> </li>     <li> <p>stretch调整栅格项目的大小,使栅格充满整个栅格容器。</p> </li>     <li> <p>space-around每两个项目之间留有相同的空白,在最左端与最右端为一半大小的空白。</p> </li>     <li> <p>space-between每两个项目之间留有相同的空白,在最左端与最右端不留空白。</p> </li>     <li> <p>space-evenly每两个项目之间留有相同的空白,包括两端。</p> </li>    </ul>    <pre>  <code class="language-css">.container{    align-content: start | end | center | stretch | space-around | space-between | space-evenly;    }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.container{    align-content: start;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e28df0d7e14e12bdfbf2e3e48680996f.png"></p>    <pre>  <code class="language-css">.container{    align-content: end;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/33207e598006fb09977ce5c83fc5df72.png"></p>    <pre>  <code class="language-css">.container{    align-content: center;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/1e2a45b761ffebd9e0da3f0b98a21c18.png"></p>    <pre>  <code class="language-css">.container{    align-content: stretch;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f995be4428e49f66a9c4455aff7e8111.png"></p>    <pre>  <code class="language-css">.container{    align-content: space-around;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/0b002e13b9bfc04642c818d7a91adb6f.png"></p>    <pre>  <code class="language-css">.container{    align-content: space-between;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/dc4b8fc3f1845a4b578d8191347fcac0.png"></p>    <pre>  <code class="language-css">.container{    align-content: space-evenly;    }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f18580eaf06633de75642a3675592606.png"></p>    <h3> </h3>    <p>grid-auto-columns</p>    <p>grid-auto-rows</p>    <p>指定自动生成的栅格轨迹的大小(亦称 <em>隐式栅格轨迹</em> )。当你显式定位行与列的时候(通过 grid-template-rows / grid-template-columns ),隐式栅格轨迹会在定义的栅格外被创建。</p>    <p>属性值:</p>    <ul>     <li> <p><track-size>可以是长度,百分比或者 fr</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-auto-columns: <track-size> ...;    grid-auto-rows: <track-size> ...;  }</code></pre>    <p>举例了解隐式栅格轨迹是如何被创建的,考虑以下示例:</p>    <pre>  <code class="language-css">.container{    grid-template-columns: 60px 60px;    grid-template-rows: 90px 90px  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ef781f8cf12fca5ed8927824feea7d62.png"></p>    <p>本示例建造了 2 * 2 的栅格。</p>    <p>你使用 [grid-column ](#prop-grid-column) 与去定位你的项目如下:</p>    <pre>  <code class="language-css">.item-a{    grid-column: 1 / 2;    grid-row: 2 / 3;  }  .item-b{    grid-column: 5 / 6;    grid-row: 2 / 3;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/ef781f8cf12fca5ed8927824feea7d62.png"></p>    <p>我们告知 .item-b 在 5-6 列间, <em>但我们从未定义第五列或者第六列</em> 。因为我们引用的栅格线不存在,宽度为0的隐式栅格轨迹将会创建去填充空白。我们可以使用和去指定这些轨迹的宽。</p>    <p>译者注:经译者测试,并非以宽度为0的 implicit track 去填充。 w3c auto-tracks 上表明 grid-auto-columns 的默认值为 auto ,则超过的列将会平分空白空间。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3ea78da3fc1e351734c021dc2f90c1e3.png"></p>    <pre>  <code class="language-css">.container{    grid-auto-columns: 60px;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/3ea78da3fc1e351734c021dc2f90c1e3.png"></p>    <h3>grid-auto-flow</h3>    <p>如果你的栅格项目没有显式地在栅格中设置位置, <em>自动放置算法</em> 便会生效。这个属性控制自动放置算法的的运作。</p>    <p>属性值:</p>    <ul>     <li> <p>row自动放置算法将按行依次排列,按需添加新行。</p> </li>     <li> <p>column自动放置算法将按列依次排列,按需添加新列。</p> </li>     <li> <p>dense如果较小的项目出现靠后时,自动防止算法将尽可能早地填充栅格的空白格子</p> </li>    </ul>    <pre>  <code class="language-css">.container{    grid-auto-flow: row | column | row dense | column dense  }</code></pre>    <p>注意 <strong>dense</strong> 可能使你的项目次序颠倒。</p>    <p>示例:</p>    <p>考虑以下 html:</p>    <pre>  <code class="language-css"><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></code></pre>    <p>你定义了一个两行五列的栅格,并设置它的属性为 row (默认属性便是 row )。</p>    <pre>  <code class="language-css">.container{      display: grid;      grid-template-columns: 60px 60px 60px 60px 60px;      grid-template-rows: 30px 30px;      grid-auto-flow: row;  }</code></pre>    <p>当我们把项目放置在栅格中的时候,明确指定以下两个项目的位置</p>    <pre>  <code class="language-css">.item-a{      grid-column: 1;      grid-row: 1 / 3;  }  .item-e{      grid-column: 5;      grid-row: 1 / 3;  }</code></pre>    <p>因为我们设置了属性为 row ,呈现在我们眼前的栅格便是如下这个样子。注意,这三个项目( <strong>item-b</strong> , <strong>item-c</strong> 与 <strong>item-d</strong> )并没有特意指定位置。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/33ca13fa9b13fe6e90775341f1af66cd.png"></p>    <p>如果设置的属性为 column ,item-b <strong>,</strong> item-c <strong>与</strong> item-d** 将按列以此排序。</p>    <pre>  <code class="language-css">.container{      display: grid;      grid-template-columns: 60px 60px 60px 60px 60px;      grid-template-rows: 30px 30px;      grid-auto-flow: column;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/6ba83fa5ef72dd33a5b6018d146996ed.png"></p>    <h3>grid</h3>    <p>以下属性的缩写:, grid-template-columns ,,, ,与 [ grid-auto-flow ](#prop-grid-auto-flow) 。它也可以设置和为默认值,即使并没有在 grid 中明确设置。</p>    <p>属性值:</p>    <ul>     <li> <p>none设置所有子属性的值为初始值。</p> </li>     <li> <p><grid-template-rows> / <grid-template-columns>仅仅设置这两个属性值,其它子属性值为初始值。</p> </li>     <li> <p><grid-auto-flow> [<grid-auto-rows> [ / <grid-auto-columns>] ]如果属性值确实,则采用的值。如果属性值均缺失,则采用默认值。</p> </li>    </ul>    <pre>  <code class="language-css">.container{      grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]];  }</code></pre>    <p>以下两种写法是等价的:</p>    <pre>  <code class="language-css">.container{      grid: 200px auto / 1fr auto 1fr;  }</code></pre>    <pre>  <code class="language-css">.container{      grid-template-rows: 200px auto;      grid-template-columns: 1fr auto 1fr;      grid-template-areas: none;  }</code></pre>    <p>以下两种写法也是等价的:</p>    <pre>  <code class="language-css">.container{      grid: column 1fr / auto;  }</code></pre>    <pre>  <code class="language-css">.container{      grid-auto-flow: column;      grid-auto-rows: 1fr;      grid-auto-columns: auto;  }</code></pre>    <p>另外你可以设置更为复杂但相当方便的语法一次性设置所有属性。你可以指定,与,其他子属性将被设为默认值。你需要指定栅格线与轨迹大小,这很容易用一个例子表示:</p>    <pre>  <code class="language-css">.container{      grid: [row1-start] "header header header" 1fr [row1-end]            [row2-start] "footer footer footer" 25px [row2-end]            / auto 50px auto;  }</code></pre>    <p>与以下写法是等价的:</p>    <pre>  <code class="language-css">.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;      }</code></pre>    <h3>栅格项目属性 (Grid Items)</h3>    <h3> </h3>    <p>grid-column-start</p>    <p>grid-column-end</p>    <p>grid-row-start</p>    <p>grid-row-end</p>    <p>通过指定栅格线来确定栅格项目的位置。 grid-column-start / grid-row-start 代表项目开始的线, grid-column-end / grid-row-end 代表项目结束的线。</p>    <p>属性值:</p>    <ul>     <li> <p><Line>可以是一个表示栅格线名字或数字。</p> </li>     <li> <p>span <number>项目将横跨指定数量栅格轨迹</p> </li>     <li> <p>span <name>项目将横跨至指定名字的栅格线</p> </li>     <li> <p>auto自动放置,自动跨越轨迹或者默认跨越轨迹</p> </li>    </ul>    <pre>  <code class="language-css">.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  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.item-a{    grid-column-start: 2;    grid-column-end: five;    grid-row-start: row1-start    grid-row-end: 3  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/f214f6de5d12816c380bc895ed76d140.png"></p>    <pre>  <code class="language-css">.item-b{    grid-column-start: 1;    grid-column-end: span col4-start;    grid-row-start: 2    grid-row-end: span 2  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/89a21202fa0b27a8ae7a2255f310e294.png"></p>    <p>如果没有指定 grid-column-end/grid-row-end,项目默认横跨一个轨迹。</p>    <p>项目可能会互相重叠,你可以使用 z-index 控制它们的层叠顺序(stacking order)。</p>    <h3> </h3>    <p>grid-column</p>    <p>grid-row</p>    <p>属性值:</p>    <ul>     <li> <p><start-line> / <end-line>接收 grid-column-start 同样的属性值,包括 span</p> </li>    </ul>    <pre>  <code class="language-css">.item{    grid-column: <start-line> / <end-line> | <start-line> / span <value>;    grid-row: <start-line> / <end-line> | <start-line> / span <value>;  }</code></pre>    <p>Example:</p>    <pre>  <code class="language-css">.item-c{    grid-column: 3 / span 2;    grid-row: third-line / 4;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/e26aead394593f5519b905bca4b1148b.png"></p>    <p>如果没有指定 end line,项目将默认跨越一个轨迹。</p>    <h3>grid-area</h3>    <p>当创建栅格容器使用属性时,可以通过制定区域名字确定栅格项目的位置。同样,它也可以作为以下属性的缩写:+++。</p>    <p>属性值:</p>    <ul>     <li> <p><name></p> </li>     <li> <p><row-start> / <column-start> / <row-end> / <column-end></p> </li>    </ul>    <pre>  <code class="language-css">.item{    grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;  }</code></pre>    <p>示例:</p>    <p>你可以给项目设置名字:</p>    <pre>  <code class="language-css">.item-d{    grid-area: header  }</code></pre>    <pre>  <code class="language-css">.item-d{    grid-area: 1 / col4-start / last-line / 6  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/64b7cebdcaddebe3320088bf79b92a81.png"></p>    <h3>justify-self</h3>    <p>使栅格项目中的内容与 <em>列</em> 轴对齐(相应地,与 <em>行</em> 轴对齐)。本属性值适用于单个项目的内容。</p>    <p>属性值:</p>    <ul>     <li> <p>start使内容与栅格区域左侧对齐</p> </li>     <li> <p>end使内容与栅格区域右侧对齐</p> </li>     <li> <p>center使内容在栅格区域中居中</p> </li>     <li> <p>stretch使内容充满整个栅格区域的宽(默认属性)</p> </li>    </ul>    <pre>  <code class="language-css">.item{    justify-self: start | end | center | stretch;  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.item-a{    justify-self: start;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/fb2d34eac096a95f6300d932773f2c08.png"></p>    <pre>  <code class="language-css">.item-a{    justify-self: end;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7e00849bbb01f2f4ea312d78fed56440.png"></p>    <pre>  <code class="language-css">.item-a{    justify-self: center;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/7a9f4ad63ca2ef564834e8340ab9368d.png"></p>    <pre>  <code class="language-css">.item-a{    justify-self: stretch;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/64b7cebdcaddebe3320088bf79b92a81.png"></p>    <p>为了对栅格项目中的 <strong>所有</strong> 项目设置对齐,可以是指栅格容器的属性。</p>    <h3>align-self</h3>    <p>使栅格项目中的内容与 <em>行</em> 轴对齐(相应地,与 <em>列</em> 轴对齐)。本属性值适用于单个项目的内容。</p>    <p>属性值:</p>    <ul>     <li> <p>start使内容与栅格区域顶部对齐</p> </li>     <li> <p>end使内容与栅格区域底部对齐</p> </li>     <li> <p>center使内容在栅格区域中居中</p> </li>     <li> <p>stretch使内容充满整个栅格区域的高(默认属性)</p> </li>    </ul>    <pre>  <code class="language-css">.item{    align-self: start | end | center | stretch;  }</code></pre>    <p>示例:</p>    <pre>  <code class="language-css">.item-a{    align-self: start;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/6c8000b01f1b1806e925fe2b38cdc64c.png"></p>    <pre>  <code class="language-css">.item-a{    align-self: end;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/d6c1497a1e97ecb118cd64f0b2deb045.png"></p>    <pre>  <code class="language-css">.item-a{    align-self: center;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/59a2b7c00ad87bbf53ecc6a3bd5480c4.png"></p>    <pre>  <code class="language-css">.item-a{    align-self: stretch;  }</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/4dbebc0df8f4dc9039725749fc3d20f6.png"></p>    <p>为了对栅格项目中的 <strong>所有</strong> 项目设置对齐,可以设置栅格容器的属性。</p>    <p> </p>    <p>来自:https://segmentfault.com/a/1190000008299555</p>    <p> </p>