CSS趋势:网格布局Grid

网格布局,一种突破一维空间的布局思路,引入“行”和“列”的概念在二维空间中实现样式效果。其强大的网页空间分配能力,是连Flex在内的所有布局方式都未有过的。它与Flex具有一定的相似性,都可以指定容器内多个项目的位置,但又有很大的不同。可以认为,Grid 远比 “Flex” 强大。

  类似上图的网页布局模型,是Grid布局的拿手好戏。图中对应的名称,在网格布局中被称作“区域名”。本文偏干货,想查看更多使用案例,可阅读Learn CSS Grid一文

# 概念须知

  • 容器:承载网格布局的那个空间,用来存放网格布局的子元素。一般最外层的容器是网页的Container
  • 项目:存在容器中的直接子元素,称为“项目”。但间接子元素不是项目,Grid布局也不会对其生效。如需要生效,需要将该项目也设置为容器display: grid
  • 单元格:行和列交叉的空间,称为单元格。一个容器会被划分出多个单元格,一个项目可占用一个或多个单元格
  • 区域:可以对单元格指定名字,构成区域。允许指定多个单元格相同名字,构成一个区域。通常一个项目占用一个区域,但也不绝对。
  • 网格线:分割出单元格的行列线条,称为网格线。n行有n+1根水平网格线,m列有m+1根垂直网格线。网格线下标从1开始(不从0开始)

网格布局属性设置有两大类:(1)容器属性 (2)项目属性。
设置网格布局后,以下几个CSS属性将失效:floatdisplay: inline-blockdisplay: table-cellvertical-aligncolumn-*

# 容器属性字典

一、设置容器为网格布局

  网格布局方法中,容器内部的项目默认是block类型的,如果需要展示为行内块级元素,可以设置为inline-grid

  • display:
    (1) grid 默认子元素是块级元素
    (2)inline-grid 设置子元素是行内块级元素
二、划分单元格及设置大小
  • grid-template-columns:
    (1)100px 100px 100px 定义每一列宽度
    (2)repeat(3, 100px) 循环定义三次100px、repeat(2, 100px 50px) 循环100px 50px两次
    (3)repeat(auto-fill, 100px) 自动填100px的单元格,放不下自动换行
    (4)1fr 2fr 100px 倍数关系,2列是1列的两倍宽。3列固定为100px宽
    (5)1fr 2fr minmax(50px, 1fr) 第3列最窄50px,最宽1fr
    (6)100px auto 50px 除去1列和3列占的宽度,第2列自适应占用剩余宽度
    (7)70% 30%两列布局模型,repeat(24, 1fr)ElementUI十二个布局模型
    (8)[col-1-start] 1fr [col-2-start] 1fr [col-3-start] 1fr [col-3-end] 使用[]给网列网格线命名
  • grid-template-rows:
    (1)[row-1-start] 1fr [row-2-start] 1fr [row-2-end] 给列网格线命名
    (2)...同上...
(8) 与 (1) 的组合效果
三、给单元格分区域

  同行命名的区域名中间以空格隔开,而不是逗号,点号表示跳过该单元格也就是不对该单元格命名区域。
  值得关注的是,区域命名后,每个区域的起始网格线会自动命名为区域名-start,结束为区域名-end。水平网格线和垂直网格线具有相同的名称

  • grid-template-areas:
    (1)'a b c'
       'd e f'
       'g h i' 指定区域名称,为直观展示允许换行书写
    (2)'a b c' 'd . e' 'f . g' 不使用的单元格使用点号 跳过
    (3)'header header header header' 'main main . asidebar' 'footer footer footer footer' 划多个单元格为一个区域
(3) 的分区效果
四、设置项目间距
  • row-gap:20px [grid-row-gap] 新标准,设置上下行项目间隔
  • column-gap:20px [grid-column-gap] 新标准,设置左右列项目间隔
  • gap: <row-gap> <column-gap>简写。[grid-gap] 新标准
    (1)20px 20px 上下间隔20px,左右间隔20px
    (2)20px 上下左右间隔20px
