赞
踩
- CSS Grid(网格) 布局,与 flexbox 的一维布局系统不同,是一个二维的基于网格的布局系统,它可以同时处理列和行,Grid(网格) 布局是第一个专门为解决布局问题而创建的 CSS 模块。
- Grid布局和Flex布局有很多相似之处,Grid也分容器和项目,采用grid布局的元素,被称为grid容器(grid container),简称“容器”,其下的所有直接子元素自动成为容器成员,称为grid项目(grid item),简称“项目”。
上面说到,grid布局和flex虽有相似之处,但grid布局更强大,它不仅仅只有容器和项目,还有间距、区域、内容、行、列这些属性我们都是可以通过grid布局来控制的,如下图:
这张图还是比较重要的,大家可以记住这种结构,后面小shy讲解grid的一些属性的时候就会很容易明白其效果了。
废话不多说,现在进入正题,欢迎各位进入grid支配的世界!
grid属性和flex属性类似,也是分容器属性和项目属性两种类型。
容器属性
项目属性
大家乍一看是不是觉得grid的属性真的非常多啊,怎么记得住呀,其实大家仔细看一下,他们都是很多属性一套一套的,记住了一个,就很容易想到跟它相关的属性,当大家上手练习的时候就会发现并没有那么难记,并且你会在学习的过程中不由自主的感觉grid的强大之处。下面小shy带大家开始逐一了解grid的属性。
为方便演示,小shy先在这里准备好结构(添加了一些样式),下面的属性讲解有一部分示例会按照这个结构来讲解:
<div class="main">
<div class="item item-1">1</div>
<div class="item item-2">2</div>
<div class="item item-3">3</div>
<div class="item item-4">4</div>
<div class="item item-5">5</div>
<div class="item item-6">6</div>
<div class="item item-7">7</div>
<div class="item item-8">8</div>
<div class="item item-9">9</div>
<div class="item item-10">10</div>
</div>
效果如下:
将元素定义为网格容器,并为其内容建立新的网格格式上下文;
值:
.container {
display: grid | inline-grid;
}
大家从上面也了解到grid布局又称网格布局,那网格肯定就是行和列交叉形成的,那就有行和列之分,大家在学习grid的时候一定要把行 和 列的概念牢记于心,这对于掌握grid是比较重要的。
grid-template-columns / grid-template-rows:使用空格分隔的值列表,用来定义网格的列和行。这些值表示 网格轨道(Grid Track) 大小,它们之间的空格表示网格线。
grid-template-columns后跟由空格分隔的值,表示分隔成多少列,每列占的宽度是多少;
grid-template-rows后跟由空格分隔的值,表示分隔成多少行,每列占的高度是多少;
.main {
display: grid; // 给.main添加grid
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: 100px 100px 100px 100px; // 4列 每一列的宽度分别为 100px 100px 100px 100px
grid-template-rows: 100px 100px 100px; // 3行 每一行的高度分别为 100px 100px 100px
}
如果要定义100行和100列的话,我们总不能写一百个数值吧。repeat就是用来解决这个问题的。
repeat(m, n): 定义多少列/行,每一列/行占多少空间;
.main {
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: repeat(4, 100px); // 等同于: grid-template-columns: 100px 100px 100px 100px;
grid-template-rows: repeat(3, 100px); // 等同于: grid-template-rows: 100px 100px 100px
}
fr: fr 单元允许你用等分网格容器剩余可用空间来设置 网格轨道(Grid Track) 的大小;
.main {
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: repeat(4, 1fr); // 表示分为4列,每一列的宽度为容器宽度的四分之一
grid-template-rows: repeat(3, 1fr); // 表示分为3行,每一行的高度为容器宽度的三分之一
}
也可以这样写:
grid-template-columns: 1fr 2fr 3fr;
分3列,第一列占容器宽度的六分之一: 1 / (1 + 2 + 3)
第二列占容器宽度的六分之二: 2 / (1 + 2 + 3)
第三列占容器宽度的六分之三: 2 / (1 + 2 + 3)
auto:占满容器的剩余的部分;
grid-template-columns: 100px auto 100px 100px;
grid-template-rows: 100px auto 100px;
效果如下:
如果没有给网格线命名,轨道值之间仅有空格时,网格线会被自动分配数字名称;
给网格线指定确切的命名:
.container {
grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}
column-gap:列与列之间的间距;
row-gap:行与行之间的间距;
gap: column-gap 和 row-gap的复合写法,row-gap column-gap。
.main {
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 1fr);
column-gap: 10px;
row-gap: 10px;
// 这两个属性的复合写法:gap: 20px 10px;
}
效果如下:
通过引用 grid-area 属性指定的 网格区域(Grid Area) 名称来定义网格模板。重复网格区域的名称导致内容跨越这些单元格。一个点号(.)代表一个空单元格。这个语法本身可视作网格的可视化结构,它的值有三个:
.item-a { grid-area: header; } .item-b { grid-area: main; } .item-c { grid-area: sidebar; } .item-d { grid-area: footer; } .container { grid-template-columns: 50px 50px 50px 50px; grid-template-rows: auto; grid-template-areas: "header header header header" "main main . sidebar" "footer footer footer footer"; }
你的声明中的每一行都需要有相同数量的单元格。
你可以使用任意数量的相邻的 点. 来声明单个空单元格。 只要这些点.之间没有空隙隔开,他们就代表一个单独的单元格。
注意你 不能 用这个语法来命名网格线,只是命名 网格区域 。当你使用这种语法时,区域两端的网格线实际上会自动命名。如果你的网格区域的名字是 foo,该区域的起始行网格线 和 起始列网格线 的名称将为 foo-start,而最后一条行网格线 和 最后一条列网格线 的名称将为 foo-end。这意味着某些网格线可能有多个名字,如上例中最左边的网格线,它将有三个名称:header-start,main-start 和 footer-start 。
grid-auto-flow: 定义项目排列方式,有两个值 row 和 column,默认是row,横向排列。
.main {
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, 1fr);
gap: 10px;
grid-auto-flow: column;
}
效果如下:
有时,你的网格合计大小可能小于其 网格容器(grid container) 大小。 如果你的所有 网格项(grid items) 都使用像 px 这样的非灵活单位设置大小,就可能出现这种情况。在这种情况下,您可以设置网格容器内的网格的对齐方式。
justify-content:start | center | end | space-around | space-between | space-evenly,沿着行轴线对齐网格;
align-content:start | center | end | space-around | space-between | space-evenly,沿着轴线对齐网格。
place-content: <align-content> <justify-content>组合写法;
设置多出来的项目的宽和高。
.main {
display: grid;
width: 600px;
height: 600px;
border: 10px solid skyblue;
grid-template-columns: repeat(3, 100px);
grid-template-rows: repeat(3, 100px);
gap: 10px;
grid-auto-rows: 50px;
}
上述代码设置了一个 3 * 3的区域,会多出来一个项目,这个项目所在的列宽度是确定的,不在规定的三行内,我们给这个多余的项目设置了高度(grid-auto-rows: 50px; )如下:
以上就是容器的所有的属性的讲解,grid的属性确实比较多,需要大家慢慢消化练习,后面小shy会分享出项目自身的属性,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。