Junwen's home
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)

Syun0216

多读书多种树
  • ES6

    • ES6 Decorator
    • ES6核心特性
    • Promise&Generator
  • js原理

    • 简单实现bind、apply和call
    • 如何遍历一个dom tree
    • 实现函数currying
    • 实现一个event
    • 详解js的继承
    • 详解requestAnimationFrame
    • Canvas api详解
    • DOM事件
    • EventLoop详解
    • JavaScript的内存管理
    • JavaScript的运行机制
    • Math对象
    • new操作符都做了什么
    • create基本实现原理
    • Set、Map、WeakSet和WeakMap
    • web worker原理
    • WebGL教程(MDN)
  • jsInfoSeries

    • 简介
    • JavaScript基础知识
    • 基础知识2
    • 基础知识3
    • 基础知识4
  • 技巧

    • 5个js解构有趣用途
    • 如何使用set提高代码性能
    • cordova构建项目时的问题
    • js中轻松遍历对象属性的几种方式
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
HTML
  • IP十问
  • http笔试
  • http协议
  • 浏览器原理
  • 浏览器缓存其实就这么一回事儿
  • 浏览器兼容性问题
  • 移动端开发兼容性适配
  • 前端性能优化
  • 前端如何进行seo优化
  • webpack

    • webpack HMR
    • webpack优化基本方法
  • leetcode题解

    • 两数之和
    • 判断整数是否为回文串
    • 无重复字符的最长子串
  • Js链表
  • JavaScript排序
  • React

    • 虚拟DOM原理理解
    • React Hook
    • 组件复用指南
  • Vue

    • Vue举一反三
面试题
读书笔记
GitHub (opens new window)
  • 怎么写出更好的css
  • BFC详解
  • box-shadow详解
  • CSS小技巧
  • Grid布局详解
    • 基本概念
    • 容器和项目
    • 行和列
    • 项目属性(子级)
  • css
junwen
2021-03-20

Grid布局详解

# Grid布局详解

摘自掘金Grid布局详解 (opens new window)

Flex布局: 一维布局
Grid布局: 二维布局

# 基本概念

# 容器和项目

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

<div>
  <div><p>1</p></div>
  <div><p>2</p></div>
  <div><p>3</p></div>
</div>
1
2
3
4
5

最外层的div就是容器,内层的三个div就是项目

# 行和列

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

  • 图中交叉的区域,成为单元格(cell)

  • 正常情况下,n行和m列会产生n*m个单元格

  • 划分网格的线成为网格线(grid line)。水平网格线划出行,垂直网格线划出列

正常情况下,n行有n + 1根水平网格线,m列有m + 1根垂直网格线,比如三行就有四根水平网格线。 可以使用方括号[],指定每一根网格线的名字,方便以后的引用。

.container {
    grid-template-columns: [第一根纵线] 80px [纵线2] auto [纵线3] 100px [最后的结束线];
    grid-template-rows: [第一行开始] 25% [第一行结束] 100px [行3] auto [行4] 60px [行末];
}
1
2
3
4

# 容器属性(父级)

div {
  display: grid;
}
1
2
3
div {
  display: inline-grid;
}
1
2
3

# grid-template-columns grid-template-rows

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
}
1
2
3
4
5

# fr单位是什么

fr是单词fraction的缩写,表示分数

div{
  .container {
    grid-template-columns: 1fr 1fr 1fr;
  }
}
1
2
3
4
5

表达的意思即为网格宽度三等分;

# repeat()

使用repeat函数简化重复值,改写代码为:

.container {
  display: grid;
  grid-template-rows: repeat(3, 33.33%);
  grid-template-columns: repeat(3, 33.33%);
}
//第一个参数为重复的次数,第二个参数为所要重复的值
1
2
3
4
5
6

重复某种模式

grid-template-columns: repeat(2, 100px 20px 80px);
1

# auto-fill

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

.container {
  display: grid;
  grid-template-columns: repeat(auto-fill, 100px)
}
1
2
3
4

# grid-row-gap、grid-column-gap、grid-gap

  • grid-row-gap: 行与行之间的行间距
  • grid-column-gap: 列与列之间的行间距
  • grid-gap属性是上面两者的合并简写
.container {
  grid-row-gap: 20px;
  grid-column-gap: 20px;
}
// 等同于
.container {
  grid-gap: 20px 20px;
}
//如果grid-gap省略第二个值则浏览器认为第二个值等于第一个值
1
2
3
4
5
6
7
8
9

