Grid布局详解

在讲解Grid布局之前,我们常见布局方式有以下几种
1、normal flow (正常流,也叫文档流)--内联元素从左往右排列,块级元素从上往下排列。
2、float+clear(浮动+清除)
3、position relative+absolute(绝对定位)
4、display inline-block (行向布局)
5、负margin
6、display:flex

Grid布局优点:这是一个二维布局系统,最大优点就是可以同时处理列和行,不像其他布局那样,主要是一维布局系统。Grid布局目前在很多浏览器都可以支持了,详细兼容情况去Caniuse查看。

基本概念

由行和列组合包围的网格线叫grid item,由最外围的行和列的边框叫grid container。红色的123构成的是行分界线(row grid lines)、黑色的1234构成的是列分界线(column grid lines)

1、grid container的属性:

(1)、grid-template-columns 设置列
(2)、grid-template-rows 设置行
(3)、grid-template-areas 定位空间
(4)、grid-template (1)和(2)和(3)组合使用缩写
(5)、grid-column-gap 设置列间隙
(6)、grid-row-gap 设置行间隙
(7)、grid-gap (5)和(6)组合使用缩写
(8)、justify-items 设置水平对齐内容位置
(9)、align-items 设置垂直对齐内容位置
(10)、justify-content
(11)、align-content
(12)、grid-auto-columns 创建隐式网格(不讲,用的不多)
(13)、grid-auto-rows 创建隐式网格(不讲,用的不多)
(14)、grid-auto-flow 自动布局(不讲,用的不多)
(15)、grid

(1)利用grid-template-columns、grid-template-rows构建网格

HTML

 <div class="container"></div>

CSS

.container{
  width:400px;
  height:300px;
  border:1px solid red;

  display:grid;      /*grid布局*/
  grid-template-columns:10% auto 10%;  /*设置列*/
  grid-template-rows:50px auto 50px;   /*设置行*/
}
为了表示方便这图中虚线都是虚构出来方便理解,实际不存在的

【1】、grid-template-columns:10% auto 10% 表示设置三列,第一列是父元素宽度10%,第二列是自动适应宽度,第三列是父元素宽度10%;另外一种写法:grid-template-columns:[colunms-1] 10% [colunms-2] auto [colunms-3] 10% 表示对每列起个名字,配合行方便后面放内容(名字随意)、后面介绍更简单方法直接用数字表示。

【2】、grid-template-rows:50px auto 50px 表示设置三行,第一行高度是50px,第二行高度是自适应高度,第三行高度是50px;另外一种写法:grid-template-rows:[row-1] 50px [row-2] auto [row-3] 50px表示对每行起个名字,配合列方便后面放内容(名字随意)、后面介绍更简单方法直接用数字表示。

【3】、“fr”单位允许您将轨道大小设置为网格容器自由空间的一部分。 例如,下面的代码会将每个 grid item 为 grid container 宽度的三分之一:

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

自由空间是在排除所有不可伸缩的 grid item 之后计算得到的。 在下面的示例中,fr单位可用的自由空间总量不包括50px:

.container {
  grid-template-columns: 1fr 50px 1fr 1fr;
}
(2)、grid-template-areas 定位空间

通过引用 grid-area属性中名字和grid-template-areas名字匹配,从而为这些网格分配内容和位置。 点号表示一个空单元格。
HTML

<div class="container">
   <div class="header">header</div>
   <div class="main">main</div>
   <div class="aside">aside</div>
   <div class="footer">footer</div>
 </div>

CSS

.container{
  width:400px;
  height:300px;
  border:1px solid red;
  display:grid;
  grid-template-columns:10% auto 10%;
  grid-template-rows:50px auto 50px;

  grid-template-areas:
    "header header header"
    ".      main   aside"     /*点号表示该单个元为空*/
    "footer footer footer"
}
.header{ 
  grid-area:header;   /*header和grid-template-areas中header名字匹配*/
  background:red;
}
.main{ grid-area:main;background:blue;}
.aside{ grid-area:aside;background:yellow;}
.footer{ grid-area:footer;background:grey;}
3.png

【1】、grid-template是grid-template-rows、grid-template-columns、grid-template-areas 三个组合一起的缩写。

 .container{
    grid-template:
     "header header header" 50px
     ".      main   aside" auto
     "footer footer footer" 50px
     /10% auto 10%
}

等价于

.container{
   grid-template-columns:10% auto 10%;
   grid-template-rows:50px auto 50px;
   grid-template-areas:
    "header header header"
    ".      main   aside"
    "footer footer footer" 
}
(3)、grid-column-gap和grid-row-gap设置网格行和列的间隙
.container{
  /*省略部分代码*/
  grid-column-gap:10px;
  grid-row-gap:10px;
}
4.png

注意:这里间隙可以用padding或者margin进行设置

【1】、grid-gap是grid-column-gap和grid-row-gap的缩写用法

.container {
  /*省略部分代码*/
  grid-gap: 10px 10px;  /*第一个是row,第二个是column*/
}
(4)、justify-items

沿着行轴对齐网格内的内容(与之对应的是 align-items, 即沿着列轴对齐),该值适用于容器内的所有的 grid items。

值:
start: 内容与网格区域的左端对齐
end: 内容与网格区域的右端对齐
center: 内容位于网格区域的中间位置
stretch: 内容宽度占据整个网格区域空间(这是默认值)

举值为center例子,其他值情况可以自己测试一下

