grid网格布局

CSS 网格布局(Grid Layout) 是CSS中最强大的布局系统。 这是一个二维系统,这意味着它可以同时处理列和行,不像 flexbox那样主要是一维系统。 你可以通过将CSS规则应用于父元素(成为网格容器)和该元素的子元素(网格元素),来使用网格布局。

需要注意的是,设为 grid 布局以后,子元素的float、clear和vertical-align属性将失效。

<div class="container">
    <div class="item item-1"></div>
    <div class="item item-2"></div>
    <div class="item item-3"></div>
</div>

网格线(Grid Line)
分界线构成了网格的结构。

网格轨道(Grid Track)
两个相邻网格线之间的空间。你可以把它们想像成网格的行或列。

网格单元格(Grid Cell)
两个相邻的行和两个相邻的列之间的网格线空间。它是网格的一个"单位"。

网格区域(Grid Area)
四条网格线所包围的所有空间。网格区域可由任意数量的网格单元格组成。

网格容器(Grid Container)

.container{
    display: grid | inline-grid;

    grid-template-columns: 40px 50px auto 50px 40px;
    grid-template-rows: 25% 100px auto;

    grid-column-gap: 10px;
    grid-row-gap: 15px;

    /* grid-gap: 10px 15px; */

    justify-items: start | end | center | stretch;
    align-items: start | end | center | stretch;

    justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
    align-content: start | end | center | stretch | space-around | space-between | space-evenly;

    grid-template-areas: none;

    grid-auto-columns: 60px;
    grid-auto-rows: 60px;

    grid-auto-flow: row;
}

1. grid-template-columns( grid-template-rows)

属性值:

  1. 可以是一个长度、百分比或者是网格中自由空间的一小部分(使用fr单位)
.container{
    grid-template-columns: 40px 50px auto 50px 40px;
    grid-template-rows: 25% 100px auto;
}

此时,利用以空格分隔的值定义网格的列和行。值的大小代表轨道的大小,并且它们之间的空格表示网格线。

fr 单位

将一个轨道大小设置为网格容器内自由空间的一小部分。

.container{
    grid-template-columns: 1fr 50px 1fr 1fr;
}

空间减去50px后三等分。

  1. 任意名称
.container{
    grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
    grid-template-rows: [row1-start] 25% [row1-end] 100% [third-line] auto [last-line];
}

此时,利用[]中名字定义网格线,中间值的大小代表轨道的大小。而且一条网格线可以具有有多个名称,中间用空格隔开(e.g : [row1-end row2-start] )。

  1. subgrid

网格容器本身就是一个网格项(即嵌套网格),此属性指定行和列的大小继承于父元素而不是自身指定。

2. grid-column-gap(grid-row-gap)

指定网格线的大小。你可以把它想像成在行/列之间设置间距宽度。单位为长度值。

.container{
    grid-column-gap: 10px;
    grid-row-gap: 15px;
}

3. grid-gap

grid-column-gap 和 grid-row-gap的简写值。

grid-gap: <grid-column-gap> <grid-row-gap>;

如果没有指定grid-row-gap属性的值,默认与grid-column-gap属性值相同

4. justify-items(align-items)

容器内所有的网格项中的内容的对齐方式。

justify-items

start: 内容与网格区域的左端对齐
end: 内容与网格区域的右端对齐
center: 内容处于网格区域的中间位置
stretch: 内容宽度占据整个网格区域空间

align-items

start: 内容与网格区域的顶端对齐
end: 内容与网格区域的底部对齐
center: 内容处于网格区域的中间位置
stretch: 内容高度占据整个网格区域空间

5. justify-content(align-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: 网格行中间间隔相等,两端也有间隙。

6. grid-template-areas

使用grid-area属性定义网格区域名称,从而定义网格模板。网格区域重复的名称就会导致内容跨越这些单元格。句点表示一个空单元格。语法本身提供了一种可视化的网格结构。

属性值:

  1. <grid-area-name>: 使用grid-area属性定义网格区域名称
  1. .: 句点表示一个空单元格
  2. none: 无网格区域被定义
.container{
    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"
}

这将创建一个四列三行的网格。最上面的一行为header区域。中间一行由两个main区域,一个空单元格和一个sidebar区域。最后一行是footer区域。

你只是使用此语法进行网格区域命名,而不是网格线命名。当你使用此语法时,区域两边的线就会得到自动命名。如果网格区域名称为foo,则其行线和列线的名称就将为foo-start,最后一行线及其最后一列线的名字就会为foo-end。这意味着一些线就可能具有多个名称,如上面示例中所示,拥有三个名称: header-start, main-start, 以及footer-start。

7. grid-auto-columns和grid-auto-rows

指定任何自动生成的网格轨道(隐式网格跟踪)的大小。

假如,定义的网格为4行4列,需要将一个第五行第五列的网格项,此时,此属性定义这个自动生成的网格轨道的大小。
单位同grid-template-columns

8. grid-auto-flow

当不主动设置子元素的位置时,填充方案。

.container{
    grid-auto-flow: row | column | row dense | column dense
}

row: 优先填充每一行,必要时添加新行
column: 优先填充每一列,必要时添加新列
dense: 优先填补网格中之前较小的网格项留有的空白

网格项(Grid Item)

网格容器的孩子(子元素)。这里.item元素都是网格项。

.item{
    grid-column-start: 1;
    grid-column-end: span col4-start;
    grid-row-start: 2;
    grid-row-end: span 2;

    /* grid-column: 3 / span 2;
    grid-row: third-line / 4; */

    grid-area: header;

    justify-self: stretch;
    align-self: stretch;
}

1. grid-column-start/grid-column-end/grid-row-start/grid-row-end

使用特定的网格线确定网格项在网格内的位置。
grid-column-start/grid-row-start 属性表示网格项的网格线的起始位置,
grid-column-end/grid-row-end属性表示网格项的网格线的终止位置。

属性值:

  1. 可以是一个数字来引用相应编号的网格线,或者使用名称引用相应命名的网格线
.item-a{
    grid-column-start: 2;
    grid-column-end: five;
    grid-row-start: row1-start
    grid-row-end: 3;
}

如果没有声明grid-column-end/grid-row-end属性,默认情况下网格项的跨度为1。
网格项可以互相重叠。可以使用z-index属性控制堆叠顺序。

  1. 网格项包含指定数量的网格轨道(span <number>/span <name>)
.item-a{
    grid-column-start: 1;
    grid-column-end: span col4-start;
    grid-row-start: 2;
    grid-row-end: span 2;
}
  1. auto

表明自动定位,自动跨度或者默认跨度之一

2. grid-column/grid-row

grid-column-start + grid-column-end, 和 grid-row-start + grid-row-end属性分别的简写形式。

grid-column:<start-line> / <end-line>。
属性值同上。

3. grid-area

给网格项进行命名以便于模板使用grid-template-areas属性创建时可以加以引用。

.item-d{
    grid-area: header
}

.item{
grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>;
}

3. justify-self(align-self)

单一网格项中的内容对齐方式。

justify-self

start: 内容与网格区域的左端对齐
end: 内容与网格区域的右端对齐
center: 内容处于网格区域的中间位置
stretch: 内容宽度占据整个网格区域空间(默认值)

align-self

start: 内容与网格区域的顶端对齐
end: 内容与网格区域的底部对齐
center: 内容处于网格区域的中间位置
stretch: 内容高度占据整个网格区域空间(默认值)

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