根据最新标准,上面三个属性名的grid-前缀已经删除,grid-column-gap和grid-row-gap写成column-gap和 row-gap,grid-gap写成gap。

# grid-template-areas

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

.container {
  display: grid;
  grid-template-columns: 100px 100px 100px;
  grid-template-rows: 100px 100px 100px;
  grid-template-areas: 'a b c'
                       'd e f'
                       'g h i';
}
1
2
3
4
5
6
7
8

上面代码先划分出9个单元格,然后将其定名为a到i的九个区域,分别对应这九个单元格。
多个单元格合并成一个区域的写法如下:

grid-template-areas: 'a a a'
                     'b b b'
                     'c c c';

1
2
3
4

如果某些区域不需要利用,则使用点(.)表示:

grid-template-areas: 'a . c'
                     'd . f'
                     'g . i';
1
2
3

上面代码中,中间一列为点,表示没有用到该单元格,或者该单元格不属于任何区域。

注意,区域的命名会影响到网格线。每个区域的起始网格线,会自动命名为区域名-start,终止网格线自动命名为区域名-end。
比如,区域名为header,则起始位置的水平网格线和垂直网格线叫做header-start,终止位置的水平网格线和垂直网格线叫做header-end。

# grid-auto-flow

划分网格以后,容器的子元素会按照顺序,自动放置在每一个网格。默认的放置顺序是"先行后列",即先填满第一行,再开始放入第二行。
这个顺序由grid-auto-flow属性决定,默认值是row,即"先行后列"。也可以将它设成column,变成"先列后行"。
grid-auto-flow属性除了设置成row和column,还可以设成row dense和column dense。这两个值主要用于,某些项目指定位置以后,剩下的项目怎么自动放置。

# justify-items 属性、align-items属性、place-items属性

  • justify-items水平位置(左中右)
  • align-items垂直位置(上中下)
  • place-items属性是align-items属性和justify-items属性的合并简写形式。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
stretch:拉伸,占满单元格的整个宽度(默认值)。

.container {
  justify-items: start;
}

.container {
  place-items: start end;
}
1
2
3
4
5
6
7
8
9
10
11
12

如下图所示:

# justify-content 属性、align-content 属性、place-content 属性

  • justify-content属性是整个内容区域在容器里面的水平位置(左中右)
  • align-content属性是整个内容区域的垂直位置(上中下)
.container {
  justify-content: start | end | center | stretch | space-around | space-between | space-evenly;
  align-content: start | end | center | stretch | space-around | space-between | space-evenly;  
}

1
2
3
4
5

# grid-auto-columns 属性,grid-auto-rows 属性

grid-auto-columns属性和grid-auto-rows属性用来设置,浏览器自动创建的多余网格的列宽和行高。它们的写法与grid-template-columns和grid-template-rows完全相同。如果不指定这两个属性,浏览器完全根据单元格内容的大小,决定新增网格的列宽和行高。

# 项目属性(子级)

# grid-column-start 属性 grid-column-end 属性 grid-row-start 属性 grid-row-end 属性

grid-column-start属性:左边框所在的垂直网格线
grid-column-end属性:右边框所在的垂直网格线
grid-row-start属性:上边框所在的水平网格线
grid-row-end属性:下边框所在的水平网格线
1
2
3
4

# grid-column 属性,grid-row 属性

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

# grid-area

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

# justify-self,align-self,place-self

  • justify-self属性设置单元格内容的水平位置(左中右),跟justify-items属性的用法完全一致,但只作用于单个项目。
  • align-self属性设置单元格内容的垂直位置(上中下),跟align-items属性的用法完全一致,也是只作用于单个项目。
  • place-self属性是align-self属性和justify-self属性的合并简写形式。
start:对齐单元格的起始边缘。
end:对齐单元格的结束边缘。
center:单元格内部居中。
stretch:拉伸,占满单元格的整个宽度(默认值)。
1
2
3
4
在Github上编辑此页 (opens new window)
#CSS
上次更新: 3/22/2021, 3:14:54 AM
CSS小技巧

← CSS小技巧

最近更新
01
如何打造全链路项目生命周期的统一交付平台
04-10
02
如何建立前端标准化研发流程
04-10
03
如何从0到1一步步成体系地搭建CI
04-10
更多文章>
Theme by Vdoing | Copyright © 2019-2021 Syun
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式