Css3 - Grid网格布局

Grid - 二维网格布局

一、介绍

1. 原理

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

2. 基础概念

使用Grid布局非常简单,你只需要给容器(container)定义:display:grid,并设置列(grid-template-columns)和 行(grid-template-rows)的大小,然后用grid-column和grid-row定义容器子元素(grid-item项目)的位置。与flexbox布局类似,一开始项目的排列顺序并不重要,可以放置在容器的任何位置,这也使得你非常容易通过媒体查询重新排列你的项目。

3.浏览器支持

截至2017年3月,许多浏览器都提供了原生的,前瞻性的对CSS Grid的支持:Chrome(包括Android),Firefox,Safari(包括iOS)和Opera。 另一方面,Internet Explorer 10和11支持它,但是这是一个过时的语法实现。 边缘支持已经宣布,但还没有到来。

这里写图片描述


二、重要术语

1.grid container(网格容器)

被定义为 display: grid 的元素,他是整个网格布局系统的容器(container),即是父元素。

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

2. grid Item(网格项)

网格容器的子元素,下面的item元素是网格项,但sub-item不是。

<div class="container">
  <div class="item"></div> 
  <div class="item">
    <p class="sub-item"></p>
  </div>
  <div class="item"></div>
</div>

3. grid line (网格线)

形成一个组成网格线的分界线。它们可以是列网格线(column grid lines),也可以是行网格线(row grid lines)并且居于行或列的任意一侧,下面黄色线就是列网格线。

这里写图片描述

4. grid track(网格轨道)

两个相邻的网格线之间为网格轨道。
你可以认为它们是网格的列或行,下面在第二个和第三个网格线之间的黄色部分为网格轨道。

这里写图片描述

5. grid cell(网格单元)

两个相邻的列网格线和两个相邻的行网格线组成的是网格单元,它是最小的网格单元。
下面行网格线1(row grid lines 1)、行网格线2(row grid lines 2)和列网格线2(column grid lines 2)、列网格线3(column grid lines 3)组成的黄色区域为网格单元。

这里写图片描述

6. grid area(网格区域)

网格区是由任意数量网格单元组成。
下面行网格线1(row grid lines 1)、行网格线3(row grid lines 3)和列网格线1(column grid lines 1)、列网格线3(column grid lines3)组成的黄色区域为网格区。

这里写图片描述


三、所有网格容器属性和网格元素属性

1.grid container 属性

  • display
  • grid-template-columns
  • grid-template-rows
  • grid-template-areas
  • grid-template
  • grid-column-gap
  • grid-row-gap
  • grid-gap
  • justify-items
  • align-items
  • justify-content
  • align-content
  • grid-auto-columns
  • grid-auto-rows
  • grid-auto-flow

2.grid item 属性


    grid-column-start
    grid-column-end
    grid-row-start
    grid-row-end
    grid-column
    grid-row
    grid-area
    justify-self
    align-self

四、grid container 属性

1. display: grid | inline-grid | subgrid;

属性值:
grid: 生成块级网格
inline-grid: 生成行内网格
subgrid: 如果网格容器本身是网格项(嵌套网格容器),此属性用来继承其父网格容器的列、行大小。

注:当元素设置了网格布局,column、float、clear、vertical-align属性无效。

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> ...;
}

1)属性值:
track-size: 轨道大小,可以使用css长度,百分比或用分数(用fr单位)。
line-name: 网格线名字,你可以选择任何名字。

2)案例
案例1:当你设置行或列大小为auto时,网格会自动分配空间和网格线名称。

.container {
  grid-template-columns: 40px 50px auto 50px 40px;
  grid-template-rows: 25% 100px auto;
}

这里写图片描述

案例2:给网格线定义名字,注意名字需要写在[]里面。

.container{
    display:grid;
    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];
}


这里写图片描述

3)特殊
1.每条网格线可以有多个名字,例如上面行的第二条线有两个名字,分别是row1-end和row2-start。

.container{
    display: grid;
    grid-template-rows: [row1-start] 25% [row1-end row2-start] 25% [row2-end];
}

2.如果你定义包含重复部分,可以使用repeat()简化。