.container {
   /*省略部分代码*/
  justify-items: center;
}
值为center时

给单个 grid item 设置justify-items属性(嵌套使用grid布局)

.container {
   /*省略部分代码*/
}
.header{
  grid-area:header;
  background:red;
  display:grid;
  justify-items:center;
}
在单个item中使用该属性
(5)、align-items

沿着列轴对齐grid item 里的内容(与之对应的是使用 justify-items 设置沿着行轴对齐),该值适用于容器内的所有 grid items。

值:

start: 内容与网格区域的顶端对齐
end: 内容与网格区域的底部对齐
center: 内容位于网格区域的垂直中心位置
stretch: 内容高度占据整个网格区域空间(这是默认值)

举值为center例子,其他值情况可以自己测试一下

.container {
   /*省略部分代码*/
 align-items:center;
}
值为center时

给单个 grid item 设置 align-items属性(嵌套使用grid布局)

.container {
   /*省略部分代码*/
}
.header{
  grid-area:header;
  background:red;
  display:grid;
  align-items:center;
}
在单个item中使用该属性
(6)、justify-content(水平方向)、align-content(垂直方向)

有时,网格的总大小可能小于其网格容器的大小。如果你的所有 grid items 都使用像px这样的非弹性单位来设置大小,则可能发生这种情况。

值:
start - 网格与网格容器的左边对齐
end - 网格与网格容器的右边对齐
center - 网格与网格容器的中间对齐
stretch - 调整g rid item 的大小,让宽度填充整个网格容器
space-around - 在 grid item 之间设置均等宽度的空白间隙,其外边缘间隙大小为中间空白间隙宽度的一半
space-between - 在 grid item 之间设置均等宽度空白间隙,其外边缘无间隙
space-evenly - 在每个 grid item 之间设置均等宽度的空白间隙,包括外边缘

例如按照之前例子:

.container {
   /*省略部分代码*/
   grid-template:
       "header header header" 50px
        ".      main   aside" auto
        "footer footer footer" 50px
      /10% 200px 10%;   /*这里将之前auto改成200px*/
}
整体没有填充满容器

当justify-content值为center时,其他值自己测试。


值为center时
(7)grid用法

grid是其他以grid开头的所有集合缩写,用法和grid-template差不多
例如

.container {
   /*省略部分代码*/
   grid-template:
       "header header header" 50px
        ".      main   aside" auto
        "footer footer footer" 50px
      /10% auto 10%; 
}

改成grid

.container {
   /*省略部分代码*/
   grid:
       "header header header" 50px
        ".      main   aside" auto
        "footer footer footer" 50px
      /10% auto 10%;   
}

其他写法

.container {
   grid:50px auto 50px/10% auto 10%;   /*column/row*/
}
2、grid items的属性:

grid-column-start / grid-column-end / grid-row-start /grid-row-end使用特定的网格线确定 grid item 在网格内的位置。grid-column-start/grid-row-start 属性表示grid item的网格线的起始位置,grid-column-end/grid-row-end属性表示网格项的网格线的终止位置。

值:
<line>: 可以是一个数字来指代相应编号的网格线,也可使用名称指代相应命名的网格线
span <number>: 网格项将跨越指定数量的网格轨道
span <name>: 网格项将跨越一些轨道,直到碰到指定命名的网格线
auto: 自动布局, 或者自动跨越, 或者跨越一个默认的轨道

举例子:

(1)用每个行和列的名字进行定位(名字需要自己进行定义)

.item-1 {
   grid-column-start: line-2;
   grid-column-end: line-4;
   grid-row-start: row-3;
   grid-row-end: row-4;
}

(2)每个行和列数字进行定位

.item-1 {
   grid-column-start: 2;
   grid-column-end: 4;
   grid-row-start: 3;
   grid-row-end:4;
}
这种方法可以简写成这种形式(建议以后用这种方法使用)
.item-1 {
  grid-column: 2 / 4;   /*  grid-column: 2 / span 2 */
  grid-row: 3 / 4;
}

说明:grid-column / grid-row是grid-column-start + grid-column-end, 和 grid-row-start + grid-row-end 的简写形式。

注意这里 grid-column: 2 / 4可以改成grid-column: 2 / span 2 这里的意思是span表示从2开始往后跨度为2

(1)和(2)实现效果一样
总结:给 grid item 进行定位可以使用grid-template-areas+grid-area创建。另外也可以使用grid-column +grid-row进行定位。
3、总结girdle布局

前面说了一堆特性和用法,都是帮助你理解grid布局,最后这个例子你记住怎么用就行,就学会grid布局了。同时grid布局里面可以嵌套grid布局,或者flex布局完成其他一些细节功能。

HTML

<div class="container">
    <div class="header">header</div>
    <div class="main">main</div>
    <div class="aside">aside</div>
    <div class="footer">footer</div>
</div>

CSS

.container{
  width:400px;
  height:300px;
  border:1px solid red;
  display:grid;
  grid:50px auto 50px/10% auto 10%
}
.header{
  grid-column:1/4;
  grid-row:1/2;
  background:red;
}
.main{
  grid-column:2/3;
  grid-row:2/3;
  background:blue;
}
.aside{
  grid-column:3/4;
  grid-row:2/3;
  background:yellow;
}
.footer{
  grid-column:1/4;
  grid-row:3/4;
  background:grey;
}
3.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342

推荐阅读更多精彩内容