深入学习CSS之Grid布局

275 阅读6分钟

Grid 布局

栅格系统 使用栅格系统存在兼容性问题,所以在根据项目的使用场景决定是否使用栅格布局

声明栅格系统的容器

display: grid

绘制栅格

这好吧在一个方框里画线,横横纵纵
grid-template-rows划横线
grid-template-columns划竖线

div{/**容器*/
width:300px;
height:100px;
display:grid;
grid-template-rows:50px 50px ;/*划分为两行,每行高度分别是50px 50px*/
grid-template-columns:70% 30%;/*划分为两列,每列宽度分别占70% 30%*/
}

对于每格宽高都一样的情况,可以简写
repeat
前提是容器内要放上相应数量的盒子

div{
width:500px;
height:300px;
display:grid;
grid-template-rows:repeat(2,100px 150px);
/*分为4行,每行高度分别是 100px 150px 100px 150px*/
grid-template-columns: repeat(5,20%);
/*分为5列,每列宽度占总宽度的20%*/
}

自动填充

auto-fill——写在repeat里的参数

div{
width:300px;
height:100px;
display:grid;
grid-template-rows:repeat(auto-fill, 100px);/*设定好每个宽100px,自动填充格数*/
grid-template-columns:repeat(auto-fill,100px);
}

感悟:自动填充搭配百分比宽高很容易出错,规划不出矩形区域

按份数填充

grid-template-rows: 1fr 2fr 1fr; 把高度平均分成四份,三行分别占1份 2份 1份

grid-template-columns: 1fr 2fr 1fr; 把宽度平均分成四份,三行分别占1份 2份 1份

MINMAX控制尺寸波动范围

grid-template-rows:repeat(2,minmax(50px , 100px))
每一个高度最小值50px最大值100px

栅格间距

row-gap:10px;/*行间距10px*/
column-gap:10px;/*列间距10px*/

/*统一设置*/
gap: 20px 10px; /*行间距 列间距*/

放置元素

根据栅格元素编号放置

对子元素设置放置位置

header{/*容器*/
display:grid;
height:100px;
width:300px;
background-color: yellowgreen;
grid-template-rows: repeat(2, 50%);
grid-template-columns: repeat(3,100px);
}
header div{
box-sizing: border-box;
border:1px black solid;
/*关键字句*/
grid-row-start:2;/*开始行*/
grid-column-start: 1;/*开始列*/
grid-row-end: 2;/*结束行*/
grid-column-end: 3;/*结束列,会在设置的列的前1列结束*/
/*比如这个子盒子里,元素占据父盒子的第2行第1、2列*/
}

最后放置一定是一个矩形

固定命名放置元素

先在对容器画线设置的时候命名

div{
width:300px;
height:300px;
display:grid;
grid-template-rows: [r1-start] 100px [r1-end r2-start] 100px [r2-end r3-start] 100px [r3-end];
grid-template-columns: [c1-start] 100px [c1-end c2-start] 100px [c2-end c3-start] 100px [c3-end];
}

再放置子元素

div:first-child{
grid-row-start:r1-start;
grid-column-start:c2-start;/*c1-end 相当于 c2-start*/
grid-column-end:c2-end;/*c2-end 相当于 c3-start*/
grid-row-start: r1-end;
}

重复栅格的命名技巧

/*container*/
div {
width:300px;
height:300px;
display:grid;
grid-template-rows: repeate(3,[r-start] 1fr [r-end]);
grid-template-columns: repeate(3, [c-start] 1fr [c-end] );/*每一格的左边那条线是r-start/c-start,右边是r-end/c-end*/
}
/*容器中的子盒子*/
div:first-child{
grid-row-start: r-start 1;
grid-column-start: c-start 1;
grid-row-end: r-end 1;
grid-column-end: c-end 3;
}

根据偏移量定位元素

div:first-child{
grid-row-start: 2;
grid-column-start:2;
grid-column-end: span 2;/*占两格*/
grid-row-end: span 1;/*占一格*/
}

