关于CSS网格的学习教程

135 阅读3分钟

CSS Grid Tutorial

让我们来了解在很长一段时间内,前端网页布局中最令人兴奋的事情。这就是CSS网格技术。CSS网格是一套全新的技术,它允许网页设计师和开发人员在网页上加入强大的页面布局技术。传统上,网络的页面布局一直是一个极具挑战性的做法。过去我们可能使用过表格、div、图层、各种CSS黑客,最终还使用了Foundation、Bootstrap等CSS框架。现在我们有了CSS Grid,这是一个非常强大的二维布局工具,用于在网页上定位项目。你可以用CSS Grid创建你能想到的任何布局。让我们来看看CSS Grid现在是如何工作的一些例子。


网格容器

我们要做的第一件事是设置一个网格容器。我们通过将display 属性设置为grid 来做到这一点。定义好的网格容器的任何直接子项现在都自动成为网格项。


display: grid;

<html>

<head>
    <style>
        .grid-container {
            display: grid;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
    </div>
</body>

</html>

注意,当我们把display 设置为grid ,项目就会以堆叠的行的形式出现,横跨容器的整个宽度。我们这里有一些带有数字的图片作为例子。你可以看到网格线,因为我们在Firefox中打开了网格线以方便可视化。
display grid


display: inline-grid;

<html>

<head>
    <style>
        .grid-container {
            display: inline-grid;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
    </div>
</body>

</html>

display 被设置为inline-grid 的情况下,注意到网格项只跨越了内容的宽度。
display inline-grid


明确的网格

一旦我们设置好了容器,就可以使用grid-template-rowsgrid-template-columns 属性显式地定义列和行。


grid-template-rows

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: 50px 75px;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
    </div>
</body>

</html>

这里,第一行的高度是50像素,第二行的高度是75像素。所有其他的行只是使用它们所包含的内容的高度。在我们的例子中,这是100px乘100px的图片。
grid-template-rows


grid-template-columns

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: 100px 100px;
            grid-template-columns: 100px 100px 100px;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
    </div>
</body>

</html>

现在我们有2行和3列,高度和宽度都是100像素。
grid-template-columns


grid-template-rows和grid-template-columns中的fr

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: 1fr 1fr;
            grid-template-columns: 1fr 1fr 1fr;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
    </div>
</body>

</html>

小数单位是让浏览器自动将自由空间分成相等部分的好方法。这个例子显示了两行相等的部分,以及三列相等的尺寸。这些图片只有100px乘100px,所以它们在每个网格单元中默认从左边开始。
fr in grid-template-rows and grid-template-columns


最小和最大的网格轨道尺寸

你可以使用minmax()函数来创建网格轨道,使用可用的空间,但不会收缩得比定义的尺寸更窄,也不会增长得超过定义的尺寸。


minmax()函数

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: minmax(100px,150px) 1fr;
            grid-template-columns: 1fr 1fr 1fr;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="200x200.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="200x200.png">
    </div>
</body>

</html>

grid-template-rows minmax example

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows:  1fr 1fr;
            grid-template-columns: minmax(100px,auto) 1fr minmax(100px,auto);
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="200x200.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="200x200.png">
    </div>
</body>

</html>

grid-template-columns minmax

通过结合minmax()和fr单元,人们可以创建各种响应式设计,不再需要在浏览器中使用多个媒体查询。


重复的网格轨迹

与其明确定义每一行或每一列,你可以使用repeat() 函数来说明你希望有多少行或多少列。


repeat()函数

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: repeat(3, 1fr);
            grid-template-columns: repeat(3, 1fr);
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
        <img src="7.png">
        <img src="8.png">
        <img src="9.png">
    </div>
</body>

</html>

repeat function example


带有网格间隙的排水沟

默认情况下,行和列之间没有任何空间。你可以使用grid-gap定义行和列之间的空白。请注意,你不能对gutters应用任何样式。这些只是为了留白。


grid-gap

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: repeat(3, 1fr);
            grid-template-columns: repeat(3, 1fr);
            grid-gap: 10px;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
        <img src="7.png">
        <img src="8.png">
        <img src="9.png">
    </div>
</body>

</html>

grid gap css

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: repeat(3, 1fr);
            grid-template-columns: repeat(3, 1fr);
            grid-row-gap: 5px;
            grid-column-gap: 20px;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img src="1.png">
        <img src="2.png">
        <img src="3.png">
        <img src="4.png">
        <img src="5.png">
        <img src="6.png">
        <img src="7.png">
        <img src="8.png">
        <img src="9.png">
    </div>
</body>

</html>

grid-row-gap grid-column-gap


使用网格线号定位项目

使得CSS Grid非常强大的是能够准确地将内容放在你想要的地方。下面是几个在网格上准确定位图片的例子


grid-row-start(end) grid-column-start(end)

<html>

<head>
    <style>
        .grid-container {
            display: grid;
            grid-template-rows: repeat(2, 1fr);
            grid-template-columns: repeat(3, 1fr);
        }

        .a {
            grid-row-start: 2;
            grid-row-end: 3;
            grid-column-start: 3;
            grid-column-end: 4;
        }
    </style>
</head>

<body>
    <div class="grid-container">
        <img class="a" src="1.png">
        <img class="b" src="2.png">
        <img class="c" src="3.png">
        <img class="d" src="4.png">
        <img class="e" src="5.png">
        <img class="f" src="6.png">
    </div>
</body>