专栏首页樯橹代码(译)一篇对css网格布局的介绍

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

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

它有些类似于Flexbox,但是又有本质的差别。Flexbox同样很强大,但是它主要是一维空间的。Flexbox可以处理列或者行,Grid可以同时处理两者。

综合运用它们,可以帮助我们在css中实现在之前无法想象的布局

基础知识

1、定义表格容器

Grid 布局的开始都是开始于创建一个布局容器,可以通过在父元素声明display:grid;。只要我们这样声明了,这个父元素的所有直属子元素就变成了表格项目。在这点上和Flexbox是类似的。你会注意到css Gird 所有的表格样式都是定义到父元素上边的。

.parent {
  display: grid;
}

现在所有直属子元素都是表格项目了。然后这并没有改变子元素的显示方式,因为我们只创建了一列。这里我们需要创建网格轨道来创建更多的列。一个网格轨道是相邻网格线之间的空间,实质就是行或者列。在上图中,每一个列之间的每个空间就是轨道。

2、添加行列

非常简单,我们可以使用grid-template-columnsgrid-template-rows属性来添加列和行

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

现在我们有了3列,并分别给了他们100px 100px 和 200px的宽度。如果我们继续添加子元素,新增加的元素的宽素会继续按照100px 100px 和 200px的宽度顺序

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

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

如果我们愿意的话,我们还可以使用grid-template-rows给每一行定义尺寸样式。在下面的例子中,第一行高度是50px,第二行高度是200px,如果添加第三行的话高度就是50p x

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

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

使用像素单位是没法做自适用的布局的

其实我们有fr这个单位,fr代表网格容器中可用空间的一小部分。所以我们切换pxfr

.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-fillauto-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布局。

仅用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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 10条提高网站可访问性的建议

    我们收集了10条提高网站可访问性的建议以保证网站你的网站对任何人都是友好的,包括残疾人。

    frontoldman
  • css3 nth-child选择器

    大概大家都知道上面的使用方法,但是有一点搞不清楚的话,使用起来就会很困惑。那就是n是什么?

    frontoldman
  • CSS和网络性能

    CSS对于呈现页面至关重要 - 在找到,下载和解析所有CSS之前,浏览器不会开始呈现 - 因此我们必须尽可能快地将其加载到用户的设备上。 关键路径上的任何延迟都...

    frontoldman
  • CSS画各种图形(五角星、吃豆人、太极图等)

    余生
  • 选择缓解风险的技术

    三. 选择缓解风险的技术 一旦识别出迁移过程中可能存在的风险,我们就可以有的放矢地选择相关技术,制订降低风险的解决方案。 寻找丢失的知识 只有体验过去,才能谋...

    张逸
  • 小程序实践(十):textarea实现简单的编辑文本界面

    听着music睡
  • px和rem的换算与设置

    一般所有浏览器的html根元素font-size:16px 1rem = 16px 所以所有px值都基于它来换算 设计稿px/换算的rem = 16px ...

    杨肆月
  • 黑客用比特币代码漏洞生产出2.35亿个PGN代币,潜在风险或进一步扩大

    几周前,比特币代码中发现了一个严重的 bug,现在这个bug已经被黑客利用在了一个鲜为人知的加密货币身上,并且大量生产出了大量代币。

    周俊辉
  • Vue在webpack中使用vue-router

    Dream城堡
  • Dubbo 3.0 即将到来

    据了解,新的 Dubbo 内核与 Dubbo 2.0 完全不同,但它兼容 2.0。Dubbo 3.0 将以 Streaming 为内核,而不再是 2.0 时代的...

    高广超

扫码关注云+社区

领取腾讯云代金券