上周发过一篇关于flex布局的文章,但发完之后我感觉我并没有写很多自己对flex布局的理解,因为原链接的作者的轮子实在是太强了,这里借用知乎大佬牛岱的话来说,当人家已经有足够好的轮子,你就不要试图,甚至是通过各种手段,试图去取代这个轮子的地位。我觉的很正确(偷偷diss某些学校的计算机专业仍然用某本书当做C语言入门,真的是从入门到放弃),所以说花生直接按照原文来翻译了(真的很棒),若有翻译错误,欢迎指出!!!
grid布局是CSS最强的布局方式,它是一种二维布局,它可以处理行与列,它不同于之前一维的flex布局。在grid布局中,父容器充当一个(Grid Container),子元素充当(Grid Item)。

注意!!长篇警告,但是很赚

1.基本浏览器的支持

2.grid布局的属性与属性值

2.1父容器的属性与属性值

2-1-1 display

.container { 
  display: grid | inline-grid;
}
将元素定义为网格容器,并为其内容建立新的网格格式上下文,对于grid来说,是产生一个块级的grid容器,而inline-grid就不用我说了吧

2-1-2 grid-template-columns grid-template-rows

.container { grid-template-columns: <track-size> ... | <line-name> <track-size> ...; 
  grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
}
这里track-size(轨道尺寸)的意思我觉的是一条线段的长度吧(就如图2-1的40px和50px),line-name的意思是你可以给这条线段取个名字,track-size可以用px,%,fr(fraction)也就是分数的意思或者说fr为单位的轨道中占的比例
举个栗子
.container { 
  grid-template-columns: 40px 50px auto 50px 40px;
  grid-template-rows: 25% 100px auto;
}
里面的[1],[2]...是track的名字(line-name) ,你也可以自己命名,如图2-2
.container { 
  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}
注意:一条线也可以有多个名字,就比如说下面的例子

.container { 
  grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}
对于Grid布局来说你还可以用计算的方法来布局,你可以用repeat(),让我们看看下面代码
.container { 
  grid-template-columns: repeat(3, 20px [col-start]);
   /*上面等同于下面*/
  grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start];
}
下面我就说说关于fr的计算
.container { 
  grid-template-columns: 1fr 1fr 1fr;
/*举例两种例子*/
  grid-template-columns: 1fr 50px 1fr 1fr;
}

上面那行的代码表示:每一个轨道占父容器的1/3,假如父容器是900px,就分成了(300px 300px 300px),而下面的就会这样计算(900-50)/3,然后平均分给每一个轨道,(283.3px 50px 283.3px 283.3px)

2-1-3 grid-template-areas

通过使用grid-area属性指定子元素具体在父容器的位置,.(句号)表示空的单元格(grid-item:就像小学生的网格本里面的一个个格子),我觉的这个属性太强了
.container { 
  grid-template-areas: "<grid-area-name> | . | none | ..." /*就是每一个子元素的名字*/ "...";
}
举个栗子
.item-a { 
  grid-area: header;
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer; 、
}
.container {
  display: grid;
  grid-template-columns: 50px 50px 50px 50px;
  grid-template-rows: auto;
  grid-template-areas: "header header header header" "main main . sidebar" "footer footer footer footer";
}
我觉的光是看上面父容器的grid-template-areas就知道具体的布局是怎样的吧
声明中的每一行都需要相同数量的单元格,而且你可以用任意数量的句号来代表一个空单元格,只要它们之间没有空格,就代表一个单元格。注意,当使用area时浏览器会自动的为每一个区域两端的线条命名,若网格区域的名称为foo,则区域的起始行的名称为foo-start,最后一行为foo-end。这意味着某些行可能有多个名称。就像图2-3中父容器的最左边的那条线被三个子元素共享所以你懂得...

2-1-4 grid-template

