CSS Grid
(CSS网格) 是继 Flexbox
以后又一很是重要的布局方法。目前,Chrome Firefox Safari 浏览器的最新版本已经开始支持它了。浏览器
本篇文章,咱们经过实现以下布局的照片墙的例子来学习CSS Grid
。布局
说在前面:
FlexBox
与CSS Grid
的区别?学习
Flexbox
是一维的,CSS Grid
是二维的。你想一想,使用Flexbox
的时候你须要经过定义flex-direction: row | column
来决定布局方向。而CSS Grid
能够行、列布局。flex
首先,咱们来分析一下最后的效果。咱们把Bootstrap
的网格系统搬到脑壳中,能够看到它是由4行4列组成的:spa
首先,和Flexbox
同样,咱们须要定义一个Grid
容器,而且经过display: grid
声明使用grid
布局方式。3d
随后,咱们须要对列进行声明。经过grid-template-columns
属性,如下方式定义了一个4列,每列200px
的网格系统。code
grid-template-columns: 200px 200px 200px 200px;
一种更简单的写法是:blog
grid-template-columns: repeat(4, 200px);
若是你并不想定义具体的数值,而是想每列的宽度按一行长度的占比来定义的话,可使用Grid
新引入的fr
单位。fr
是fraction
(分数)的意思,也就是说你定义的就是分子,全部你定义的加起来就是分母。好比一整行是900px
, 1fr 2fr
就表明第一列占据1/3
,第二列占据2/3
。
在咱们的效果图中,能够看到4列平分了一行的宽度,所以咱们能够这样定义:图片
grid-template-columns: repeat(4, 1fr);
你还想在行列之间加一些间隔(Gutters), 使用grid-gap
属性:rem
grid-gap: 0.5rem;
目前,咱们的布局状况就是这样:
.grid-container { display: grid; grid-template-columns: repeat(4, 1fr); grid-gap:0.5rem; } <div class="grid-container"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> <div>5</div> <div>6</div> </div>
当一行占满以后会自动切换到下一行。没有特别须要的话,你不用定义它。
不过像咱们这里须要定义每一行的高度。定义行的方式也与前面讲的定义列的方式类似,使用grid-template-rows
进行定义:
grid-template-rows: repeat(4, 150px);
有一点比较尴尬的是,咱们每每不知道每一块的内容是多少,有时候内容的高度会溢出定义的高度,不过不用担忧,你可使用minmax(min, max)
使高度更灵活。
grid-template-rows: repeat(4, minmax(150px, auto));
以上,咱们就定义好了咱们网格系统的行列了。
在咱们的效果图中,咱们看到某些元素是占据了不止一行或者一列的,咱们能够经过给每一个元素(grid item)设置grid-column-start
, grid-column-end
来定义每个元素开始和结束的地方。
灰色底色的数字呢,就表明着列。好比你想你的第一个元素横跨两列,那么这个元素从1开始,横跨两列,到3结束:
grid-column-start: 1; grid-column-end: 3;
这样写,若是是后面的元素,计算它的开始位置实在不容易,所以你能够采用一种更现代的写法。经过span(扩展)
关键字,意味着从这个元素应该开始的位置扩展几列。
grid-column-start: span 2;
跨行也是一样的写法,只是经过grid-row-start
来定义。
最后,给每个元素定义它应该占据的行列:
.grid-container { display: grid; grid-template-columns: repeat(4, 1fr); grid-template-rows: repeat(4, minmax(150px, auto)); grid-gap: .5rem; } .box-1 { grid-column-start: span 2; grid-row-start: span 2; } .box-2 { grid-column-start: span 2; } .box-4 { grid-row-start: span 3; } .box-5 { grid-row-start: span 2; } .box-6 { grid-column-start: span 2; grid-row-start: span 2; }
最最最后,给你的元素加上你最喜欢的背景图吧!!
【参考资料】:Grid by Example