CSS - Grid 介绍与使用

Gird 是一种 CSS 的网格系统,他出来也有一阵子了,直到最近突然想到我还没认真看过XD,所以想说该来还债拉,这篇就跟大一起来学习一下如何使用 Gird,那么开始吧~

开始使用

GirdFlex 一样有内外容器的概念,首先是 html

<body>  <div class="container">    <div>header</div>    <div>menu</div>    <div>content1</div>    <div>content2</div>  </div></body>

接着只需在外层设定 display: grid 即可开始使用

.container {  display: grid;}

新方法介绍

开始排版之前我们先介绍几个 Grid 中常用的好东西

fr:等分的概念,类似 Flex 中的 flex-grow,例:1frrepeat():可重複某值,传入两个参数,次数与值,例:repeat(2, 1fr)minmax():可将值限定在某区间,传入两个参数,最小值与最大值,例:minmax(20px, auto)

排版方法

再来介绍排版方法,基本上可由以下几种去变换自己想要的版型

方法1 - 明确设定行列的宽高

使用以下属性可以直接于外部容器设定自己行列的宽高

.container {  display: grid;  grid-template-rows: 100px 300px;  grid-template-columns: 20% 80%;}

方法1-範例

方法2 - 设定行列的宽高预设值

设定预设值后所以内容都会依照预设宽高,此方法可以应用在格线系统

.container {  display: grid;  grid-auto-rows: 100px 200px;  grid-auto-columns: 1fr;}

方法2-範例

方法3 - 自定义区块

自定义区块须先在外部容器定义区块分布,再于内部容器设定其区块名称,但要注意以下

定义外部区块时同名称的区块不能隔开. 可用于将区块留空
<body>  <div class="container">    <div class="header">header</div>    <div class="menu">menu</div>    <div class="content1">content1</div>    <div class="content2">content2</div>  </div></body>
.container {  display: grid;  grid-template-rows: 100px 200px;  grid-template-columns: 150px repeat(2, 1fr);  grid-template-areas:   "header header header"  "menu . content2"  "menu content1 content2";}.header {  grid-area: header;}.menu {  grid-area: menu;}.content1 {  grid-area: content1;}.content2 {  grid-area: content2;}

方法3-範例

方法4 - 设定内部容器位置

此方法须先将外部容器格线设定好,然后在内部容器直接定义其位置,这边的属性是用线来做定义,从左到右、从上到下,最上面与最左边分别为起点,也就是 1,终点则是看要到第几条线,可以设定的值还有 auto(表示自动)与 span <line>(表示所占线数)

.container {  display: grid;  grid-template-rows: 100px 200px 100px;  grid-template-columns: 20% 30% 30% 20%;}.header {  grid-row-start: 1;  grid-row-end: 2;  grid-column-start: 2;  grid-column-end: span 3;}.menu {  grid-row-start: 2;  grid-row-end: 3;  grid-column-start: 1;  grid-column-end: 3;}.content1 {  grid-row: 2 / 3;  grid-column: 3 / 4;}.content2 {  grid-row: 2 / 4;  grid-column: 4 / auto;}

方法4-範例

其他属性

除了上述的属性用来排版以外,还有一些其他的属性可以操控,如下

排列方向

Grid 中设定排列方向的属性是 grid-auto-flow,可使用的属性有以下:

row:排列方向以行为优先,超过则排列到下一行,此为预设值column:排列方向以列为优先,超过则排列到下一列dense:若前方有空位,则往前排列,也可与 rowcolumn 混用
<body>  <div class="container">    <div class="item-fixed-1">item-fixed-1</div>    <div class="item-fixed-2">item-fixed-2</div>    <div>content1</div>    <div>content2</div>    <div>content3</div>    <div>content4</div>  </div></body>
.container {  display: grid;  grid-template-rows: repeat(4, 100px);  grid-template-columns: repeat(2, 1fr);  /* grid-auto-flow: row; */  /* grid-auto-flow: column; */  /* grid-auto-flow: row dense; */  /* grid-auto-flow: column dense; */}.item-fixed-1 {  grid-column-start: 2;}.item-fixed-2 {  grid-row-start: 3;}

