grid网格布局

本文介绍了CSSGrid布局的概念,与Flex布局的区别,并详细阐述了Grid布局中容器的属性,包括grid-template-columns和grid-template-rows的使用,如绝对单位、相对单位、fr关键字、auto-fill和minmax()函数。同时,还讲解了justify-items、align-items等对单元格内容排列的控制,以及如何用Grid实现三列布局的方法。
摘要由CSDN通过智能技术生成

一.概念

grid布局意为网格布局,它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局,grid布局的功能非常的强大,对浏览器的兼容性有一定的要求。

二.与flex布局的区别

flex布局意为弹性盒布局,用来为盒装模型提供最大的灵活性。只是轴线上的布局,可以看做是一维布局。

grid网格布局,通过对不同网格的组合,可以做出各种各样的布局。可以看做是二维布局。功能比flex布局强大。

三.容器的属性

grid-template-columns:定义每一列的属性。

grid-template-rows:定义每一行的属性。

(1)使用绝对单位

/* 定义了一个三行三列的网格,每一行每一列的长度都为100px */
.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
}

(2)使用相对单位

.container {
  display: grid;
  grid-template-columns: 33.33% 33.33% 33.33%;
  grid-template-rows: 33.33% 33.33% 33.33%;
}
/* 对于同样的值可以用repeat()简写,接收两个参数,第一个参数是重复的次数,第二个参数是重复的值。*/
.container {
  display: grid;
  grid-template-columns: repeat(3, 33.33%);
  grid-template-rows: repeat(3, 33.33%);  /* 重复某种模式:repeat(2, 100px 20px 80px); */
}

(3)auto-fill 关键字:有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。

/* 每列宽度100px,然后自动填充,直到容器不能放置更多的列。*/
.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 100px);
}

(4)fr 关键字:为了方便表示比例关系,网格布局提供了fr关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为1fr和2fr,就表示后者是前者的两倍。可以和绝对单位、相对单位一起使用。

/* 表示两个相同宽度的列。 */
.container {
  display: grid;
  grid-template-columns: 1fr 1fr;
}
/* 表示,第一列的宽度为150像素,第二列的宽度是第三列的一半。*/
.container {
  display: grid;
  grid-template-columns: 150px 1fr 2fr;
}

(5)minmax():minmax()函数产生一个长度范围,表示长度就在这个范围之中。它接受两个参数,分别为最小值和最大值。

/* minmax(100px, 1fr)表示列宽不小于100px,不大于1fr。*/
.container {
  display: grid;
  grid-template-columns: 1fr 1fr minmax(100px, 1fr);
}

(6)auto:关键字表示由浏览器自己决定长度。

/* 表示第一列和第三列宽度为100px,中间的宽度自适应*/
.container {
  display: grid;
  grid-template-columns: 100px auto 100px;
}
  1. grid-row-gap:设置行与行的间隔(行间距)

  1. grid-column-gap:设置列与列的间隔(列间距)

  1. grid-gap:是grid-column-gap和grid-row-gap的合并简写形式。如果只写一个值默认两个值一样

/* 行间距为20px,列间距为20px */
.container {
  grid-row-gap: 20px;
  grid-column-gap: 20px;
}
/* 等价于 */
.container {
  grid-gap: 20px 20px;
}

4.justify-items:设置单元格内容的水平排列情况,可以取4个值

start:对齐单元格的起始边缘。

end:对齐单元格的结束边缘。

center:单元格内部居中。

stretch:拉伸,占满单元格的整个宽度(默认值)

5.align-items:设置单元格内容的垂直排列情况,可以取4个值

start:对齐单元格的起始边缘。

end:对齐单元格的结束边缘。

center:单元格内部居中。

stretch:拉伸,占满单元格的整个宽度(默认值)

/* 单元格的内容左对齐,效果如下图。*/
.container {
  justify-items: start;
}
/* 单元格的内容头对齐,效果如下图。*/
.container {
  align-items: start;
}

6.place-items:是align-items属性和justify-items属性的合并简写形式,如果只写一个值表示两个值一样。例如:place-items: start end;

7.justify-content:是整个内容区域在容器里面的水平位置(左中右),可以取7个值。

start:对齐容器的起始边缘。

end:对齐容器的结束边缘。

center:容器内部居中。

stretch:拉伸,项目大小没有指定时,拉伸占据整个网格容器。(默认)

space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍

space-between:项目与项目的间隔相等,项目与容器边框之间没有间隔。

space-evenly:项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔。

对应的如图所示:

8.align-content:是整个内容区域在容器里面的垂直位置(上中下)。可以取7个值,和justify-content一模一样。

9.place-content:是align-content属性和justify-content属性的合并简写形式。例如:place-content: space-around space-evenly;

四.项目的属性

1.(1)grid-column-start:左边框所在的垂直网格线,还可以用span表示跨越几个网格线。例如:span 2表示跨越2个网格线。

(2)grid-column-end:右边框所在的垂直网格线

(3)grid-row-start:上边框所在的水平网格线

(4)grid-row-end:下边框所在的水平网格线

/* 表示1号项目的左边框在第一根网格线,右边框在第三根网格线,上边框在第二根网格线,下边框在第四根网格线。
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 2;
  grid-row-end: 4;
}

2.(1) grid-column:是grid-column-start和grid-column-end的合并简写形式。例如:grid-column: 1 / 3;

grid-row: 1 / 2。如果只写一个值表示默认跨越一个网格。

(2)grid-row:是grid-row-start和grid-row-end的合并简写形式。

(3)grid-area:是grid-column-start、grid-column-end、grid-row-start、grid-row-end这四个的合并简写形式。例如:grid-area: 1 / 1 / 3 / 3;

3. (1) justify-self:设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。

* start:对齐单元格的起始边缘。

* end:对齐单元格的结束边缘。

* center:单元格内部居中。

* stretch:拉伸,占满单元格的整个宽度(默认值)

(2)align-self:设置单元格内容的垂直位置(左中右),跟align-items属性的用法完全一致,但只作用于单个项目。

(3)place-self:是align-self属性和justify-self属性的合并简写形式。例如:place-self: center center;如果只有一个值,则默认为两个值相同。

五.实现三列布局(中间自适应,两端固定宽度)

  1. 方法一:flex布局(关键步骤在于给中间部分设置flex:1)

<style>
  .box{
       display:flex;
   }
   .center{
       flex:1;
       background-color: pink; 
   }
  .left{
       width:200px;
       height:400px;
       background-color: plum; 
       order:-1 
   }
   .right{
       width:200px;
       height:400px;
       background-color: plum;  
   }
</style>
<div class="box">
   <div class="center"></div>
   <div class='left'></div>
   <div class="right"></div>
</div>
2.方法二:grid布局(关键步骤在于设置grid-template-columns的auto属性值)
<style>
 .box{
      display:grid;
      grid-template-columns:200px auto 200px;
 }
 .center{
      background-color: pink;  
  }
  .left{
      height:400px;
      background-color: plum;
      order:-1 
  }
  .right{ 
      height:400px;
      background-color: plum;  
  }
</style>
<div class="box">
   <div class="center"></div>
   <div class='left'></div>
   <div class="right"></div>
</div>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值