css 20分钟玩转 grid

简介

CSS网格布局擅长于将一个页面划分为几个主要区域,以及定义这些区域的大小、位置、层次等关系。


网页基本布局

学习grid布局之前,请先了解 flex 布局,有一定相似性,但这个更强大一些。

属性

  1. display 设置网格布局
.wrapper {
  display: grid;
}

如上图所示,默认为块级元素,独占一行。


.wrapper {
  display: inline-grid;
}

如上图所示,也可设为行内块元素,与其他元素并排。

  1. grid-template 设置网格区域
    设置每一列宽:grid-template-columns: <track-size> ... | <line-name> <track-size> ...;
    设置每一行高:grid-template-rows: <track-size> ... | <line-name> <track-size> ...;
    设置网格布局允许指定区域:grid-template-areas: "<grid-area-name> | . | none | ..." "...";
    <track-size> - can be a length, a percentage, or a fraction of the free space in the grid (using the [fr](https://css-tricks.com/snippets/css/complete-guide-grid/#fr-unit) unit)
    <line-name> - an arbitrary name of your choosing
    <grid-area-name> - the name of a grid area specified with `[grid-area]
.wrapper {
  display: grid;
  grid-template-columns: 50px 50px 50px;
  grid-template-rows: 50px 50px 50px;
  /* grid-template-columns: 33.33% 33.33% 33.33%;
  grid-template-rows: 33.33% 33.33% 33.33%; */
}

如上图所示,设置每一列为50px,每一行为50px,也可设为33.33%,等价的。

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
}

也可使用repeat属性值,第一个为参数为重复的次数,第二个参数为重复的值。

.wrapper {
  display: grid;
  /* grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: 1fr 1fr 1fr; */
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
}

也可使用fr属性值(fraction,每一分块区域),如果两列的宽度分别为1fr3fr,就表示后者是前者的三倍。

.wrapper {
  display: grid;
  grid-template-columns: 50px 2fr 1fr;
  grid-template-rows: repeat(3, 1fr);
}

如上图所示,我们经常会结合pxfr一起用,第一列50px,剩下两列分三份分100px,第二列站2份,第三列站1份,因此上面列宽依次为50px 66.66px 33.33px

.wrapper {
  display: grid;
  grid-template-columns: 50px minmax(40px, 100px) 20px;
  grid-template-rows: repeat(3, 1fr);
  /* grid-template-columns: 50px minmax(40px, 100px) minmax(20px, 40px);
  grid-template-rows: repeat(3, 1fr); */
}

如上图所示,可设置minmax属性值来设置大小,中间这一列最小值为40px,最大值为100px,因此上面列宽依次为50px 80px 20px

.wrapper {
   display: grid;
   grid-template-columns: 50px minmax(40px, 100px) minmax(20px, 40px);     
   grid-template-rows: repeat(3, 1fr);
}

如上图所示,列宽依次是50px 60px 40px,是怎样计算呢?
how-the-minmax-function-works

.wrapper {
   display: grid;
   grid-template-columns: 20px auto auto;
   grid-template-rows: repeat(3, 1fr);
}

如上图所示,可设置auto属性值,让浏览器绝对长度,因此上面列宽依次为20px 65px 65px

.grid-template-areas {
  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';
}
.item-1 {
  grid-area: header;
}
.item-2 {
  grid-area: main;
}
.item-3 {
  grid-area: sidebar;
}
.item-4 {
  grid-area: footer;
}

如上图所示,grid-template-areas设置4x3网格, grid-area对应所选区域,.代表不填充,留空白。

  1. grid-gap设置行与行间距、列与列间距
    grid-gap: <grid-row-gap> <grid-column-gap>;
.container {
  display: grid;
  grid-template-columns: 100px 50px 100px;
  grid-template-rows: 80px auto 80px;
  grid-gap: 15px 10px;
  /* grid-row-gap: 15px;
  grid-column-gap: 10px; */
}

如上图所示,设置行间距为15px,列间距为10px

  1. grid-auto-flow 设置排列方式,默认“先行后列”
    grid-auto-flow: row | column | row dense | column dense
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
}
.item-1 {
  /* 代表所占列的网格线为1~3,grid-row 不写默认为所占行的网格线为1~2 */
  grid-column: 1 / 3; 
}
.item-2 {
  grid-column: 1 / 3;
}

如上图所示,为默认排列,先行后列,放不下就放到下一行。

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: repeat(3, 1fr);
  grid-auto-flow: row dense;
}
.item-1 {
  /* 代表所占列的网格线1~3,grid-row 不写默认为所占行的网格线1~2 */
  grid-column: 1 / 3;
}
.item-2 {
  grid-column: 1 / 3;
}

上图所排为默认排列,先行后列,并且紧凑,尽量不留空隙。

  1. place-items 设置网格内容的位置
    place-items: <align-items> <justify-items>; 先竖直后水平
    水平位置:justify-items: start | end | center | stretch;
    竖直位置:align-items: start | end | center | stretch;
  • start:对齐网格的起始边缘
  • end:对齐网格的结束边缘
  • center:网格内部居中
  • stretch:拉伸,占满网格的整个宽度(默认值)。
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
  place-items: start end;
}

如上图所示,竖直位置内容从上到下排列,水平位置内容从左到右排列。

.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
  place-items: start stretch;
}

如上图所示,竖直位置内容从上到下排列,水平位置拉伸占满网格的整个宽度。

  1. place-content设置整个内容区域在容器里面的位置
    place-content: <align-content> <justify-content>
    水平位置:justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
    垂直位置: align-content:start | end | center | stretch | space-around | space-between | space-evenly;
  • start: 将网格对齐以与容器的起始边缘齐平
  • end: 将网格对齐以与容器的末端边缘齐平
  • stretch: 调整网格的大小填充容器的整个宽度(默认值)
  • space-around: 每个网格两侧的间隔相等,两端到容器的间隔是网格的一半
  • space-between: 网格与网格的间隔相等,网格与容器边框之间没有间隔
  • space-evenly: 每个网格之间间距相同,包括到两端距离
.wrapper {
  box-shadow: 0px 0px 2px 1px #cccccc;
  width: 250px;
  height: 250px;
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
  place-content: end end;
}

如上图所示,整个内容区在容器的水平方向末端,竖直方向末端。

.wrapper {
  box-shadow: 0px 0px 2px 1px #cccccc;
  width: 250px;
  height: 250px;
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
  place-content: space-evenly space-evenly;
}

如上图所示, 每个网格之间间距相同,包括到两端距离。

  1. grid-auto-rows grid-auto-column设置超出定义网格的网格大小
.wrapper {
  box-shadow: 0px 0px 2px 1px #cccccc;
  width: 250px;
  height: 250px;
  box-sizing: border-box;
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 50px);
  grid-auto-rows: 80px;
}

如上图所示,定义一个3x3网格,第10个网格超出区域,超出行的高度为80px。

  1. grid-row grid-column设置网格自身起始、终止线
    grid-column: grid-column-start / grid-column-end
    grid-row: grid-row-start / grid-row-end
    grid-column: <start-line> / <end-line> | <start-line> / span <value>
    grid-row: <start-line> / <end-line> | <start-line> / span <value>
.wrapper {
  box-shadow: 0px 0px 2px 1px #cccccc;
  width: 250px;
  height: 250px;
  box-sizing: border-box;
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(4, 50px);
}
.item-1 {
  /* 简写 */
  grid-row: 2 / 4;
  grid-column: 2 / 4;
  /* 拆开写相同*/
  /* grid-row-start: 2;
  grid-row-end: 4;
  grid-column-start: 2;
  grid-column-end: 4; */
}

如上图所示,定义一个3x3网格,第一个网格水平方向起始线为2,终止线为4,竖直方向起始线为2,终止线为4,剩下的网格会按默认依次排列。

  1. place-self 设置单元网格内容位置。
    place-self: <align-self> <justify-self>;
    justify-self: start | end | center | stretch;
    align-self: start | end | center | stretch;
.wrapper {
  display: grid;
  grid-template-columns: repeat(3, 50px);
  grid-template-rows: repeat(3, 30px);
}
.item-1 {
  place-self: center center;
}

如上图所示,item-1在第一个网格上下左右中间位置。

示例相关代码

https://github.com/Xiamer/css-example/tree/master/grid

grid 兼容性


https://caniuse.com/#search=css%20grid

参考链接

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,539评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,911评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,337评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,723评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,795评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,762评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,742评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,508评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,954评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,247评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,404评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,104评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,736评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,352评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,557评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,371评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,292评论 2 352

推荐阅读更多精彩内容

  • CSS Grid(网格) 布局(又称为 “Grid(网格)” ),是一个二维的基于网格的布局系统它的目标是完全改变...
    诺CIUM阅读 1,308评论 0 3
  • 英文: Rachel Andrew 译文:大漠www.w3cplus.com/css/css-grid-gotch...
    grain先森阅读 1,173评论 0 8
  • 转载地址:https://www.cnblogs.com/xiaohuochai/p/7083153.html 前...
    One_Hund阅读 1,311评论 0 1
  • 生活在我的脸上用刀划过 只留下疤痕和血印 爱情在我的心头咬上一口 我却一直隐隐作疼 年少时皓白的牙齿 什么都敢咬 ...
    酒鬼匿名诗人阅读 256评论 0 2
  • 今日体验:今天做了下老店日报表,整理了下各店库房表格。把库房统计的与财务每天做的报表的差额筛选出来,找到问题所在进...
    A郑淑英阅读 79评论 0 0