.container{
    display: grid;
    grid-template-columns: repeat(3, 20px [col-start]) 5%;
}
//等价于
.container{
    display: grid;
    grid-template-columns: 20px [col-start] 20px [col-start] 20px [col-start] 5%;
}

3.用fr单位可以将容器分为几等份,例如下面分成三等份。

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

4.如果fr单位和实际值一起使用,设置fr的行或列将分(除了实际值)剩余部分。

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

3.grid-template-areas

通过获取网格项中的grid-area属性值(名称),来定义网格模版。重复网格区(grid-area)名称将跨越网格单元格,‘.’代表空网格单元。

.container {
  grid-template-areas: 
    "<grid-area-name> | . | none | ..."
    "...";
}

1)属性值:
grid-area-name: 网格项(grid item)的grid-area属性值(名字)
‘.’ : 空网格单元
none: 不定义网格区域

2)案例

.item-a {
  grid-area: header;
}
.item-b {
  grid-area: main;
}
.item-c {
  grid-area: sidebar;
}
.item-d {
  grid-area: footer;
}

.container {
  grid-template-columns: 50px 50px 50px 50px;//4列
  grid-template-rows: auto;//3行
  grid-template-areas: 
    "header header header header"
    "main main . sidebar"
    "footer footer footer footer";
}

上述案例:上面代码示例会创建四列三行网格,第一行将是header,第二行前两个网格单元是main部分、第三个为空网格单元、第四个为sliderbar,第三行是footer。
这里写图片描述

4.grid-template

5.grid-column-gap/grid-row-gap

网格单元间距。

属性值:
line-size: 网格线间距,设置单位值。

.container{
    display:grid;
    grid-template-columns: 100px 50px 100px;
    grid-template-rows: 80px auto 80px; 
    grid-column-gap: 10px;
    grid-row-gap: 15px;
}

这里写图片描述

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

是grid-column-gap 和 grid-row-gap简写。
改写上述code

.container {
    display: grid;
    grid-template-columns: 100px 50px 100px;
    grid-template-rows: 80px auto 80px;
    grid-gap: 10px 15px;
}

注:如果只设置一个值,那么grid-column-gap 和 grid-row-gap都为那个值。

7.justify-items

垂直于列网格线对齐,适用于网格容器里的所有网格项。

属性值:
start: 左对齐。
end: 右对齐。
center: 居中对齐。
stretch: 填满(默认)。

.container{
    display:grid;
    justify-items: start / end/ center /stretch;
}

start
(start)
end
(end)
这里写图片描述
(center)
这里写图片描述
(stretch)

8.align-items

垂直于行网格线对齐,适用于网格容器里的所有网格项。

属性值:
start: 顶部对齐。
end: 底部对齐。
center: 居中对齐。
stretch:填满(默认)。

.container{
    display:grid;
    align-items: start/end/center/stretch;
}

这里写图片描述
(start)
这里写图片描述
(end)
这里写图片描述
(center)

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

如果用像px非弹性单位定义的话,总网格区域大小有可能小于网格容器,这时候你可以设置网格的对齐方式(垂直于列网格线对齐)。
属性值:
start: 左对齐。
end: 右对齐。
center: 居中对齐。
stretch: 填满网格容器。
space-around: 网格项两边间距相等,网格项之间间隔是单侧的2倍。
space-between: 两边对齐,网格项之间间隔相等。
space-evenly: 网格项间隔相等。

.container{
    display:grid;
    justify-content: start;
}

这里写图片描述
(start)
这里写图片描述
(end)
这里写图片描述
(center)
这里写图片描述
(stretch)
这里写图片描述
(space-around)
这里写图片描述
(space-between)
这里写图片描述
(space-evenly)

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

如果用像px非弹性单位定义的话,总网格区域大小有可能小于网格容器,这时候你可以设置网格的对齐方式(垂直于行网格线对齐)。

属性值:
start: 顶部对齐。
end: 底部对齐。
center: 居中对齐。
stretch: 填满网格容器。
space-around: 网格项两边间距相等,网格项之间间隔是单侧的2倍。
space-between: 两边对齐,网格项之间间隔相等。
space-evenly: 网格项间隔相等。

11.grid-auto-columns/grid-auto-rows

