如果计算机的计算能力足够强大,是不是人这个东西也可以用物理量进行表示。
网格布局
CSS 网格是一个用于 web 的二维布局系统。利用网格,你可以把内容按照行与列的格式进行排版。另外,网格还能非常轻松地实现一些复杂的布局。
网格是由一系列水平及垂直的线构成的以一种布局模式。根据网格,我们能够将设计元素进行排列,帮助我们设计一系列具有固定位置以及宽度的元素的页面,使我们的网站页面更加统一。
一个网格通常具有许多的列(column)
与行(row)
,以及行与行、列与列之间的间隙,这个间隙一般被称为沟槽
(gutter)。
创建自己的网格
决定好你的设计所需要的网格后,你可以创建一个CSS网格版面并放入各类元素。我们先来看看网格的基础功能,然后尝试做一个简单的网格系统。
例如:
代码语言:javascript复制<html><head>
<meta charset="utf-8">
<title>CSS Grid starting point</title>
<style>
body {
width: 90%;
max-width: 900px;
margin: 2em auto;
font: .9em/1.2 Arial, Helvetica, sans-serif;
}
.container > div {
border-radius: 5px;
padding: 10px;
background-color: rgb(207,232,220);
border: 2px solid rgb(79,185,227);
}
</style>
</head>
<body>
<h1>Simple grid example</h1>
<div class="container">
<div>One</div>
<div>Two</div>
<div>Three</div>
<div>Four</div>
<div>Five</div>
<div>Six</div>
<div>Seven</div>
</div>
</body></html>
默认情况下,container中div是按照正常布局流自顶而下排布。如图:
然后我们对css规则做点改变,来了解网格是如何工作的。
首先,将容器的display属性设置为grid来定义一个网络。与弹性盒子一样,将父容器改为网格布局后,他的直接子项会变为网格项。
代码语言:javascript复制.container {
display: grid;
}
与弹性盒子不同的是,在定义网格后,网页并不会马上发生变化。因为display: grid的声明只创建了一个只有一列的网格,所以子项还是会像正常布局流那样从上而下一个接一个的排布。
为了让容器container
看起来更像一个网格,我们要给刚定义的网格加一些列。那就让我们加几个个宽度为200px的列。我这里加了5个,当然,这里可以用任何长度单位,包括百分比。
.container {
display: grid;
grid-template-columns: 200px 200px 200px 200px 200px;
}
在规则里加入grid-template-columns
刷新页面后,我们会看到子项们排进了新定义的网格中。
fr单位的灵活网格
除了长度和百分比,我们也可以用fr这个单位来灵活地定义网格的行与列的大小。这个单位表示了可用空间的一个比例。
使用下面的样式来创建3个1fr
的demo:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
}
将窗口调窄,你应该能看到每一列的宽度可以会随着可用空间变小而变小。fr 单位按比例划分了可用空间,如果没有理解,可以试着改一下数值,看看会发生什么,比如下面的代码:
代码语言:javascript复制.container {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
}
这个定义里,第一列被分配了2fr
可用空间,余下的两列各被分配了1fr的可用空间,这会使得第一列的宽度是第二第三列的两倍。另外,fr可以与一般的长度单位混合使用,比如grid-template-columns: 300px 2fr 1fr
,那么第一列宽度是300px,剩下的两列会根据除去300px后的可用空间按比例分配。
网格间隙
使用 grid-column-gap
属性来定义列间隙;使用 grid-row-gap
来定义行间隙;使用 grid-gap
可以同时设定两者。
.container {
display: grid;
grid-template-columns: 2fr 1fr 1fr;
grid-gap: 20px;
gap: 20px;
}
间隙距离可以用任何长度单位包括百分比来表示,但不能使用fr单位。
重复构建行/列
你可以使用repeat来重复构建具有某些宽度配置的某些列。举个例子,如果要创建多个等宽轨道,可以用下面的方法。
代码语言:javascript复制.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
}
和之前一样,你仍然得到了3个1fr的列。第一个传入repeat函数的值(3)表明了后续列宽的配置要重复多少次,而第二个值(1fr)表示需要重复的构建配置,这个配置可以具有多个长度设定。例如repeat(2, 2fr 1fr)
,如果你仍然不明白,可以实际测试一下效果,这相当于填入了2fr 1fr 2fr 1fr
。
显式网格与隐式网格
到目前为止,我们定义过了列,但还没有管过行。但在这之前,我们要来理解一下显式网格和隐式网格。显式网格是我们用grid-template-columns
或 grid-template-rows
属性创建的。而隐式网格则是当有内容被放到网格外时才会生成的。显式网格与隐式网格的关系与弹性盒子的main
和cross
轴的关系有些类似。
隐式网格中生成的行/列大小是参数默认是auto,大小会根据放入的内容自动调整
。当然,你也可以使用grid-auto-rows
和grid-auto-columns
属性手动设定隐式网格的大小。下面的例子将grid-auto-rows设为了100px,然后你可以看到那些隐式网格中的行(因为这个例子里没有设定grid-template-rows,因此,所有行都位于隐式网格内)现在都是100像素高了。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: 100px;
grid-gap: 20px;
}
minmax() 函数
100像素高的行/列有时可能会不够用,因为时常会有比100像素高的内容加进去。所以,我们希望可以将其设定为至少100像素,而且可以跟随内容来自动拓展尺寸保证能容纳所有内容。显而易见,你很难知道网页上某个元素的尺寸在不同情况下会变成多少,一些额外的内容或者更大的字号就会导致许多能做到像素级精准的设计出现问题。所以,有了minmax函数
。
minmax 函数
为一个行/列的尺寸设置了取值范围。比如设定为 minmax(100px, auto)
,那么尺寸就至少为100像素,并且如果内容尺寸大于100像素则会根据内容自动调整。在这里试一下把 grid-auto-rows
属性设置为minmax函数
。
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-auto-rows: minmax(100px, auto);
grid-gap: 20px;
}
如果所有网格内的内容均小于100像素,那么看起来不会有变化,但如果在某一项中放入很长的内容或者图片,你可以看到这个格子所在的哪一行的高度变成能刚好容纳内容的高度了。
自动多列填充
现在来试试把学到的关于网格的一切,包括repeat
与minmax
函数,组合起来,来实现一个非常有用的功能。某些情况下,我们需要让网格自动创建很多列来填满整个容器。通过设置grid-template-columns
属性,我们可以实现这个效果,不过这一次我们会用到repeat函数中的一个关键字auto-fill
来替代确定的重复次数。而函数的第二个参数,我们使用minmax函数来设定一个行/列的最小值,以及最大值1fr。
.container {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
grid-auto-rows: minmax(100px, auto);
grid-gap: 20px;
}
总结
这里简述了cssgrid
布局的使用方法,似乎比之前的grid布局方式有了很多更新,也涉及到很多新的概念。
是不是现在的框架用的还是老版本的网格布局?有时间了看看去
javascript基础知识总结