这是grid-template-rows,grid-template-columns, 和grid-template-areas简写,
.container { 
  grid-template: none | <grid-template-rows> / <grid-template-columns>;
/*其中none设置后就是后面的两个的初始值*/
}
举个例子
.container { 
  grid-template: [row1-start] "header header header" 25px [row1-end] [row2-start] "footer footer footer" 25px [row2-end] / auto 50px auto;
}
/*等同与下面*/
.container {
  grid-template-rows: [row1-start] 25px [row1-end row2-start] 25px [row2-end];
  grid-template-columns: auto 50px auto;
  grid-template-areas: "header header header" "footer footer footer";
}
因为grid-template不会重置隐式网格属性(grid-auto-columns, grid-auto-rows, and grid-auto-flow),这可能是你在大多数情况下要执行的操作,因此建议使用网格属性而不是网格模板

2-1-5 grid-column-gap grid-row-gap grid-gap

gap在英文中有间隔、缺口的意思,因此就是每个子元素之间的间隔
.container { 
  grid-column-gap: <line-size>;
  grid-row-gap: <line-size>;
}
举个栗子
.container { 
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px; grid-column-gap: 10px;
  grid-row-gap: 15px;
/*上面等同下面*/
  grid-gap: <grid-row-gap> <grid-column-gap>;
  grid-gap: 15px 10px;
/*若没有grid-row-gap,则设置同grid-column-gap相同的值*/ }

2-1-5 justify-items align-item place-items

这个属性和flex布局中的align-items有点像,但是还是有点区别,因为是二维布局所以在Grid中多了一个justify-items, align-item的例子和justify-items很像,一个横轴一个是纵轴

.container { 
  justify-items: start | end | center | stretch;
  align-items: start | end | center | stretch;
  place-items: <align-items> / <justify-items>;
/*如果第二个值没有设置就等同于第一个值*/
}
栗子
.container { 
  justify-items: start;
}
end和center看过之前的flex布局讲解想必大家都知道了吧
.container { justify-items: stretch; }

2-1-6 justify-content align-content place-content

是不是感觉很熟悉,没错就和flex中的布局方式相同的,给个图片就知道了
.container { 
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;
  place-content: <align-content> / <justify-content>;
  /*如果第二个值没有设置就等同于第一个值*/
}
就举一个栗子哈~
.container { justify-content: start; }
align-content和justify-content同理,一个是横轴一个是纵轴,这个属性和flex的justify-content是相同道理的,如果不懂可以去看我之前的flex文章

2-1-7 grid-auto-columns grid-auto-rows

当grid-item多余网格中的单元格或grid-item放置在显示网格之外,将创建隐式track
举个栗子
.container { 
  grid-auto-columns: <track-size> ...;
  grid-auto-rows: <track-size> ...;
} /*--------------------------------*/ /*图2-8是下面的栗子*/
.container {
  grid-template-columns: 60px 60px;
  grid-template-rows: 90px 90px
}
/*这两个属性会在子元素的属性中介绍*/ .item-a { grid-column: 1 / 2; /*在纵轴上,item-a处于第一条线和第二条线之间*/ grid-row: 2 / 3; /*在横轴上,item-a处于第二条线和第三条线之间*/ } .item-b { grid-column: 5 / 6;/*如上同*/ grid-row: 2 / 3; }
grid-column和grid-row还是很好理解的,就是子元素处在父元素上的位置,由上图可知纵轴的第五条线和第六条线是不存在的,隐式track就会创建两个0线来填充此间隔,我们用grid-template-columns和grid-template-rows就可以指定隐式轨道的宽度
.container { grid-auto-columns: 60px; }

2-1-7 grid-auto-flow

还记得我上篇文章提过的流布局吗,假如你没有明确子元素放置在网格上的网格项,则会根据自动放置算法来放置,也就可以通过自动的流来布局
.container { 
  grid-auto-flow: row | column | row dense | column dense
}
  • row(默认):就是正常的流,从左到右的顺序
  • column: 你们知道css还有writing-mode这个属性吗 设置为writing-mode: horizontal-tb;流向就为从上到下了,此处同理是如此
  • dense: 让稍后出现较小的子元素尝试填充网格中较早的洞,可能会导致子元素的可视顺序错乱,所以不仔细讨论