元素定位简写操作

div:first-child{
grid-row: 3/4;/*3开始4结束*/
grid-column: 3/4;/*3开始4结束*/
}
div:first-child{
grid-row: 3/ span 1;/*3开始 占1格*/
grid-column: 1/ span 3; /*1开始 占3格*/
}

使用栅格区域部署元素

div:first-child{
    grid-area: 2/2/3/3;
/*分别是grid-row-start/grid-column-start/grid-row-end/grid-column-end*/
}

按盒子顺序定义区域

article{
width:100vw;
height:100vh;
display: grid;
grid-template-rows: 60px 1fr 60px;
grid-template-columns: 60px 1fr;
/*为各个区域命名*/
grid-template-areas: "header header"/*在同一行的格子写在一个引号里*/
					"nav main"
				    "footer footer"
}/*起一样的名字就代表格子合并了*/

/*再往里面装盒子*/
article: first-child{
grid-area: header;/*这样设置就会占到header区*/
}
article:nth-child(2){
grid-area: nav;/*占nav区*/
}
article:nth-child(3){
grid-area: main;/*占main区*/
}
article:nth-child(4){
grid-area: footer;/*占2个footer区*/
}

将栅格命名后,每一条线也就自动获得了名称

div:first-child{
grid-area: header-start/header-start/main-end/main-end;
}

就算不命名,也要打一个点在那里占位 比如

div{
display: grid;
grid-template-areas: ". ."
                     ". ."
                    "footer footer"/*起同样的名字就代表这两个区域合并了*/
}

栅格系统可以层层划分下去

栅格系统

BOOKSTRAP 类名绑定栅格属性 通过改变元素类型而改变元素位置和大小

栅格流动方向

grid-auto-flow:row;行排列,默认
grid-auto-flow:column;列排列
grid-auto-flow:row-dense;行剩余空间自动填满

div{
display:grid;
grid-auto-flow: row;/*行排列,默认*/
/*grid-auto-flow: column; 列排列*/
}
div{
grid-auto-flow:row dense;/*行剩余空间自动填满*/
}

对齐处理

justify-content这一属性的值于弹性盒模型里的一样
align-content设置竖直空间

article{
/*container*/
border:solid 1px black;
width:400px;
height:100px;
display:grid;
grid-template-columns: repeat(4, 60px);
/*设置容器内元素的对齐方式*/
/*水平*/
justify-content:space-around;/*这些属性与弹性盒模型里面一样,详见弹性盒模型*/

/*垂直*/
align-content:center;
}

栅格宽高小于容器时设置对齐才有用

巧用justify-items

设置好列元素之后

article{
border:solid 1px silver;
width:400px;
height:100px;
display: grid;
grid-template-columns: repeate(4, 100px);
/*调控栅格里的元素*/
/*横向*/
justify-items: start;
			/*end / center / stretch*/

/*纵向调节*/
align-items: end;/**start / center/ stretch*/
}

这些设置的前提是栅格内元素没有填充满,如果元素本身的宽高小于栅格,那么stretch的设置没有意义,如果元素宽高等于栅格,那么设置对齐方式也没有意义。

辨析:
justify-content 是操作容器的栅格(当容器有多余空间时)
justify-items 调整操作栅格里的元素

调节单个元素的对齐方式

div: first-child{
/*横向*/
justify-self:end;
/*纵向*/
align-self: center;
}

组合简写栅格对其方式

对容器进行设置

article{
margin: 0 auto;
border: solid 1px silver;
width: 400px;
height:80px;
display: grid;
grid-template-columns: repeat(4,60px);
place-items: start end;/*每个元素对齐到列开始 行结束*/
}
div{
/*container*/
display:grid;
place-items: center center;/*每个元素对齐到行中心,列中心*/
}

对单个元素进行控制
place-self:center end
栅格内元素对于栅格而言,垂直方向中心对齐,水平方向向右对齐