以下固定 item-fixed-1item-fixed-2 的位置,并改变 grid-auto-flow ,可以观察其他容器有什么变化

grid-auto-flow: row

grid-auto-flow-範例1

grid-auto-flow: column

grid-auto-flow-範例2

grid-auto-flow: row dense

grid-auto-flow-範例3

grid-auto-flow: column dense

grid-auto-flow-範例4

间距

间距比较容易,可使用以下属性设定
grid-row-gap:每行间距
grid-column-gap:每列间距
grid-gapgrid-row-gapgrid-column-gap 的缩写

<body>  <div class="container">    <div>content1</div>    <div>content2</div>    <div>content3</div>    <div>content4</div>  </div></body>
.container {  display: grid;  grid-template-rows: repeat(2, 100px);  grid-template-columns: repeat(2, 1fr);  grid-row-gap: 10px;  grid-column-gap: 20px;  /* grid-gap: 10px 20px; */}

间距-範例

对齐方式

对齐方式基本上与 Flex 满类似的,可以分为外部容器与内部容器来看,有以下值可用

alignstart | end | center | stretch;justifystart | end | center | stretch | space-around | space-between | space-evenly;

首先原来的样子如下,之后皆以 center 属性来示範

<body>  <div class="container">    <div class="self">content1</div>    <div>content2</div>    <div>content3</div>    <div>content4</div>    <div>content5</div>    <div>content6</div>  </div></body>
.container {  display: grid;  width: 500px;  height: 400px;  grid-template-rows: repeat(3, 100px);  grid-template-columns: repeat(2, 200px);}

对齐方式-範例1

外部容器

justify-content:外部容器x轴对齐方式align-content:外部容器y轴对齐方式justify-items:内部容器x轴对齐方式align-items:内部容器y轴对齐方式
.container {  justify-content: center;  align-content: center;}

对齐方式-範例2

.container {  justify-items: center;  align-items: center;}

对齐方式-範例3

内部容器

justify-self:该容器x轴对齐方式align-self:该容器y轴对齐方式
.self {  justify-self: center;  align-self: center;}

对齐方式-範例4

(P.S.在外层设定 justify-itemsalign-items 就相当于为内层所有容器设定 justify-selfalign-self

属性列表

最后统整一下所有的属性~

外层属性

grid-template-rows // row高度:数量决定列数grid-template-columns // column宽度:数量决定栏数grid-template-areas // 定义网格区块grid-template // 缩写:areas / rows /columnsgrid-auto-rows // row预设高度grid-auto-columns // column预设宽度grid-row-gap // row间距grid-column-gap // column间距grid-gap // 缩写:row / columngrid-auto-flow // 排列方向grid // 缩写:上面所有属性justify-content // 外部容器对齐方式:x轴align-content // 外部容器对齐方式:y轴justify-items // 内部容器对齐方式:x轴align-items // 内部容器对齐方式:y轴

内层属性

grid-row-start // row起点grid-row-end // row终点grid-row // 缩写:start / endgrid-column-start // column起点grid-column-end // column终点grid-column // 缩写:start / end// 缩写:上面所有属性或是定义网格区块grid-area // row-start / column-start / row-end / column-endjustify-self // 对齐方式:x轴align-self // 对齐方式:y轴

结语

Grid 有些地方真的满灵活的,且与 Flex 一起用感觉能相辅相成,但是目前 Grid 支援度还不是很优,切版目前看起来还是会以 Flex 为主,若是以后版面越来越複杂的话,感觉就会用到 Grid 了,总之现在先学起来放着XD,希望完全支援的那天可以快来~


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章