举个栗子
<section class="container"> 
  <div class="item-a">item-a</div>
  <div class="item-b">item-b</div>
  <div class="item-c">item-c</div>
  <div class="item-d">item-d</div>
  <div class="item-e">item-e</div>
</section>
.container { 
  display: grid;
  grid-template-columns: 60px 60px 60px 60px 60px;
  grid-template-rows: 30px 30px;
  grid-auto-flow: row;
}
只指定两个子元素的位置
.item-a { 
  grid-column:;
  grid-row: 1 / 3;
}
.item-e {
  grid-column:;
  grid-row: 1 / 3;
}
当设置父容器中grid-auto-flow: column

2-1-7 grid是grid-template-rows,grid-template-columns,grid-template-areas,grid-auto-flow的简写 详细的可以看MDN官网

以上就是Grid中父容器的属性与属性值啦!!相信各位小伙伴们看的也很累,我敲的也累哇!

2.2子元素的属性与属性值

首先注意float,display: inline-block,display: table-cell,vertical-alignandcolumn-*对子元素没有影响

2-2-1 grid-column-start grid-column-end grid-row-start grid-row-end

.item { 
  grid-column-start: <number> | <name> | span <number> | span <name> | auto grid-column-end: <number> | <name> | span <number> | span <name> | auto grid-row-start: <number> | <name> | span <number> | span <name> | auto grid-row-end: <number> | <name> | span <number> | span <name> | auto
}
相信大家接触过前面的grid-start和grid-end已经有了足够多的了解了吧!!
.item-a { 
  grid-column-start:;
  grid-column-end: five;
  grid-row-start: row1-start grid-row-end: 3;
}

2-2-2 grid-area

.item { 
  grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}
为子元素指定名称,以便可以使用grid-template-areas,或者可以作为grid-row-start + grid-column-start+grid-row-end+grid-column-end的简写
.item-d { grid-area: header } /*或者*/

2-2-3 justify-self align-self place-self

.item { 
/*stretch都是默认填充容器的*/
  justify-self: start | end | center | stretch;
  align-self: start | end | center | stretch;
  place-self: <align-self> / <justify-self>;/*和前面一样第二个没有设置值同第一个,*/
}
这个就和flex布局中的align-self很像了,就如前面的justify-content一样
.item-a { 
  justify-self: start;
  align-self: start;
  place-self: center;
  place-self: center stretch;
}

2-15 justify-self: start;

2-16 align-self: stretch;

2-17 place-self: center;

2-18 place-self: center stretch;

以上就是本期的所有翻译了,写了一下午,相信大家看到这里也很累,但是我相信你们肯定有所收获,相信大家也对flex布局和grid布局有了一个清晰的认识了,是不是觉的很强大,如果对兼容性没有要求的话,可以考虑用用哟~,真的能够提高生产力,如果觉的不错,请点个赞哟~~
参考链接
 

