原文地址: https://css-tricks.com/snippets/css/complete-guide-grid/css
CSS网格布局是一个二维的基于网格的布局系统, 其目的在于彻底改变咱们设计基于网络的用户界面的方式。CSS一直用来布局咱们的网页, 可是他历来没有作过很好的工做, 最开始咱们使用表格,而后float
, position
和inline-block
。可是这些本质上是css的hack, 而且遗漏了不少重要的功能(例如垂直居中),后来flexbox出现了, 可是他的目的只是为了更简单的一维布局, 而不是复杂的二维布局。网格是第一个专门为解决布局问题而建立的CSS模块 在浏览器兼容性方面,能够看一下caniuse的数据算法
在元素中应用display: grid
。这是全部网格布局的直接父元素, 在这个例子中container
是网格容器浏览器
<div class="container">
<div class="item item-1"></div>
<div class="item item-2"></div>
<div class="item item-3"></div>
</div>
复制代码
网格容器的小孩(例如直接子元素),这里的item
元素是网格项目,但sub-item
不是bash
<div class="container">
<div class="item"></div>
<div class="item">
<div class="sub-item"></div>
</div>
<div class="item"></div>
</div>
复制代码
构成网格结构的分界线, 他们既能够是垂直的(列)也能够是水平的(行)。这里的黄线是一个列网格线的例子网络
两个相邻网格线之间的空间。你能够把它们想象成网格的列或行。这是第二行和第三行网格线之间的网格轨道ide
两个相邻的行和两个相邻的列网格线之间的空间,也就是网格中的一个单元,这是行网格线1和2之间的网格单元, 以及列网格线2和3布局
四个网格线包围的总空间,网格空间能够由任意数量的网格单元组成。这里是行网格线1和3之间的网格空间, 以及列网格线1和3flex
将元素定义为网格容器, 并未其内容创建新的网格格式上下文 值:ui
.container{
display: grid | inline-grid | subgrid
}
复制代码
使用空格分隔的值列表来定义网格的列和行。这些值表示轨道大小,他们之间的空间表示网格线 值:flexbox
.container{
display: grid;
grid-template-columns: 40px 50px auto 50px;
grid-template-rows: 25% 100px auto;
}
复制代码
可是你能够选择明确命名行,请注意行名称的括号语法
.container{
grid-template-columns: [first] 40px [line2] 50px [line2] auto [line3] auto [col4-start] 50px [five] 5px;
grid-template-rows: [row1-start] 25% [row1-end] 100px [thrid-line] auto [last-line];
}
复制代码
请注意,一行/列能够有多个名字,例如这里第二列将有两个名字
.contaienr{
grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end]
}
复制代码
若是您的定义包含重复的部分,您可使用repeat()符号来简化
.container{
grid-template-columns: repeat(3, 20px [col-start]) 5%;
}
复制代码
至关于这个
.container{
grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;
}
复制代码
设置单位为fr
网格会容许您设置的网格轨道大小为网格容器的自由空间的一小部分,例如,这会将每一个项目设置为容器宽度的三分之一
.container {
grid-template-columns: 1fr 1fr 1fr;
}
复制代码
可用空间是在任何非弹性项目以后计算的,在这个例子中,fr
单元可用空间的总量不包括50px
.container{
grid-template-columns: 1fr 50px 1fr 1fr;
}
复制代码
经过应用grid-area
属性指定网格空间的名称来定义网格模板。 值:
grid-area
.container{
grid-template-areas: "<grid-area-name> | . | none | ...";
}
复制代码
例子
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: auto;
grid-template-areas:
"header header header header"
"main main . slidebar"
"footer footer footer footer"
}
.item-a{
grid-area: header;
}
.item-b{
grid-area: main;
}
.item-c{
grid-area: slidebar;
}
.item-d{
grid-area: footer;
}
复制代码
注意: 你不是用这个语法命名行只是空间, 当你使用这种语法时, 空间两端的行其实是自动命名的,若是你的网格空间名字是foo,那么这个空间的起始行和起始列的名字就是foo-start,最后一列和最后一行就是foo-end;
一个简短设置grid-template-rows
, grid-template-columns
和grid-template-areas
在一块儿的声明
.container {
grid-template: none | subgrid | <grid-template-rows> <grid-area-name>/ <grid-template-columns>;
}
复制代码
因为grid-template
不会重置隐式网格属性(grid-auto-columns
, grid-auto-rows
, grid-auto-flow
),这多是您在大多数状况下所要作的,因此建议使用grid
属而不是grid-template
。
指定网格线的大小 值:
.container{
grid-column-gap: <line-size>;
grid-row-gap: <line-size>;
}
复制代码
.container{
display: grid;
grid-template-columns: repeat(4, 50px);
grid-template-rows: repeat(4, 80px);
grid-column-gap: 10px;
grid-row-gap: 15px;
}
复制代码
一种速记grid-row-gap
和grid-column-gap
值:
.container {
grid-gap: <grid-row-gap><grid-column-gap>
}
复制代码
沿着行轴对齐网格内的内容(而不是align-items
沿着列轴对齐),适用于全部网格容器内的网格项目 值:
.container{
justify-items: start | end | center | stretch
}
复制代码
例子
.container{
justify-items: start;
}
复制代码
.container{
justify-items: end;
}
复制代码
.container{
justify-items: center;
}
复制代码
.container{
justify-items: stretch;
}
复制代码
此行为也能够经过justify-self
在个别网格项目上设置
沿列轴对齐网格的内容(而不是justify-items
沿着行轴对齐)。该值适用于容器内的全部网格项目 值:
.container {
align-items: start | end | center | stretch;
}
复制代码
例子
.container {
align-items: start;
}
复制代码
.container {
align-items: end;
}
复制代码
.container {
align-items: center;
}
复制代码
.container {
align-items: stretch;
}
复制代码
align-self
属性在个别网格项目上设置
有时,网格的总大小可能小于其网格容器的大小, 若是您的全部网格项目都是用非灵活单位进行大小调整,就可能发生这种状况。这时候能够设置网格容器内的网格的对齐方式,此属性沿着行轴对齐网络 值:
.container{
justify-content: start;
}
复制代码
.container{
justify-content: end;
}
复制代码
.container{
justify-content: center;
}
复制代码
.container{
justify-content: stretch
}
复制代码
.container{
justify-content: space-around;
}
复制代码
.container{
justify-content: space-between;
}
复制代码
.container{
justify-content: space-evenly;
}
复制代码
此属性和justify-content
同样,只不过是沿着列轴对齐网格 值:
.container{
align-content: start;
}
复制代码
.container{
align-content: end
}
复制代码
.container{
align-content: center;
}
复制代码
.container{
align-content: stretch;
}
复制代码
.container{
align-content: space-around;
}
复制代码
.container{
align-content: space-between;
}
复制代码
.container{
align-content: space-evenly;
}
复制代码
指定任何自动生成的网格轨道的大小,当你明确声明超出定义的网格空间的行或列(经过grid-template-rows / grid-template-columns)时间,会建立隐式网格轨道 值:
fr
单位) 如何建立隐式网格轨道, 例子:.contaienr{
display: grid;
grid-template-columns: repeat(2, 60px);
grid-template-rows: repeat(2, 90px);
}
复制代码
这样会建立一个2 X 2的网格
但如今若是你使用grid-column
和grid-row
定位你的网格项目是这样的
.item-a {
grid-column: 1 / 2;
grid-row: 2 / 3;
}
.item-b {
grid-column: 5 / 6;
grid-row: 2 / 3;
}
复制代码
咱们告诉item-b
从第5行开始, 到第6行结束, 可是咱们没有定义第5行或第6行, 由于咱们引用了不存在的行,因此建立了宽度为0的隐式轨道来填补空白,咱们可使用grid-auto-columns
和grid-auto-rows
来指定这些隐式轨道的宽度
.container{
grid-auto-columns: 60px;
}
复制代码
若是您没有明确放置在网格上的网格项目,则自动分配算法会自动分配这些项目。该属性控制自动分配算法的原理 值:
<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>
复制代码
你定义了一个五行两列的网格,并设置grid-auto-flow
为row
.container{
display: grid;
grid-template-columns: repeat(5, 60px);
grid-template-rows: repeat(2, 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
设置为column
简写为全部设置下列属性的单一声明: grid-template-rows
,grid-template-columns
, grid-template-areas
, grid-auto-rows
, grid-auto-columns
和grid-flow
。
经过引用特定的网格线来肯定网格内项目的位置。 值:
.item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start
grid-row-end: 3
}
复制代码
.item-b {
grid-column-start: 1;
grid-column-end: span col4-start;
grid-row-start: 2
grid-row-end: span 2
}
复制代码
若是没有grid-column-end
/grid-row-end
声明, 该项目将默认跨越一个项目,项目能够相互重叠,您可使用z-index
来控制堆叠顺序
简写为grid-column-start
+grid-column-end
和grid-row-start
+grid-row-end
值:
.item-c {
grid-column: 3 / span 2;
grid-row: third-line / 4;
}
复制代码
为项目提供一个名称,以即可以经过使用grid-template-areas
属性建立的模板来引用他。或者属性能够用做grid-row-start
+grid-column-start
+grid-row-end
+grid-column-end
值:
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <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
}
复制代码
沿着行轴对齐网格的内容,此属性适用与单个网格项目的内容 值:
.item {
justify-self: start | end | center | stretch;
}
复制代码
例子:
.item-a {
justify-self: start;
}
复制代码
.item-a {
justify-self: end;
}
复制代码
.item-a {
justify-self: center;
}
复制代码
.item-a {
justify-self: stretch;
}
复制代码
沿列轴对齐网格内的内容,此值适用与单个网格项目内的内容 值
.item {
align-self: start | end | center | stretch;
}
复制代码
例子:
.item-a {
align-self: start;
}
复制代码
.item-a {
align-self: end;
}
复制代码
.item-a {
align-self: center;
}
复制代码
.item-a {
align-self: stretch;
}
复制代码