概念
CSS网格是一个用于web二维布局系统。利用系统,你可以把内容按照行与列的格式进行排版。另外,网格还能非常轻松地实现一些复杂的布局
利用网格布局可以轻松地进行单元格合并、格子与格子之间的间距
grid容器
grid子项
定义网格及fr单位
定义网格有点像Excel网格,有行有列。具体用到的是grid-template-rows和grid-template-columns ,它们的意思是基于网格行和列的维度,去定义网格的名称和网格轨道的尺寸大小
grid-template-columns:定义网格有多少列,单位可以是px、百分比、auto、fr混用
grid-template-columns:定义网格多少行,单位可以是px、百分比、auto、fr混用
fr单位同flex布局中的flex-grow拓展容器和flex-shrik收缩容器很像,都是一个比例值,fr的意思就是"均分"
grid-template-rows: 2fr 1fr;的意思就是第一行的高度是第二行高度的2倍
grid-template-rows: 0.3fr 0.3fr; 它的值之和必须大于等于1,否则就会出现空白区域,如下图所示就会出现40%的空白区域
合并网格及网格命名
grid布局中的一个特性,如果只指定了多个div中的一个与网格的对应关系,那么其他的div依然会自动填入到gid网格的其他网格中,不会跑到网格之外
简写方式
网格间隙及简写
起初这些属性只使用在grid布局中,所有加了grid前缀,后面发现其他布局中也可以是使用到间隙,为了达到通用的效果去掉了grid,比如flex布局中也可以使用定义间隙的样式
简写样式grid-gap: 行间距 列间距;,真的记不住哪个是行哪个是列也没关系,浏览器中可以查看简写的展开写法,新的写法grid: 20px 30px;
flex弹性布局中使用间距gap
网格对齐方式及简写
默认情况下div是靠格子的左上角对齐
justify-items 指的是子项在自己所处单元格水平方向的对齐方式
align-items 指的是子项在自己所处单元格水平方向的对齐方式
这种适合子项小于单元格时候的对齐方式
简写形式:place-items: 垂直方向 水平方向; (记不住没关系,浏览器中可以查看完整的形式)
它指的是整体的对齐方式,所有网格在grid中的对齐方式(条件是容器要比单元格要大)
默认情况下单元格是位于容器的左上角
justify-content 指的是单元格整体在水平方向的对齐方式
align-items 指的是单元格整体在垂直方向的对齐方式
这种适合子单元格小于grid容器的时候
简写形式:place-content: 垂直方向 水平方向; (记不住没关系,浏览器中可以查看完整的形式)
隐式网格和显示网格
自适应的行进行排列
之前的例子都是显示网格,即有多少个grid格子就有多少个单元格,是一一对应的关系
有的时候网格可能比单元格少,这种情况就会出现隐式网格
上图中定义了1行3列3个grid格子,但是又定义了5个单元格,因此网格比单元格少。1,2,3占用的就是显示网格,4,5多出来的就会按顺序自动拉伸排列,它占用的就是隐式网格(自动生成),隐式网格的默认样式:
grid-auto-flow:row:默认row就是行产生隐式网格,因此多出来的4,5会折行到下面,宽度同显示网格一样,但是高度是拉伸的
这个隐式网格的高度是可以进行调节的 grid-auto-rows: 100px;
大部分情况下这2个样式是配套使用的
grid-auto-flow:row
grid-auto-rows: 100px;
自适应的列进行排列
如果是1列3行,下图中的4,5为什么会不在垂直方向上折行?4,5也会产生隐式网格,只是默认情况下是产生row的隐式网格 grid-auto-flow:row
这时就需要对列产生隐式网格grid-auto-flow:column
但是隐藏网格中的单元格的宽度默认是拉设的,我们可以对其设置
grid-auto-columns: 100px;
大部分情况下这2个样式是配套使用的
grid-auto-flow:column
grid-auto-columns: 100px;
如果不设置grid容器的宽度,那么宽度和高度都是自适应的,增减内容,那么列会自动发生增减也会把grid容器撑开,所以用grid布局容易实现自适应列布局
紧密的布局
默认情况下一行三列的布局:
指定第一个div,从第二个列开始排列,那么第一个位置就会被空出来
加上紧密的属性后,后面的div并不是按照顺序填充,而是先把空的位置沾满
grid-auto-flow: row dense;
Grid中子项的相关语法
基于线的元素放置
在grid布局中每条线都有名字,通过指定div在grid网格中行/列的起始、结束的线就可以使div放到指定的格子中
加与不加下面2行样式的区别(同前面说的『紧密的』类似):
grid-row-start: 1; grid-row-end: 2;
- 不加的时候默认的排列顺序是auto,灰色div会自动排到粉色div后面
- 加了之后灰色div会自动填充空白区域,“跑到”粉色div的前面
加上span后数字就不表示占据的位置,而是表示占据的个数grid-column-end: span 2; 它表示占2列
网格线除了使用数字来命名,还可以自定义命名
在定义网格的时候是可以控制命名的,通过"[]"
简写
基于线的grid-area
grid-area:行的起始线 / 列的起始线 / 行的结束位置线 / 列的结束位置线
除了可以通过指定某个区域的名字进行控制以外,还可以通过线的方式进行控制
子项的对齐方式(指定操作某一个子项)
justify-self:水平方向对齐方式
align-sellf:垂直方向对齐方式
下面的例子中的div为什么会在网格线的中间呢?因为它所占的区域是2行一列,在这个区域中水平垂直居中
repeat()
repeat()方法及auto-fill可选值(自适应),指定可重复的数值
grid-template-columns: 100px 100px 100px;
// 等于下面这种写法
grid-template-columns:repeat(3,100px)
auto-fill是grid-template-columns属性的值,会自动的根据容器大小应该产生多少个网格,如果定义了一行3列的网格,初始化了4个div,那么第四个div就会依次折行排列并自动缩放
但是使用了auto-fill后网格会根据容器的宽度自适应生成若干个网格,这样即使初始化的格子少了,格子的数量也会依据内容自动的增减
minmax()
minmax()方法,设置最小和最大的范围
如下图所示,随着窗口大小发生变化,那么div2最小不会小于100px,最大就会占满剩余空间
使用网格布局,结合minmax()和repeat()做一个自适应布局的案例
叠加布局
思路 =>
- 让叠加的元素出现在一个格子中
grid-area: 1/1/1/1;
- 对需要指定位置的元素使用自对齐方式
justify-self: end;
align-self: end;
多种组合排列布局
思路:
- 指定整体几行几列网格、网格大小及间距
- 基于线指定某个单元格的位置和所占格子大小
如下图所示:
栅格布局
当某个divgrid-area: 1;的值设置为一个具体的值时,如果后面还有div那么它就不会自动按顺序进行排列而是自动填补空白区域,因此这里设置grid-area: auto / auto / auto / span 1 ;
就像下面这样,我们实际希望col-3是排在col-1的后面,但是由于col-1的前面有很多的空白区域因此col-3就自动填补到前面去了,为了避免这种情况的发生,使之能够自适应布局,我们需要置grid-area: auto / auto / auto / span 1 ;起始和结束位置都是auto,占据一个格子
容器自适应行列布局
容器自适应行布局
即使后面再添加更多的div,容器的高度也能随着内容自动被撑开
容器自适应列布局
行的自适应布局不需要写grid-auto-flow: row; 因为不写的话默认就是行的折行,产生行的隐式网格。但是列这折行这里就需要指定方向了,grid-auto-flow: column;
案例1
-
这里用命名的方式划定网格区域比使用基于线的方式划定网格区域更加方便
-
使用
grid-template-areas划分网格区域的时候,命名的区域组成的图形必须是矩形
grid-template-areas:
"
a1 a3 a3
a2 a3 a3
a4 a4 a5
a6 a7 a7
"
- 思路:
- 1.指定网格的行列数并划分好区域
- 2.将子项放到对应的网格中