文章目录
与Flex的比较
Flexbox是一维布局系统,适合做局部布局,比如导航栏组件。Grid是二维布局系统,通常用于整个页面的规划。
二者从应用场景来说并不冲突。虽然Flexbox也可以用于大的页面布局,但是没有Grid强大和灵活。二者结合使用更加轻松。
兼容性
兼容性并不乐观,虽然至2017年3月,许多浏览器都提供了对 CSS Grid 的原生支持,但是都体现在比较新版本上:
基本概念
Grid容器里面,水平区域成为行,垂直区域称为列,行和列的交叉区域成为单元格(cell)。正常情况下n
行m
列会产生n x m
个单元格。
划分网格的线就成为网格线,n
行有n+1
根水平网格线,m
列有m+1
根垂直网格线
一个4x4
的网格,共有5根水平网格线和5根垂直网格线
容器属性
改变容器
使用display: grid
指定容器采用网格布局(或者使用display: linline-grid
指定容器采用行内网格布局)。
设为网格布局后,容器子元素的float
、display: inline-block
、display: tabel-cell
、vertical-align
和column-*
设置都会失效
划分网格
容器指定了网格布局后需要划分行和列:
grid-template-columns
属性定义每一列的列宽grid-template-rows
属性定义每一行的行高
.container {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: 100px 100px 100px;
}
上面的代码将容器划分为三行散列的网格,列宽和行高都是100px
fr
关键字
划分网格的宽度单位除了是px
、百分比等常规单位之外,也可以使用fr
关键字,如果两列的宽度是1fr
和2fr
,那么代码后者的宽度是前者的两倍
如果同时使用px
和fr
时,使用fr
的宽度会将剩余的宽度都充满
repeat
函数
可以使用repeat
函数来书写重复的值,它接受两个参数,第一个是重复的次数,第二个是重复的值
.container {
grid-template-columns: repeat(2, 100px 20px 80px);
/* 等于 grid-template-columns: 100px 20px 80px 100px 20px 80px */
}
auto-fill
关键字
在使用repeat
函数时,可以使用auto-fill
关键字,表明在容器大小不确定时,希望每一行或者每一列容纳尽可能多的单元格
.container {
grid-template-columns: repeat(auto-fill, 10