css-grid布局之美

一,grid布局概述

网格布局(Grid)是最强大的 CSS 布局方案。

它将网页划分成一个个网格,可以任意组合不同的网格,做出各种各样的布局。以前,只能通过复杂的 CSS 框架达到的效果,现在浏览器内置了。

Grid 布局与 Flex 布局有一定的相似性,都可以指定容器内部多个项目的位置。但是,它们也存在重大区别。

Flex 布局是轴线布局,只能指定"项目"针对轴线的位置,可以看作是一维布局 。Grid 布局则是将容器划分成"行"和"列",产生单元格,然后指定"项目所在"的单元格,可以看作是二维布局。Grid 布局远比 Flex 布局强大。

二,基本概念

2.1,容器和项目

采用网格布局的区域,称为"容器"(container)。容器内部采用网格定位的子元素,称为"项目"(item)。

复制代码
<div>
  <div>item1</div>
  <div>item2</div>
  <div>item3</div>
</div>

上面代码中,最外层的<div>元素就是容器,内层的三个<div>元素就是项目。

注意:项目只能是容器的顶层子元素,不包含项目的子元素,比如上面代码的<p>元素就不是项目。Grid 布局只对项目生效。

2.2,行和列

容器里面的水平区域称为"行"(row),垂直区域称为"列"(column)

2.3,单元格

行和列的交叉区域,称为"单元格"(cell)。

正常情况下,n行和m列会产生n x m个单元格。比如,3行3列会产生9个单元格。

三,容器相关属性

Grid 布局的属性分成两类。一类定义在容器上面,称为容器属性;另一类定义在容器内部,称为项目属性。这部分先介绍容器属性。

3.1,display 属性

display: grid 指定一个容器采用网格布局。默认情况下,容器元素都是块级元素,但也可以设成行内元素。

display: inline-grid 指定一个容器采用网格布局。容器设定为内联块元素

注意,设为网格布局以后,容器子元素(项目)的floatdisplay: inline-blockdisplay: table-cellvertical-aligncolumn-*等设置都将失效。

3.2,grid-template-columns 属性,grid-template-rows 属性

容器指定了网格布局以后,接着就要划分行和列。grid-template-columns属性定义每一列的列宽,grid-template-rows属性定义每一行的行高。

复制代码
.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;    //固定宽度
  grid-template-rows: 100px 100px 100px; 
}

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;       //分配几列,自适应宽度
}

.container {
  display: grid;
  grid-template-columns: 1fr 2fr 1fr;       //分配几列,自适应宽度,2fr自适应两倍宽度
}

3.2,auto-fill 关键字

有时,单元格的大小是固定的,但是容器的大小不确定。如果希望每一行(或每一列)容纳尽可能多的单元格,这时可以使用auto-fill关键字表示自动填充。

复制代码
.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 200px);   
   // 表示每一项宽度是200px,根据容器宽度自适应列数
}

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));  
   // 表示每一项最低宽度是200px,根据容器宽度自适应列数
}

除了auto-fill,还有一个关键字auto-fit,两者的行为基本是相同的。只有当容器足够宽,可以在一行容纳所有单元格,并且单元格宽度不固定的时候,才会有行为差异auto-fill会用空格子填满剩余宽度,auto-fit则会尽量扩大单元格的宽度。

3.3, fr 关键字

类似于栅格布局,网格布局提供了fr关键字(fraction 的缩写,意为"片段")。如果两列的宽度分别为1fr2fr,就表示后者是前者的两倍,fr对网格做了自适应的分配。

3.4,grid-row-gap 属性,grid-column-gap 属性,grid-gap 属性

grid-row-gap属性设置行与行的间隔(行间距),

grid-column-gap属性设置列与列的间隔(列间距),

grid-gap属性是grid-column-gapgrid-row-gap的合并简写形式,语法如下

复制代码
.container {
  grid-row-gap: 20px;
  grid-column-gap: 20px;
}

// 等价于
.container {
  grid-gap: 20px 20px;
}

3.5,grid-template-areas 属性

网格布局允许指定"区域"(area),一个区域由单个或多个单元格组成。grid-template-areas属性用于定义区域。

3.6,grid-auto-flow 属性

划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行,即下图数字的顺序。

这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"。

复制代码
grid-auto-flow: column;

grid-auto-flow属性除了设置成rowcolumn,还可以设成row densecolumn dense。这两个值主要用于,某些项目指定位置以后,剩下的项目怎么自动放置。

3.7,grid-template 属性,grid 属性

grid-template属性是grid-template-columnsgrid-template-rowsgrid-template-areas这三个属性的合并简写形式。

grid属性是grid-template-rowsgrid-template-columnsgrid-template-areasgrid-auto-rowsgrid-auto-columnsgrid-auto-flow这六个属性的合并简写形式。

不建议使用

四,项目属性

4.1,grid-column-start 属性,grid-column-end 属性,grid-row-start 属性,grid-row-end 属性

项目的位置是可以指定的,具体方法就是指定项目的四个边框,分别定位在哪根网格线。

  • grid-column-start属性:左边框所在的垂直网格线

  • grid-column-end属性:右边框所在的垂直网格线

  • grid-row-start属性:上边框所在的水平网格线

  • grid-row-end属性:下边框所在的水平网格线

    .item-1 {
    grid-column-start: 2;
    grid-column-end: 4;
    }

如下图,第一个项目的左边框是第二根垂直网格线,右边框是第四根垂直网格线。

复制代码
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 2;
  grid-row-end: 4;
}

如下图,指定四个边框位置的效果

4.2,grid-column 属性,grid-row 属性

grid-column属性是grid-column-startgrid-column-end的合并简写形式,grid-row属性是grid-row-start属性和grid-row-end的合并简写形式。

复制代码
.item {
  grid-column: <start-line> / <end-line>;
  grid-row: <start-line> / <end-line>;
}

如下例子:

复制代码
.item-1 {
  grid-column: 1 / 3;
  grid-row: 1 / 2;
}
/* 等同于 */
.item-1 {
  grid-column-start: 1;
  grid-column-end: 3;
  grid-row-start: 1;
  grid-row-end: 2;
}

4.3,grid-area 属性

grid-area属性指定项目放在哪一个区域

4.4,justify-self 属性,align-self 属性,place-self 属性

justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。

align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目。

相关推荐
豐儀麟阁贵5 分钟前
8.5在方法中抛出异常
java·开发语言·前端·算法
zengyuhan50334 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
醉方休38 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running1 小时前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔1 小时前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户4445543654261 小时前
Android的自定义View
前端
WILLF1 小时前
HTML iframe 标签
前端·javascript
枫,为落叶1 小时前
Axios使用教程(一)
前端
小章鱼学前端1 小时前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js
ohyeah1 小时前
JavaScript 词法作用域、作用域链与闭包:从代码看机制
前端·javascript