(译)一篇对css网格布局的介绍

css3 Grid Layout 表格布局是在css中强大的难以置信的布局模块。它是二维空间的,因此它能够处理行和列css

它有些相似于Flexbox,可是又有本质的差异。Flexbox一样很强大,可是它主要是一维空间的。Flexbox能够处理列或者行,Grid能够同时处理二者。css3

综合运用它们,能够帮助咱们在css中实如今以前没法想象的布局浏览器

基础知识

一、定义表格容器

Grid 布局的开始都是开始于建立一个布局容器,能够经过在父元素声明display:grid;。只要咱们这样声明了,这个父元素的全部直属子元素就变成了表格项目。在这点上和Flexbox是相似的。你会注意到css Gird 全部的表格样式都是定义到父元素上边的。布局

.parent {
  display: grid;
}

clipboard.png

如今全部直属子元素都是表格项目了。而后这并无改变子元素的显示方式,由于咱们只建立了一列。这里咱们须要建立网格轨道来建立更多的列。一个网格轨道是相邻网格线之间的空间,实质就是行或者列。在上图中,每个列之间的每一个空间就是轨道。spa

二、添加行列

很是简单,咱们可使用grid-template-columnsgrid-template-rows属性来添加列和行翻译

.parent {
  display: grid;
  grid-template-columns: 100px 100px 200px;
}

clipboard.png

如今咱们有了3列,并分别给了他们100px 100px 和 200px的宽度。若是咱们继续添加子元素,新增长的元素的宽素会继续按照100px 100px 和 200px的宽度顺序code

clipboard.png

若是咱们想要在表格子元素之间插入一些空格,咱们应该怎么作呢?grid-gap就是作这个的。ip

.parent {
  display: grid;
  grid-template-columns: 100px 100px 200px;
  grid-gap: 10px;
}

clipboard.png

若是咱们愿意的话,咱们还可使用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;
}

clipboard.png

那如何定义宽度可变的表格呢?

使用像素单位是无法作自适用的布局的it

其实咱们有fr这个单位,fr表明网格容器中可用空间的一小部分。因此咱们切换pxfr

.parent {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-gap: 10px;
}

这里表明三个意思

  • 几列宽度是相等的(一个份数)

  • 列的宽度是可变的(屏幕宽度的一个份数)

  • 表格宽度根据容器宽度和元素之间的间距计算出来的

clipboard.png

注意:根据DRY原则,咱们使用grid-template-columns: repeat(3, 1fr)定义多个相等宽度的列

如何定义宽度不等的列

咱们能够仅仅改变份数的个数

.parent {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;
  grid-gap: 10px;
}

clipboard.png

咱们一样可使用混合单位。咱们可能想要一列宽度是固定的,其余两列宽度相等。那可能的定义以下

.parent {
  display: grid;
  grid-template-columns: 1fr 300px 1fr;
  grid-gap: 10px;
}

向容器内插入尽量多的网格元素

咱们须要使用auto-fillauto-fit来完成这个。咱们把上文的grid-template-columns元素属性改为下面这样子

.parent {
  display: grid;
  grid-template-columns: repeat(auto-fill, 200px);
  grid-gap: 10px;
}

auto-fill表示咱们想要的轨道重复的次数。跟repeat(3, 200px)不一样的是咱们告诉网格容器尽量多的插入200px的轨道(即使没有这么多轨道,也会插入隐形的不可见的轨道,或者按照有这么多轨道去布局)

clipboard.png

可是!咱们好像又回到了刚才的问题了,咱们如何实现可变的布局呢?每一列宽度都是固定的200px,当没有足够空间留给下一个元素的时候,下一个元素会自动切换到下一行。可是咱们想要的是布满剩下的空间。

添加可变宽度的功能咱们须要使用minmax。咱们能够设置最小宽度200px最大宽度是一个份数的功能

.parent {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  grid-gap: 10px;
}

这表明着咱们能够看到尽量多的200px的轨道。可是, 若是有剩余的空间, 它将在它们之间平均分布。

clipboard.png

大部分时间,这些元素的宽度是大于200px,这根据浏览器的宽度而决定。可是宽度并不会小于200px而且是可变和自适用哒!!!

最后的障碍

最后一个问题就是当全部的元素都在第一行的时候

clipboard.png

使用auto-fill,Grid 建立尽量多的子元素放置在容器内。因此当没有这么多元素的时候,会在后面留下一块空白。这在某一方面很实用,可是有时候咱们并不想留下这么多空白,好比card布局。

仅用3行css实现响应式布局

咱们可使用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!!!

翻译自 An introduction to CSS Grid

相关文章
相关标签/搜索