Grid 布局是网站设计的基础,CSS Grid 是建立网格布局最强大和最简单的工具。css
轻松使用 Grid 布局提升开发效率,对复杂的网页结构布局更加灵活。html
Grid 将网页划分红一个个网格,能够任意组合不一样的网格,作出各类各样的布局。网格是一组相交的水平线和垂直线,它定义了网格的列和行。咱们能够将网格元素放置在与这些行和列相关的位置上。算法
咱们比较熟悉的好比说坐标轴,坐标点;若是你看到上面这样一个网格首先想到是这不就是被淘汰的表格吗,表格之因此被淘汰最主要在性能方面,然而咱们不得不认可表格对于整个网页的布局来讲有必定的便利性。那么如今的网格布局就能够把表格里面的一些较好的方便的东西抽出来,而后把性能方面较差的地方去掉,因此说网格布局会成为未来互联网企业的一个热潮是有缘由的。浏览器
固定的位置和弹性的轨道的大小
复制代码
你可使用固定的轨道尺寸建立网格,好比使用像素单位。你也可使用好比百分比或者专门为此目的建立的新单位 fr来建立有弹性尺寸的网格。bash
元素位置
复制代码
你可使用行号、行名或者标定一个网格区域来精肯定位元素。网格同时还使用一种算法来控制未给出明确网格位置的元素。ide
建立额外的轨道来包含元素
复制代码
可使用网格布局定义一个显式网格,可是根据规范它会处理你加在网格外面的内容,当必要时它会自动增长行和列,它会尽量多的容纳全部的列。函数
对齐控制
复制代码
网格包含对齐特色,以便咱们能够控制一旦放置到网格区域中的物体对齐,以及整个网格如何对齐。工具
控制重叠内容
复制代码
多个元素能够放置在网格单元格中,或者区域能够部分地彼此重叠。而后能够CSS中的z-index属性来控制重叠区域显示的优先级。布局
Grid 布局与 Flex布局有必定的类似性,均可以指定容器内部多个项目的位置。可是,它们也存在重大区别。Flex布局是轴线布局,只能指定"项目"针对轴线的位置,能够看做是一维布局。Grid布局则是将容器划分红"行"和"列",产生单元格,而后指定"项目所在"的单元格,能够看做是二维布局。Grid布局远比Flex布局强大。不是说Grid布局取代Flex布局,实际上他俩能够很好的配合使用。性能
元素应用display:grid;,它是其全部网格项的父元素。
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
复制代码
把 container 元素变成一个 grid(网格),只要把其 display 设置为 grid。
CSS代码:
.container {
display:grid;
}
复制代码
网格容器的子元素,下面的item元素是网格项。
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
复制代码
组成网格项的分界线。
两个相邻的网格线之间为网格轨道。
两个相邻的列网格线和两个相邻的行网格线组成的是网格单元。
4个网格线包围的总空间。
将元素定义为grid container,并为其内容创建新的网格格式化上下文(grid formatting context)。
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
</div>
复制代码
.container {
display:grid | inline-grid | subgrid;
}
复制代码
当元素设置了网格布局,column、float、clear、vertical-align属性无效。 display:subgrid;目前全部浏览器都不兼容。
使用以空格分隔的多个值来定义网格的列和行。
.container {
grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
}
复制代码
经过引用 grid-area 属性指定的 网格区域(Grid Area) 名称来定义网格模板。
.container {
grid-template-areas: none|
"grid-area-name|. grid-area-name|. grid-area-name|. ..."
"grid-area-name|. grid-area-name|. grid-area-name|. ..."
"......";
}
复制代码
例如:
.container {
grid-template-areas:
"head head head head"
"main main . sidebar"
"foot foot foot foot";
}
复制代码
以上例子强调如下几点:
第一:每一行都必定要用双引号括起来;
第二:每个值对应一个网格单元,千万不要上面写了4个,下面只写三个,这样的话就会出问题;
第三:每一个网格单元里的区域名称都以空格隔开;
第四:每一个引号后面是没有任何逗号或封号,仅仅是回车换行。
在单个声明中定义 grid-template-rows、grid-template-columns、grid-template-areas的简写。就我的而言,仍是不要简写,由于简写以后可读性会变差一些。
.container {
grid-template: none | subgrid | <grid-template-rows> / <grid-template-columns>;
}
复制代码
.container {
grid-template:
[row1-start] "head head head" 25px [row1-end]
[row2-start] "foot foot foot" 25px [row2-end]
/ auto 50px auto;
}
复制代码
等同于
.container {
grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
grid-template-columns: auto 50px auto;
grid-template-areas:
"head head head"
"foot foot foot";
}
复制代码
不建议简写,避免混淆。
指定网格线的大小,能够想象为设置列/行之间间距的宽度。也能够说是网格轨道之间的间距
.container {
grid-column-gap: <line-size>;
grid-row-gap: <line-size>;
}
复制代码
grid-row-gap 和 grid-column-gap 的缩写。
.container {
grid-gap: <grid-row-gap> <grid-column-gap>;
}
复制代码
起初是用 grid-gap 属性来定义的,目前逐渐被 gap 替代。 若是没有指定 grid-row-gap,则会被设置为与 grid-column-gap 相同的值。
沿着行轴对齐网格内的内容。
.container {
justify-items: start | end | center | stretch;
}
复制代码
沿着列轴对齐网格内的内容。
.container {
align-items: start | end | center | stretch;
}
复制代码
设置 justify-items 和 align-items 的简写形式。 注意:书写顺序为先列轴属性值后行轴属性值。
.container {
place-items: center;
}
复制代码
以上表示水平和垂直居中。
设置网格容器内的网格沿着行轴对齐网格的对齐方式。
.container {
justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
复制代码
设置网格容器内的网格沿着列轴对齐网格的对齐方式。
.container {
align-content: start | end | center | stretch | space-around | space-between | space-evenly;
}
复制代码
设置 align-content 和 justify-content 的简写形式。 注意:书写顺序为先列轴对齐属性值后行轴对齐属性值。
指定自动生成的网格轨道(又名隐式网格轨道)的大小。
隐式网格轨道在显示的定位超出指定网格范围的行或列时被建立。也就是说网格项超出,一种是太多了,还有一种分两种状况:若是说仅仅由于太多的话,咱们只须要控制行就能够了,列这一块的话确定是跟着上面是同样的。可是有时列也会超出,超出状况会在讲到网格项的地方提到过,当网格项肯定在网格单元或网格区域的时候是能够控制的,控制的时候除了网格区域的名字以外,它也能够经过地址条网格线来控制,可是这个线的名字若是是超过的时候就会出来,那么在这种状况下就会自动生成隐式网格轨道。
隐式网格轨道我的是不建议你们使用的,由于咱们的这个隐式网格咱们在容器当中通常来讲咱们在容器中统揽大局而后抠出局部,结果局部不禁大局控制反而影响大局,这就有点反客为主,喧宾夺主的意思了,那在控制起来势必会有混乱,因此隐式网格轨道不是特别提倡你们使用。
.container {
grid-auto-columns: <track-size> ...;
grid-auto-rows: <track-size> ...;
}
复制代码
控制自动布局算法的工做方式。
.container {
grid-auto-flow: row | column | row dense | column dense
}
复制代码
在单个属性中设置全部如下属性的简写: grid-template-rows, grid-template-columns, grid-template-areas, grid-auto-rows, grid-auto-columns, 和 grid-auto-flow 。
固然像左对齐、右对齐这些对齐方式等就不能简写在上面。就是说咱们能够把多少行多少列以及它的区域还有隐式轨道以及他的布局方式均可以简写到 grid 里面而且同时将 sets grid-column-gap 和 grid-row-gap设置为他们的初始值,即便它们不能被此属性显示设置。
.container {
grid: none | <grid-template-rows> / <grid-template-columns> | <grid-auto-flow> [<grid-auto-rows> [/ <grid-auto-columns>]];
}
复制代码
.container {
grid: [row1-start] "head head head" 1fr [row1-end]
[row2-start] "foot foot foot" 25px [row2-end]
/ auto 50px auto;
}
复制代码
等价于:
.container {
grid-template-areas:
"head head head"
"foot foot foot";
grid-template-rows: [row1-start] 1fr [row1-end row2-start] 25px [row2-end];
grid-template-columns: auto 50px auto;
}
复制代码
简写形式就简单的作一个介绍,实际开发当中不建议简写形式。
跟踪列表的重复片断,容许大量显示重复模式的列或行以更紧凑的形式编写。
.container {
grid-template-columns: repeat(repeat, values);
grid-template-rows: repeat(repeat, values);
}
复制代码
根据公式min(最大大小、最大值(最小大小、参数))将给定大小夹紧为可用大小。
.container {
grid-template-columns: fit-content([ <length> | <percentage> ]);
grid-template-rows: fit-content([ <length> | <percentage> ]);
}
复制代码
定义了一个长宽范围的闭区间。
minmax([ <length> | <percentage> | <flex> | min-content | max-content | auto ],
[ <length> | <percentage> | <flex> | min-content | max-content | auto ]);
复制代码
例如:
.container {
grid-template-columns: minmax(300px, 50px);
}
复制代码
minmax()这个函数前面‘300px’是最小值,后面‘50px’是最大值,也就是说范围是从小到大的。当最小值大于最大值时,最大值将被忽略,整列会成为最小值。
start / end :规定每个网格项在那个区域当中
grid-area:跟网格区域同样
self:自身里面的对齐方式
使用特定网格线来肯定 网格项(grid item)在网格内的位置。
.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
}
复制代码
若是没有声明 grid-column-end / grid-row-end,默认状况下,该网格项将跨越1个轨道。
网格项能够相互重叠。可使用 z-index 来控制它们的堆叠顺序。
grid-column-start + grid-column-end 和 grid-row-start + grid-row-end 的简写形式。
.item {
grid-column: <start-line> / <end-line> | <start-line> / span <value>;
grid-row: <start-line> / <end-line> | <start-line> / span <value>;
}
复制代码
我的建议:斜杠先后的空格千万不要省略,有时能够识别,有时不可识别,对于浏览器来讲小版本的话就会有差异。建议斜杠先后都要有空格。
start-line / end-line:每一个值的用法都和属性分开写时的用法同样
CSS代码以下:
.container > .item:nth-child(1) {
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 2;
grid-row-end: 4;
}
复制代码
等同于
.container > .item:nth-child(1) {
grid-column: 2 / 4;
grid-row: 2 / 4;
}
复制代码
等同于
.container > .item:nth-child(1) {
grid-column: 2 / span 2;
grid-row: 2 / span 2;
}
复制代码
给 gird item 进行命名以便于使用 grid-template-areas 属性建立模板时来进行引用。
.item {
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
复制代码
CSS代码以下:
.container > .item-a {
grid-area: row1-start / 2 / 3 / five;
}
复制代码
等同于
.container > .item-a {
grid-column-start: 2;
grid-column-end: five;
grid-row-start: row1-start;
grid-row-end: 3;
}
复制代码
CSS代码以下:
.container > .item-a {
grid-column: 2 / span 2;
grid-row: 2 / span 2;
}
复制代码
等同于
.container > .item-a {
grid-area: 2 / 2 / 4 / 4;
}
复制代码
沿着行轴对齐 grid-item 里的内容。
.item {
justify-self: start | end | center | stretch;
}
复制代码
沿着列轴对齐 grid-item 里的内容。
.item {
align-self: start | end | center | stretch;
}
复制代码
本篇文章到此结束,欢迎提建议哈!
参考文献: