Grid布局

参考:www.ruanyifeng.com/blog/2019/0...

简介

Grid 布局将容器划分成"n行"和"m列",行和列之间形成单元格。

然后通过指定"项目所在"的单元格,形成布局。

Grid 和Flex相比,flex布局是一维的布局,只能横向或者纵向;而Grid布局则是二维布局。

属性介绍

1、grid-template

在容器上,我们可以通过grid-template对行和列进行设置

1.1、按比例配置

最简单的用法

可以按百分比配置

css 复制代码
 .container {
   /* 设置grid有2行,分别占70%和30% */
   grid-template-rows: 70% 30%;  
   /* 设置grid有2列,分别占70%和30% */
   grid-template-columns: 70% 30%;  
 }

也可以按fr来设置

css 复制代码
 .container {
   grid-template: 1fr 1fr / 1fr 1fr; // 2行2列
 }

1.2、repeat简写

有时候,网格很多,重复写同样的值很麻烦,可以用repeat()函数简化

repeat()接受两个参数:

  • 第一个参数是重复的次数
  • 第二个参数是所要重复的值

值可以写n个,用空格隔开

css 复制代码
 .container {
   display: grid;
   grid-template-rows: repeat(3, 33.33%);  
   grid-template-columns: repeat(2, 100px 20px 80px); // 值可以写n个,用空格隔开
 }

1.3、auto-fill&auto-fit

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

auto-fill
css 复制代码
 .container {
   display: grid;
   grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); // 每列宽100px,然后自动填充。
 }
auto-fit

和auo-fill类似,细微区别在于,如果需要在container空间足够大的时候,自动拉伸网格,不留最后的空隙,用auto-fit

css 复制代码
 .container {
     display: grid;
     grid-template-columns: repeat(auto-fit, minmax(100px, 1fr));
 }

一个动图展示一下差别

2、grid-template-areas

定义区域

网格布局允许指定区域,

一个区域可以是一个或者多个单元格组成,行于行之间用空格或者换行符隔开;

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

css 复制代码
 .container {
   display: grid;
   grid-template-columns: 1fr 1fr 1fr;
   grid-template-rows: 1fr 1fr 1fr
   grid-template-area: 'a a .'
                       'd e f'
                       'g h i'
 }

eg: 做成一个合并单元格类似的布局

css 复制代码
 .container {
   display: grid;
   grid-template: 1fr 1fr / 1fr 1fr 1fr 1fr;
   grid-template-areas:
         "a a b c"
         "a a d e";
 }
 ​
 /* 指定区域 */
 .container .item-1 {
   grid-area: a;
 }

3、grid-auto-flow

可以设置container的子元素排放方向,有点类似于flex布局里的flex-flow

  • row 先行后列
  • column 先列后行
  • dense 先行后列 紧凑
  • column dense 先列后行 紧凑

3.1 row 先行后列

css 复制代码
 .grid-auto-flow-row {
   display: grid;
   grid-template: repeat(3, 1fr) / repeat(3, 1fr);
   grid-auto-flow: row;
 }

3.2 column 先列后行

css 复制代码
 .grid-auto-flow-column {
   display: grid;
   grid-template: repeat(3, 1fr) / repeat(3, 1fr);
   grid-auto-flow: column;
 }

3.3 dense 紧凑排列

有点不好理解,大概的意思是:如果前面有空间,那么就利用起来,将grid插入进去。

比如下面这个例子: item-1从第二列开始放,如果不用dense,1前面会有一个空格。用了dense,就会将2插进去;

css 复制代码
 .grid-auto-flow-dense {
   display: grid;
   grid-template: repeat(3, 1fr) / repeat(3, 1fr);
   /* grid-auto-flow: row;  */
   grid-auto-flow: dense;
   margin-top: 10px;
 }
 .grid-auto-flow-dense .item-1 {
   grid-column-start: 2; // 从第二列开始放
 }

4、一些其他属性

grid-gap

和gap属性作用一样

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

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

place-items

place-items属性是align-items属性和justify-items属性的合并简写形式。

  • justify-items

justify-items属性设置单元格内容的水平位置(左中右)

css 复制代码
 .container {
   justify-items: start | end | center | stretch;
 }
  • align-items
css 复制代码
 .container {
   align-items: start | end | center | stretch;
 }

justify-content

justify-content属性是整个内容区域在容器里面的水平位置(左中右)

align-content

align-content属性是整个内容区域在容器里面的垂直位置(上中下)

5、和子元素相关的配置

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

item只能是容器的顶层子元素,不包含项目的子元素。

grid-column/grid-row

每一个item的位置是可以单独指定的,具体就是通过指定item的4个边框,分别定为在哪根网格线上。

css 复制代码
 grid-column-start 属性,左边框所在的垂直网格线
 grid-column-end 属性, 右边框所在的垂直网格线
 grid-row-start 属性,上边框所在的水平网格线
 grid-row-end 属性 下边框所在的水平网格线
 ​
 grid-column-start: auto: 默认属性、自动放置。

比如下面代码指定,第一个item,左边框从第2根网格线开始,到第4根网格线结束

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

span

表示跨域,即左右或者上下之间跨越了多少个网格。默认跨度为1.

html 复制代码
 <fieldset class="fieldset">
       <legend>
         grid-column-span
       </legend>
       <div class="grid grid-column-span">
         <div class="item item-1">1</div>
         <div class="item item-2">2</div>
         <div class="item item-3">3</div>
         <div class="item item-4">4</div>
         <div class="item item-5">5</div>
         <div class="item item-6">6</div>
         <div class="item item-7">7</div>
         <div class="item item-8">8</div>
         <div class="item item-9">9</div>
       </div>
     </fieldset>
css 复制代码
 .grid {
   display: grid;
   grid-template: 1fr 1fr / 100px 100px 100px;
 }
 .grid-column-span .item-1 {
   /* 跨越两列 */
   grid-column: span 2;
   /* 跨越两行 */
   grid-row: span 2;
   width: 200px;
   max-width: 200px;
 }

grid-area

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

css 复制代码
 .container {
   grid-template-areas: 'a b c' 'd e f' 'g h i'
 }
 ​
 .item-1 {
   grid-area: e;
 }

grid-area属性还可用作grid-row-startgrid-column-startgrid-row-endgrid-column-end的合并简写形式,直接指定项目的位置。用的少

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

justify-self / align-self

和container的justify-itemsalign-items用法相同,只不过这里设置的item里面内容的位置。

css 复制代码
 .item {
   justify-self: start | end | center | stretch;
   align-self: start | end | center | stretch;
 }

如下图,白色代表一个itemitem-a是里面的内容。 他的水平、垂直位置就是靠justify-self / align-self来设置的。

相关推荐
王解12 分钟前
一篇文章读懂 Prettier CLI 命令:从基础到进阶 (3)
前端·perttier
乐闻x17 分钟前
最佳实践:如何在 Vue.js 项目中使用 Jest 进行单元测试
前端·vue.js·单元测试
檀越剑指大厂32 分钟前
【Python系列】异步 Web 服务器
服务器·前端·python
我是Superman丶34 分钟前
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法
开发语言·前端·javascript
Hello Dam35 分钟前
基于 Spring Boot 实现图片的服务器本地存储及前端回显
服务器·前端·spring boot
小仓桑37 分钟前
利用 Vue 组合式 API 与 requestAnimationFrame 优化大量元素渲染
前端·javascript·vue.js
Hacker_xingchen37 分钟前
Web 学习笔记 - 网络安全
前端·笔记·学习
天海奈奈38 分钟前
前端应用界面的展示与优化(记录)
前端
多多*1 小时前
后端并发编程操作简述 Java高并发程序设计 六类并发容器 七种线程池 四种阻塞队列
java·开发语言·前端·数据结构·算法·状态模式
mubeibeinv1 小时前
列表代码思路
前端