CSS笔记之Grid网格系统

时间:2023-03-08 17:33:38

Grid布局已经不是新鲜的技术了,但一直都是使用了Flex布局,如今需要了边学习边做些常用的笔记。首先grid和flex一样都不支持IE10以下的浏览器

基本布局: 一般是所有子元素都横向排列或者都纵向排列, 当父容器设置了grid, 其子项的 clear, float , vertical-align是无效的。

  (1)横向

 <div class="container">
<div class="item item-1">item1</div>
<div class="item item-2">item2</div>
<div class="item item-3">item3</div>
</div>
 <style media="screen">
.container {
background: salmon;
height: 150px;
display: grid;
grid-template-rows: 50px;
/*grid-template-columns: 50px 50px auto;*/
grid-template-columns: 50px auto 100px;
}
.item-1 {background: darkcyan;}
.item-2 {background: khaki;}
.item-3 {background: darkblue;}
</style>

CSS笔记之Grid网格系统

如图:设置 grid-template-rows每项的height为50px; width则由grid-template-columns设置, 有三项则设置三个值,

如果将 columns设置如下 : 父容器右侧会被预留空间,宽度是除前三个值以外的所有值的累计, 直到auto的item2只剩下本身的宽度为止。(父容器被减去10+20+30=60px后剩下的空间留给现有元素)。

grid-template-columns: 50px auto 100px 10px 20px 30px;

CSS笔记之Grid网格系统

  (2)纵向

 .container {
background: salmon;
height: 280px;
display: grid;
grid-template-rows: 50px;
grid-template-columns: 80px;
}

CSS笔记之Grid网格系统

(1)rows和columns只给一个值的时候,因为item是div块元素,默认是垂直排列, 所以 rows的值50px只给了第一个网格项的height,其他项自动平分剩下的高度。

(2)父容器如果不设置height, 其总高度是第一个网格项固定的高度50px, 加上未设定高度的其他网格项的默认高度。

(3)如果纵向columns设置了多余的子项高度,原理和以上的横向rows一样

(3) 当然也可以对应的设置每个网格项高度  grid-template-rows: 50px auto 80px 30px;

CSS笔记之Grid网格系统

  (4)子项累计高度或累计宽度超过父容器时会溢出

CSS笔记之Grid网格系统

  (5) 当rows 和 columns都不只一个值时

  grid-template-rows: 50px 120px auto 100px;
grid-template-columns: 80px 40px;
 grid-template-rows: 50px 120px auto 100px;
grid-template-columns: 80px 40px 20px;

比较两种布局方式:子项按顺序先以columns设置的的值从左至右, 当只设置两个值时表示只有两列,第三子项会另起一行;当columns有三个值时表示三列, 后面的另起一行。总结: 先按照columns的值对应列数量和每列对应的width, 超过了另起一行

CSS笔记之Grid网格系统     CSS笔记之Grid网格系统

 其他属性

  (1)子项间距 (列和列之间横向间距:grid-column-gap; 行与行之间纵向间距:grid-row-gap)

 .container {
background: salmon;
height: 280px;
display: grid;
grid-template-rows: 50px 120px;
grid-template-columns: 80px 40px 20px;
grid-column-gap: 10px;
grid-row-gap: 20px;
}

CSS笔记之Grid网格系统

  (2)justify-item: start | end | center | stretch(默认)

  stretch默认 后面三个效果分别为start, center, end , 和flex很相似

 .container {
background: salmon;
display: grid;
grid-row-gap: 20px;
}

CSS笔记之Grid网格系统

CSS笔记之Grid网格系统  CSS笔记之Grid网格系统  CSS笔记之Grid网格系统

  (3)align-items: start | end | center | stretch(默认铺满)

      使用align-items需设置父容器高度,才能有效果

    stretch默认铺满, 子项的高度随父容器高度自适应。

CSS笔记之Grid网格系统

start | center | end   : 三种布局的子项如果不设置height则使用自身默认的,剩下的高度平均分配给每个子项的上下margin

CSS笔记之Grid网格系统  CSS笔记之Grid网格系统  CSS笔记之Grid网格系统

  (4)justify-content: stretch | start | center | end |  space-between | space-around | space-evenly  此时高度随父元素自适应,除非设置固定高度。

 .container {
background: salmon;
height: 220px;
display: grid;
justify-content: start;
}

单列时

stretch

CSS笔记之Grid网格系统

start, center ,end ,  space-between, space-around, space-evenly(和space-between一样)

CSS笔记之Grid网格系统  CSS笔记之Grid网格系统 CSS笔记之Grid网格系统 CSS笔记之Grid网格系统 CSS笔记之Grid网格系统

多列时 (最好columns都设置固定值才看得出效果):

 .container {
background: salmon;
height: 220px;
display: grid;
grid-template-rows: 50px 120px;
grid-template-columns: 80px 40px 20px;
justify-content: stretch;
}

stretch (start)   、 center  、 end  、 space-between(两个子项间距相等, 出去父容器边缘,与evenly有些相似),、space-around(剩下的空间平均分给子项的上下margin)、space-evenly (间距相等包括相对于父容器边缘)

CSS笔记之Grid网格系统  CSS笔记之Grid网格系统  CSS笔记之Grid网格系统  CSS笔记之Grid网格系统

CSS笔记之Grid网格系统  CSS笔记之Grid网格系统

  (5)align-content

  (6)grid-auto-columns

   (7)grid-auto-flow