五、优先排列方向
  • grid-auto-flow:
    (1)row (默认),优先横向排列
    (2)column,优先纵向排列
    (3)row dense 稠密布局,除已指定区域的项目,其余项目优先横向自动占用未用的单元格
    (4)column dense 优先纵向的稠密布局
(3) 的效果。否则因1后放不下2图中3位置将留空
六、设置自动生成的单元格大小

  有时候因布局需要,会空出某个单元格不用,如第一个项目需要显示在第一行第二列单元格上,如果单元格数量与项目数量相同,就会剩余一个项目超出自动排列到最后一行。网格布局会自动再生成一个单元格来放这个项目。

  • grid-auto-columns:100px 设置自动生成的单元格宽度为100px
  • grid-auto-rows:100px 设置自动生成的单元格高度为100px
七、容器内容的对齐方式

  相对于display: grid的容器,其内部元素作为一个整体相对于这个容器的对齐方式

  • justify-content:
    (1)start 以起始网格线对齐
    (2)end 以结束网格线对齐
    (3)center 居中显示
    (4)stretch 项目拉伸至单元格同宽
    (5)space-between 两边顶边,项目间距均分
    (6)space-around 项目两侧间距相等(距边距离是项目间的1/2)
    (7)space-evenly 距边与项目间距相等的间距均分
    (8)...其余属性不常用...
  • align-content:
    (1)...同上...
    (6) 的显示效果
八、单元格内容对齐方式

  容器中有一个或多个单元格,单元格内部存放着项目,这些项目相对于单元格的对齐方式

  • justify-items:
    (1)start 项目以单元格的起始网格线对齐
    (2)end 以结束网格线对齐
    (3)center 项目在单元格中居中显示
    (4)stretch 项目拉伸占满单元格宽度
    (5)...其余属性不常用...
  • align-items:
    (1)...同上...
    (1) 的显示效果
九、终极简写

  这个简写并不容易理解和维护,不推荐使用

  • grid-template:
      是<grid-template-columns> <grid-template-rows> <grid-template-areas>的简写
  • grid:
      是<grid-template-rows> <grid-template-columns> <grid-template-areas> <grid-auto-rows> <grid-auto-columns>的简写

# 项目属性字典

一、项目内容对齐方式

  容器内容对齐方式是justify-content,单元格内容对齐方式是justify-items,项目内容指的是在项目内部的元素,相对于该项目的对齐方式。所以本属性只会影响单个项目。前两个属性都会影响所有项目。

  • justify-self:
    (1)start 项目内容以项目起始位置对齐
    (2)end 项目内容在项目结束位置对齐
    (3)center 项目内容居中显示
    (4)stretch 内容拉伸占满项目宽度
  • align-self:
    (1)...同上...
    (2) 的显示效果
二、设置项目占用空间

  本属性中,如果把一下四个网格线均设置了,其余未指定区域自动排列的项目会根据dense的规则自动进行稠密布局。

  • grid-column-start:
    (1)1 开始网格线的下标(注意网格线下标从1开始,而不是0)
    (2)header-start 开始网格线名称
    (3)span 3 按默认的开始位置,跨两个单元格大小
  • grid-column-end:
    (1)4 结束网格线的下标(注意网格线下标从1开始,而不是0)
    (2)header-end 结束网格线名称
    (3)span 3 按默认的开始位置,跨两个单元格大小
  • grid-row-start: 同 grid-column-start
  • grid-row-end: 同 grid-column-end

简写办法

  • grid-column: <grid-column-start> <grid-column-end>简写,用/分隔
    (1)1 / 4 从第一条网格线到第三条网格线,即占用第一和第二单元格
    (2)1 / span 3 从第一条网格线开始,占用两个单元格
    (3)1 从第一条网格线开始,占用一个单元格。相当于省略了 span 1
  • grid-row
    (1)1 / 3 从第一条到第三条
    (2)1 / span 2 从1开始跨两格
(1) / (2) 的显示效果

# 浏览器支持情况

  作为比较新的技术方案,肯定会担心支持性的问题,好在它已被广泛的接受,某E 11 版本也已做了支持

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

推荐阅读更多精彩内容