css3 Grid Layout 表格布局是在css中强大的难以置信的布局模块。它是二维空间的,因此它能够处理行和列css
它有些相似于Flexbox,可是又有本质的差异。Flexbox一样很强大,可是它主要是一维空间的。Flexbox能够处理列或者行,Grid能够同时处理二者。css3
综合运用它们,能够帮助咱们在css中实如今以前没法想象的布局浏览器
Grid 布局的开始都是开始于建立一个布局容器,能够经过在父元素声明display:grid;
。只要咱们这样声明了,这个父元素的全部直属子元素就变成了表格项目。在这点上和Flexbox是相似的。你会注意到css Gird 全部的表格样式都是定义到父元素上边的。布局
.parent { display: grid; }
如今全部直属子元素都是表格项目了。而后这并无改变子元素的显示方式,由于咱们只建立了一列。这里咱们须要建立网格轨道来建立更多的列。一个网格轨道是相邻网格线之间的空间,实质就是行或者列。在上图中,每个列之间的每一个空间就是轨道。spa
很是简单,咱们可使用grid-template-columns
和grid-template-rows
属性来添加列和行翻译
.parent { display: grid; grid-template-columns: 100px 100px 200px; }
如今咱们有了3列,并分别给了他们100px 100px 和 200px的宽度。若是咱们继续添加子元素,新增长的元素的宽素会继续按照100px 100px 和 200px的宽度顺序code
若是咱们想要在表格子元素之间插入一些空格,咱们应该怎么作呢?grid-gap
就是作这个的。ip
.parent { display: grid; grid-template-columns: 100px 100px 200px; grid-gap: 10px; }
若是咱们愿意的话,咱们还可使用grid-template-rows
给每一行定义尺寸样式。在下面的例子中,第一行高度是50px,第二行高度是200px,若是添加第三行的话高度就是50p xget
.parent { display: grid; grid-template-columns: 100px 100px 200px; grid-template-rows: 50px 200px 50px; grid-gap: 10px; }
使用像素单位是无法作自适用的布局的it
其实咱们有fr
这个单位,fr
表明网格容器中可用空间的一小部分。因此咱们切换px
到fr
。
.parent { display: grid; grid-template-columns: 1fr 1fr 1fr; grid-gap: 10px; }
这里表明三个意思
几列宽度是相等的(一个份数)
列的宽度是可变的(屏幕宽度的一个份数)
表格宽度根据容器宽度和元素之间的间距计算出来的
注意:根据DRY原则,咱们使用grid-template-columns: repeat(3, 1fr)
定义多个相等宽度的列
咱们能够仅仅改变份数的个数
.parent { display: grid; grid-template-columns: 1fr 2fr 1fr; grid-gap: 10px; }
咱们一样可使用混合单位。咱们可能想要一列宽度是固定的,其余两列宽度相等。那可能的定义以下
.parent { display: grid; grid-template-columns: 1fr 300px 1fr; grid-gap: 10px; }
咱们须要使用auto-fill
和auto-fit
来完成这个。咱们把上文的grid-template-columns
元素属性改为下面这样子
.parent { display: grid; grid-template-columns: repeat(auto-fill, 200px); grid-gap: 10px; }
auto-fill
表示咱们想要的轨道重复的次数。跟repeat(3, 200px)
不一样的是咱们告诉网格容器尽量多的插入200px的轨道(即使没有这么多轨道,也会插入隐形的不可见的轨道,或者按照有这么多轨道去布局)
可是!咱们好像又回到了刚才的问题了,咱们如何实现可变的布局呢?每一列宽度都是固定的200px,当没有足够空间留给下一个元素的时候,下一个元素会自动切换到下一行。可是咱们想要的是布满剩下的空间。
添加可变宽度的功能咱们须要使用minmax
。咱们能够设置最小宽度200px最大宽度是一个份数的功能
.parent { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); grid-gap: 10px; }
这表明着咱们能够看到尽量多的200px的轨道。可是, 若是有剩余的空间, 它将在它们之间平均分布。
大部分时间,这些元素的宽度是大于200px,这根据浏览器的宽度而决定。可是宽度并不会小于200px而且是可变和自适用哒!!!
最后一个问题就是当全部的元素都在第一行的时候
使用auto-fill
,Grid 建立尽量多的子元素放置在容器内。因此当没有这么多元素的时候,会在后面留下一块空白。这在某一方面很实用,可是有时候咱们并不想留下这么多空白,好比card布局。
咱们可使用auto-fit
代替auto-fill
解决上面提到的问题。auto-fit
使用尽量多的元素代替轨道,这就表明着会充满全部的空间。
auto-fill
= 使用轨道充满空间auto-fit
= 使用元素充满空间
.parent { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); grid-gap: 10px; }
How amazing!!!