当前位置: 首页 > Web前端 > HTML

10分钟看懂CSS3Grid

时间:2023-04-02 17:44:23 HTML

基本介绍上一篇我们介绍了CSS3flexbox,今天我们来说说CSS3的另一个强大功能:Grid。做Grid前端的同学应该不陌生。中文译为“格子”。用过bootstrap、semanticui、antdesign的同学一定知道gridlayout(删除网格布局)。以前CSS框架中的网格布局一般是通过float和百分比宽度来实现的。这种实现有几个缺点:HTML不够简洁;浮动需要清除,避免高度崩溃;列数是固定的,不能灵活定义。比如bootstrap有12列,semanticui有16列,antdesign有24列。当然grid也可以用flex来实现,但是并不比用float简单多少,而且flex擅长一维空间的布局,不像grid那样擅长二维空间。现在css3从规范和标准层面实现了grid,编程体验大大提升!兼容性使用网格是一个二维网格系统,由多个列和行组成。1.Column(1)设置列CSS3中的Grid可以分为任意数量的列(columns),并且每列的宽度可以任意设置!我们先看一个简单的例子:html:

1
2
3
4
5
6
7
8
9
css:body{颜色:#fff;文本对齐:居中;}#content{显示:网格;网格模板列:33.3%33.3%33.3%;最大宽度:960px;边距:0自动;}#contentdiv{背景:浅灰色;padding:30px;}#contentdiv:nth-child(even){background:skyblue;}效果:当我们设置display:grid和grid-template-columns:33.3%33.3%33.3%时,#content被分割成了一个三行三列的网格。此时#content称为网格容器,#content的子元素称为网格项。我们也可以任意改变列的数量和宽度,例如:#content{grid-template-columns:10%20%30%40%;}效果:(2)fr(fraction)css3中引入了一个新的单位fr(分数),中文意思是“分数”,用来代替百分比,因为百分比(小数)是不可分割的,用分数可以避免写多个小数。例如,一个三列等宽的网格可以表示为:grid-template-columns:1fr1fr1fr;(3)repeat我们也可以使用repeat的方式来简化column或者row的写法。repeat方法接受两个参数,第一个参数表示重复的次数,第二个参数表示重复的内容。因此,三列等宽的网格也可以表示为:grid-template-columns:repeat(3,1fr);当我们有很多列要定义时,repeat就变得非常有用,比如我们要定义一个10列等宽的网格可以写成repeat(10,1fr),而不是重复10次1fr。2.Row(1)设置行当我们设置列时,由于元素的换行,行会自动生成,但是我们仍然可以设置行的个数和行高。css:#content{显示:网格;网格模板列:重复(3、1fr);网格模板行:重复(4、60px);max-width:960px;}效果:可以看出,虽然前四行没有内容,但是该行确实存在并且占用了那个空间。(2)minmax在上面的例子中,我们给行指定了一个固定的高度,这就导致了一个问题:如果某个griditem中的内容很多,在固定高度的限制下,有些内容不会显示出来,如如下图所示:为了解决这个问题,css提供了minmax函数,这样我们就可以设置行的最小高度和最大高度。设置最大高度为auto后,行高可以自适应:css:grid-auto-rows:minmax(60px,auto);//或grid-template-rows:repeat(3,minmax(60px,汽车));效果:(3)网格间隙如果我们想在行列之间添加间隔,也有现成的方法:css:grid-gap:{10px;}效果:3.网格线在上面所有的例子中,每个网格中的网格项按默认顺序排列。如果我们想重新布局并更改网格项的位置或大小怎么办?为此,引入网格线的概念。所谓网格线,就是将网格等分的分割线。下图中横竖序号为1到8的线为网格线:通过定义网格项的起始和结束网格线,我们可以控制网格项的位置和覆盖范围。一个简单的例子:html:1
css:#content{display:grid;网格模板列:重复(8,100px);网格模板行:重复(8、100px);grid-gap:10px;}.one{grid-column-start:3;网格列端:6;网格行开始:3;grid-row-end:6;}作用:通过设置grid-column-start/endgrid-row-start/end相当于为griditem设置起始坐标和结束坐标,上面的css也可以简写为:。一个{网格列:3/6;grid-row:3/6;}//or.one{grid-area:3/3/6/6;}如果网格项的起始网格线是默认的,我们只能设置它的跨度(span):.one{网格列:跨度3;grid-row:span3;}4.网格区域模板除了通过网格线布局之外,css3还提供了一个更牛逼的布局方式:网格区域模板。与其用文字解释什么是网格区域模板,不如直接看代码:html:
Header
Main
Section
css:body{color:#fff;文本对齐:居中;}#content{显示:网格;网格模板列:重复(4、1fr);grid-auto-rows:minmax(100px,auto);最大宽度:960px;保证金:0自动;网格间隙:10px;grid-template-areas:"headerheaderheaderheaderheader""aside.mainmain""nav.mainmain""sectionsectionsectionsection""sectionsectionsectionsection""footerfooterfooterfooter";}#content>*{背景:#3bbced;padding:30px;}header{网格区域:header;}main{网格区域:main;}section{网格区域:section;}aside{网格区域:aside;}nav{网格区域:nav;}页脚{网格区域:页脚;}效果:明白了吗?重点是grid容器的grid-template-areas属性我们为每个网格项设置一个网格区域,然后在网格容器中设置一个网格区域模板(grid-template-areas)。模板中的每一行字符串代表一行,每个区域名称代表一列,完全模拟文字的几何布局,使用.代表空白网格项目。当然,在使用gridarea的时候一定要注意语法的严谨性。写成“headermainheadermain”之类的CSS无法解析。区域名称所模拟的结构在二维空间中必须是一个整体,因为每个网格项是不可分割的。的。在实现响应式布局时使用网格区域模板的优势也很明显,我们只需要针对不同的屏幕尺寸制作不同的网格区域模板即可。5.justify和align与flex类似,grid也可以设置justify和align来调整griditem的水平和垂直对齐方式。它还支持设置网格容器或单个网格项。为网格容器设置html:1
2
3
4
5
6
css:#content{显示:网格;网格模板列:重复(3、1fr);grid-template-rows:repeat(2,minmax(120px,auto));网格间隙:10px;最大宽度:960px;对齐项目:开始;justify-items:end;}作用:注意:flex使用justify-content,grid里面是justify-items,flex中的值为flex-start/flex-end,grid中的值为start/end。justify和align的默认值都是stretch。为网格项设置css:.one{align-self:start;justify-self:end;}效果:在实践中掌握以上知识后,我们可以使用CSS3Grid快速制作各种布局效果,附上几个简单的codepen例子:12列网格布局花瓣布局响应式布局