资讯专栏INFORMATION COLUMN

CSS Grid布局:网格单元格布局

maxmin / 1950人阅读

摘要:基于网格线的占位区网格中的单元格是有网格线划分出来的,那么在网格布局中,同样可以使用网格线来给子元素设置占位区域。也就是说这四条网格线间的区域是一个单元格。

CSS Grid布局对于我等来说就是一个全新的布局,但国外很多同行朋友已对这种布局做了全面的探知。前面花了两篇内容(《CSS Grid布局:什么是网格布局》和《[CSS Grid布局:浏览器开启CSS Grid Layout]http://segmentfault.com/blog/younglaker/1190000002443795)》)为这篇文章做足了铺垫。或许你想知道的是如何使用?各位看官不用太急,接下来通过各种实例向大家阐述CSS Grid布局,让我们一起领略其强大的魅力。

当然,接下来的示例不是我想出来的,这是我挖出来的,主要制作者是Rachel Andrew。在继续往下阅读之前,我们应该一起感谢Rachel Andrew,感谢他给我们提供这么多有关于CSS Grid Layout的示例。同时如果你想在你的浏览器中能正常的演示接下的有关于CSS Grid Layout的示例,你得先保证你已阅读了《CSS Grid布局:浏览器开启CSS Grid Layout》一文,并且按照文章中的方法进行过设置。如果没有话,或许你将看不到下面示例的效果。咱也不纠结了,开始实战吧。

定义一个网格

可以给父容器的display属性设置为grid或者inline-grid来定义一个网格。这样你就可以使用grid-template-columnsgrid-template-rows属性来创建一个网格。

在这个示例中,创建了一个三列网格,其中三个列的列宽是100px,并且指定列与列之间的间距为10px。同时网格具有三行,每行的高度是自动的,另外行与行之间的间距是10px。简单点说就是一个三行三列的网格,并且列与列之间,行与行之间的间距都是10px

此时浏览器将容器中的子元素自动填入到每个网格单元格中,当超过指定的列数时,网格会自动换行,如下图所示:

看看代码是怎么完成的:

HTML
A
B
C
D
E
F
G
H
I
J
CSS
body {
  padding: 50px;
}
.wrapper {
  display: grid;
  grid-template-columns: 100px 10px 100px 10px 100px;
  grid-template-rows: auto 10px auto;
}
.box {
  background-color: #444;
  color: #fff;
  font-size: 150%;
  padding: 20px;
}
.b,.d,.g,.i {
  background-color:red;
}

定义网格的关键代码:

.wrapper {
  display: grid;
  grid-template-columns: 100px 10px 100px 10px 100px;
  grid-template-rows: auto 10px auto;
}

在线案例

从示例效果中可以看出,.wrapper容器通过display:grid;定义成网格,并且使用grid-template-columns:100px 10px 100px 10px 100px;grid-template-rows:auto 10px auto;指定了列宽、列间距,行高和行间距等。对应的子元素.a.c.e.f.h.j列宽度为100px(也就是黑色区域),而.b.d.g.i是列与列的间距10px(也就是红色区域)。而且当子元素在一行填不下时,就会自动换行,如.f.j自动换到第二行显示。

基于网格线的占位区

网格中的单元格是有网格线划分出来的,那么在网格布局中,同样可以使用网格线来给子元素设置占位区域。基于上例,在容器.wrapper下面有十个子元素.a~.j,接下来看如何通过基于网格线来实现各种在网格布局中的区域。

对于网格线,在网格布局中有两种,一种是列线,另一种是行线。对应的个网格单元格都有列线起始线(grid-column-start)、列线终止线(grid-column-end)和行线起始线(grid-row-start)、行线终止线(grid-row-end)。

如上图所示,紫色的是列网格线,而蓝色的是行网格线,其中高亮大红的那个单元格列起始线是line3,列终止线是line4,行起始线是line3,行终止线是line4。也就是说这四条网格线间的区域是一个单元格。

接下来,看一个示例,如何用网格线实现单元格占位区域:

HTML
A
B
C
D
E
F
G
H
I
J
CSS
body {
  padding: 50px;
}
.wrapper {
  display: grid;
  grid-template-columns: 100px 10px 100px 10px 100px 10px 100px;
  grid-template-rows: auto 10px auto 10px auto;
}
.box {
  background-color: #444;
  color: #fff;
  font-size: 150%;
  padding: 20px;
  text-align: center;
}
.a{
  grid-column-start: 1;
  grid-column-end: 2; 
  grid-row-start: 1;
  grid-row-end: 2;
}
.b {
  grid-column-start: 3;
  grid-column-end: 4; 
  grid-row-start: 1;
  grid-row-end: 2; 
}
.c { 
  grid-column-start: 5;
  grid-column-end: 6; 
  grid-row-start: 1;
  grid-row-end: 2;
}
.d { 
  grid-column-start: 7;
  grid-column-end: 8; 
  grid-row-start: 1;
  grid-row-end: 2;
}
.e { 
  grid-column-start: 1;
  grid-column-end: 2; 
  grid-row-start: 3;
  grid-row-end: 4;
}
.f { 
  grid-column-start: 3;
  grid-column-end: 4; 
  grid-row-start: 3;
  grid-row-end: 4;
}
.g {
  grid-column-start: 5;
  grid-column-end: 6; 
  grid-row-start: 3;
  grid-row-end: 4;
}
.h {
  grid-column-start: 7;
  grid-column-end: 8; 
  grid-row-start: 3;
  grid-row-end: 4;
}
.i {
  grid-column-start: 1;
  grid-column-end: 2; 
  grid-row-start: 5;
  grid-row-end: 6;
}
.j {
  grid-column-start: 3;
  grid-column-end: 4; 
  grid-row-start: 5;
  grid-row-end: 6;
}

在线案例

这种方式可以让你的子元素.a~.b定位在任何位置,比如说,你现在想要.a.f对换,那么很简单就能实现:

.a{
  grid-column-start: 3;
  grid-column-end: 4; 
  grid-row-start: 3;
  grid-row-end: 4;
  background:red;
}
.f { 
  grid-column-start: 1;
  grid-column-end: 2; 
  grid-row-start: 1;
  grid-row-end: 2;
  background:orange;
}

运行的效果如下:

在线案例

网格线简写

前面两个示例向大家演示了如何用网格线实现布局,可以说是简单方便,唯一就是写代码麻烦,要什么grid-column-startgrid-column-end等等。其实有一种简写方式,可以让你不再痛苦。

网格线的简写方式,其实就是grid-columngrid-rowstartend值合并在一起,两者之间用/来分隔。比如:

.a{
  grid-column-start: 1;
  grid-column-end: 2; 
  grid-row-start: 1;
  grid-row-end: 2;
}

可以写成:

.a{
  grid-column: 1 / 2; 
  grid-row: 1 / 2;
}

这样一来,上例的代码,我们就可以换成简写方式:

.a{
  grid-column: 1 / 2; 
  grid-row: 1 / 2;
}
.b {
  grid-column: 3 / 4; 
  grid-row: 1 / 2; 
}
.c { 
  grid-column: 5 / 6; 
  grid-row: 1 / 2;
}
.d { 
  grid-column: 7 / 8; 
  grid-row: 1 / 2;
}
.e { 
  grid-column: 1 / 2; 
  grid-row: 3 / 4;
}
.f { 
  grid-column: 3 / 4; 
  grid-row: 3 / 4;
}
.g {
  grid-column: 5 / 6; 
  grid-row: 3 / 4;
}
.h {
  grid-column: 7 / 8; 
  grid-row: 3 / 4;
}
.i {
  grid-column: 1 / 2; 
  grid-row: 5 / 6;
}
.j {
  grid-column: 3 / 4; 
  grid-row: 5 / 6;
}

效果依旧:

在线案例

网格区域实现元素占位区

在CSS Grid Layout中有一个关键东东,网格区域grid-area。网格区域他是由四条网格线组成的一个空间,简单点说,一个网格单元格也是一个网格区域(因为他也是有四条网格线组成的一个空间),多个单元格合并在一起也是一个网格区域。这样一来,要实现上例的效果,还可以使用网格区域grid-area来完成。

在具体做案例之前,先简单的了解,网格区域是由哪几条网格线组成。组成网格区域的网格线顺序是row-start/column-start/row-end/column-end。每个网格线之间也是使用/来分隔。

接下来将上例使用网格区域改造一下,改造之后的样式代码如下:

.wrapper {
  display: grid;
  grid-template-columns: 100px 10px 100px 10px 100px 10px 100px;
  grid-template-rows: auto 10px auto 10px auto;
}
.a{
  grid-area: 1 / 1 / 2 / 2;
}
.b {
  grid-area: 1 / 3 / 2 /4;
}
.c { 
  grid-area: 1 / 5 / 2 / 6;
}
.d { 
  grid-area: 1 / 7 / 2 / 8;
}
.e { 
  grid-area: 3 / 1 / 4 / 2;
}
.f {
  grid-area: 3 / 3 / 4 / 4;
}
.g {
  grid-area: 3 / 5 / 4 / 6;
}
.h {
  grid-area: 3 / 7 / 4 / 8;
}
.i {
  grid-area: 5 / 1 / 6 / 2;
}
.j {
  grid-area: 5 / 3 / 6 / 4;
}

效果如下:

在线案例

是不是让你的世界变得更简单了。

总结

在这篇文章中主要通过几个简单的实例向大家演示了如何使用定义网格,又是如何使用网格线实现单元格布局,可以说这样的布局弱爆了,和表格的单元格没有什么不一样嘛,但现实是残酷的,我们的布局是星罗万像,没有这么简单。不是说CSS Grid Layout很强大嘛,那又要如何实现一些复杂的布局呢?敬请观注下章分解,向大家阐述如何实现单元格合并效果。

via w3cplus

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/110978.html

相关文章

  • CSS Grid布局:什么是布局

    摘要:网格单元格网格单元格是指四条网格线之间的空间。所以它是最小的单位,就像表格中的单元格。图中突出显示的网格区域是行线和列线之间的区域,其主要包括了四个网格单元格。 CSS Grid现在已经被W3C纳入到CSS3的一个布局模块当中,被称为CSS Grid Layout Module。而我们较为熟悉的还是将其想像成网格或者栅格,也就是早期的960gs。不管是网格还是栅格或者现在的CSS Gr...

    xiaoqibTn 评论0 收藏0
  • CSS Grid布局:合并单元布局

    摘要:简单点说,就是由单元格慢慢过渡到具有合并单元格的布局在脑海中想想曾经爱过的。基于网格线使用关键词实现单元格合并在布局中除了使用网格线合并单元格之外,还可以使用关键词来实现单元格合并。 《CSS Grid布局:网格单元格布局》一文中通过一些简单的实例介绍了如何给容器定义网格,并且怎么使用网格线或者网格区域来实现单元格这样的简单的布局。在文章结尾之处也提到过,这样的单元格如同表格一样,仅仅...

    pf_miles 评论0 收藏0
  • CSS Grid 布局完全指南(图解 Grid 详细教程)

    摘要:重复网格区域的名称导致内容跨越这些单元格。中间一排将由两个区域,一个是空单元格,一个区域组成。你可以使用任意数量的相邻的点来声明单个空单元格。只要这些点之间没有空隙隔开,他们就代表一个单独的单元格。  CSS Grid 布局是 CSS 中最强大的布局系统。与 flexbox 的一维布局系统不同,CSS Grid 布局是一个二维布局系统,也就意味着它可以同时处理列和行。通过将 CSS 规则应用...

    flybywind 评论0 收藏0
  • 嘿~ 是时候学学栅布局GRID了 概念篇

    摘要:网格线网格线有横线和纵线,纵横交错的线就将网格容器切割成了最小的单元单元格。单元格图中绿色背景的块就是单元格,网格布局的最小计量单位,该容器一共有个单元格。 下一篇 grid 布局入门 Grid,真的布局神器。Css在引入Flex布局和Grid布局两个模块后,才真正有了布局的概念。最初的table布局不知道是神马鬼,再到 float 满天飞,可能还要使用abosulte来实现页面的布局...

    source 评论0 收藏0
  • CSS Grid 系列(上)-Grid布局完整指南

    摘要:浏览器已经宣布将支持标准的语法,但暂未支持。重复网格区域的名称导致内容扩展到这些单元格。点号表示一个空单元格。中间一行将由两个区域一个空单元格和一个区域组成。只要这些点号之间没有空格,他们就代表了一个单一的单元格。 by Chris House 译者:若愚老师想要更好的阅读体验可在饥人谷技术博客 查看原文 CSS 网格布局(Grid Layout) 是CSS中最强大的布局系统。 这是一...

    yy13818512006 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<