自动生成隐式网格轨道(列和行),当你定位网格项超出网格容器范围时,将自动创建隐式网格轨道。

属性值:
track-size: 网格轨道大小,可以是固定值,百分比或者是分数(fr单位)。
案例:

.container{
    display:grid;
    grid-template-columns: 60px 60px;
    grid-template-rows: 90px 90px
}

这里写图片描述
这是2✖️2的网格,但是我们来用grid-column 和 grid-row给网格项定位如下:

.item-a{
    grid-column: 1 / 2;
    grid-row: 2 / 3;
}
.item-b{
    grid-column: 5 / 6;
    grid-row: 2 / 3;
}

这里写图片描述
我们可以看出,网格项item-b定位在第五根列网格线(column line 5 )和第六根列网格线(column line 6 )之间。但是我们网格容器根本不存在这两条网格线,所以就用两个0宽度来填充。在这里我们可以用网格自动行(grid-auto-rows)和网格自动列(grid-auto-columns)来定义这些隐式轨道宽度。

.container{
    display:grid;
    grid-auto-columns: 60px;
}

这里写图片描述

12.grid-auto-flow : row(默认) | column | dense ;

在没有设置网格项的位置时,这个属性控制网格项怎样排列。

属性值:
row: 按照行依次从左到右排列。
column: 按照列依次从上倒下排列。
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: 1;
    grid-row: 1 / 3;
}
.item-e{
    grid-column: 5;
    grid-row: 1 / 3;
}

if:由于我们设置了grid-auto-flow:row,item-b、item-c和item-d在行上是从左到右排列,如下:
这里写图片描述

if: grid-auto-flow: column;
这里写图片描述


四、Grid-item

1.grid-column-start

grid-column-start: <number> | <name> | span <number> | span <name> | auto ;

line: 指定带编号或者名字的网格线。
span <number>: 跨越轨道的数量。
span <name>: 跨越轨道直到对应名字的网格线。
auto: 自动展示位置,默认跨度为1。

2.grid-column-end

grid-column-end: <number> | <name> | span <number> | span <name> | auto ;

3.grid-row-start

grid-row-start: <number> | <name> | span <number> | span <name> | auto ;

4.grid-row-end

grid-row-end: <number> | <name> | span <number> | span <name> | auto ;

案例1:

.item-a{
  grid-column-start: 2;
  grid-column-end: five;
  grid-row-start: row1-start
  grid-row-end: 3
}

这里写图片描述

案例2:

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

这里写图片描述

5.grid-column: / grid-row:

-是 grid-column-start、grid-column-end 和 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> ;

案例:

.item-c{
  grid-column: 3 / span 2;
  grid-row: third-line / 4;
}

这里写图片描述

6.grid-area

 grid-area: <name> | <row-start> / <column-start> / <row-end> / <column-end>

属性值:
name: 项目名子。
<row-start> / <column-start> / <row-end> / <column-end>: 可以是数字或网格线名字(逆时针方式)。

案例:

.item-d{
  grid-area: 1 / col4-start / last-line / 6 ;
}

这里写图片描述

7. justify-self: justify-self: start | end | center | stretch;

定义单个网格项垂直于列网格线的对齐方式。

属性值:
start: 网格区域左对齐。
end: 网格区域右对齐。
center: 网格区域居中。
stretch: 网格区域填满。
案例:

.item-a{
  justify-self: start/end/center/stretch;
}

这里写图片描述
(start)
这里写图片描述
(end)
这里写图片描述
(center)
这里写图片描述
(stretch)

注意:也可以在容器上设置justify-items,达到全部网格项对齐。

8.align-self

align-self: start | end | center | stretch;

定义单个网格项垂直于行网格线的对齐方式。

属性值:
start: 网格区域顶部对齐。
end: 网格区域底部对齐。
center: 网格区域居中。
stretch: 网格区域填满。

案例:

.item-a {
    align-self: start/end/center/stretch
}

这里写图片描述
这里写图片描述
这里写图片描述

这里写图片描述

参考文档

  1. https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout
  2. https://css-tricks.com/snippets/css/complete-guide-grid/
  3. https://www.jianshu.com/p/d183265a8dad

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值