学懂grid布局:这篇就够了(译)的更多相关文章

  1. rodert教你学FFmpeg实战这一篇就够了

    rodert教你学FFmpeg实战这一篇就够了 建议收藏,以备查阅 pdf阅读版: 链接:https://pan.baidu.com/s/11kIaq5V6A_pFX3yVoTUvzA 提取码:jav ...

  2. 轻轻松松学CSS:Grid布局

    网页布局总的来说经历了以下四个阶段: 1.古老的table表格布局,现在基本已被淘汰. 2.float浮动布局(或者position定位布局),借助float.position 等属性等进行布局,这种 ...

  3. 如果只有1小时学Python,看这篇就够了

    大家好,我是大鹏,城市数据团联合发起人,致力于Python数据分析.数据可视化的应用与教学. 和很多同学接触过程中,我发现自学Python数据分析的一个难点是资料繁多,过于复杂.大部分网上的资料总是从 ...

  4. 服务监控 | 彻底搞懂Dropwizard Metrics一篇就够了

    Metrics是一个提供服务性能检测工具的Java类库,它提供了功能强大的性能指标工具库用于度量生产环境中的各关键组件性能. 度量类型 Metrics提供了以下几种基本的度量类型: Gauge:用于提 ...

  5. 就是要让你搞懂Nginx,这篇就够了!

    开源Linux 长按二维码加关注~ 作者:渐暖° 出处:blog.csdn.net/yujing1314/article/details/107000737 来源:公众号51CTO技术栈 Nginx ...

  6. C#实现多级子目录Zip压缩解压实例 NET4.6下的UTC时间转换 [译]ASP.NET Core Web API 中使用Oracle数据库和Dapper看这篇就够了 asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 asp.net core异步进行新增操作并且需要判断某些字段是否重复的三种解决方案 .NET Core开发日志

    C#实现多级子目录Zip压缩解压实例 参考 https://blog.csdn.net/lki_suidongdong/article/details/20942977 重点: 实现多级子目录的压缩, ...

  7. 学Redis这篇就够了!

    学Redis这篇就够了!   作者:王爷科技 https://www.toutiao.com/i6713520017595433485 Redis 简介 & 优势 Redis 数据类型 发布订 ...

  8. Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介

    Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...

  9. 30分钟彻底弄懂flex布局

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由elson发表于云+社区专栏 目前在不考虑IE以及低端安卓机(4.3-)的兼容下,已经可以放心使用flex进行布局了.什么是flex布 ...

随机推荐

  1. P1886 滑动窗口

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  2. 洛谷 P2218 [HAOI2007]覆盖问题 解题报告

    P2218 [HAOI2007]覆盖问题 题目描述 某人在山上种了\(N\)棵小树苗.冬天来了,温度急速下降,小树苗脆弱得不堪一击,于是树主人想用一些塑料薄膜把这些小树遮盖起来,经过一番长久的思考,他 ...

  3. rematch的基本用法

    rematch是对redux的二次封装,简化了redux是使用,极大的提高了开发体验.rematch仅仅是对redux的封装,没有依赖redux-saga,也没有关联react,因此其可以用在其他的视 ...

  4. 【bzoj3224】Tyvj 1728 普通平衡树 01Trie姿势+平衡树的四种姿势 :splay,旋转Treap,非旋转Treap,替罪羊树

    直接上代码 正所谓 人傻自带大常数 平衡树的几种姿势:  AVL Red&Black_Tree 码量爆炸,不常用:SBT 出于各种原因,不常用. 常用: Treap 旋转 基于旋转操作和随机数 ...

  5. taotao用户登录springMVC拦截器的实现

    在springMVC中写拦截器,只需要两步: 一.写 java 拦截器类,实现 interceptor 拦截器接口. 二.在 springMVC 的xml配置文件中,配置我们创建的拦截器对象及其拦截目 ...

  6. noip 2011观光公交

    P1315 观光公交 95通过 244提交 题目提供者该用户不存在 标签贪心递推2011NOIp提高组 难度提高+/省选- 提交该题 讨论 题解 记录   题目描述 风景迷人的小城Y 市,拥有n 个美 ...

  7. URAL1277 Cops and Thieves(最小割)

    Cops and Thieves Description: The Galaxy Police (Galaxpol) found out that a notorious gang of thieve ...

  8. CodeSmith和PowerDesigner (转)

    首先,既然要讲解如何使用CodeSmith和PowerDesigner快速生成批量代码,当然要先安装这2个软件啦,下面就简单说说如何安装破解这2款软件吧,当然破解只是学习之用,请大家不要用于商业用途哈 ...

  9. loj6087 毒瘤题

    传送门:https://loj.ac/problem/6087 [题解] 这垃圾题目卡空间啊... k=1相信大家都会,把所有数异或起来就是答案了. 考虑k=2,把所有数异或起来得到两个答案数的异或值 ...

  10. bzoj2811 [Apio2012]Guard

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2811 [题解] 首先我们先把没看到忍者的段去掉,可以用线段树做. 如果剩下的就是K,那么特判 ...