Grid 布局

news/2024/5/5 15:50:24

文章目录

  • 容器属性
    • display 属性
    • grid-template-columns 和 grid-template-rows 属性
    • row-gap、column-gap、gap 属性
    • grid-template-areas 属性
    • grid-auto-flow 属性
    • justify-items、align-items、place-items 属性
    • justify-content、align-content、place-content 属性
    • grid-auto-columns、grid-auto-rows 属性
  • 项目属性
    • grid-column-start、grid-column-end、grid-row-start、grid-row-end 属性
    • grid-area 属性
    • justify-self、align-self、place-self 属性
  • Grid 实战
    • fr 实现等分响应式
    • repeat + auto-fit——固定列宽,改变列数量
    • repeat+auto-fit+minmax 去掉右侧空白
    • repeat+auto-fit+minmax-span-dense 解决空缺问题
  • 网友评价

Grid布局是一种用于网页布局的CSS技术,它允许开发者定义一个元素内部的行和列,并在这些网格中放置子元素。
这是一个强大的布局方式,可以看作是二维布局,也是唯一的二维布局方案。

容器属性

display 属性

通过在元素上声明 display:grid 或 display:inline-grid 来创建一个网格容器。

  • display:grid :该容器是一个块级元素
  • display: inline-grid :容器元素为行内元素
<div class="wrapper"><div class="one item">One</div><div class="two item">Two</div><div class="three item">Three</div><div class="four item">Four</div><div class="five item">Five</div><div class="six item">Six</div>
</div><style>.wrapper {display: grid;}
</style>

grid-template-columns 和 grid-template-rows 属性

  • grid-template-columns :设置列宽
  • grid-template-rows :设置行高
.wrapper {display: grid;gap: 5px;/*  声明了三列,宽度分别为 200px 100px 200px */grid-template-columns: 200px 100px 200px;/*  声明了两行,行高分别为 50px 50px  */grid-template-rows: 50px 50px;
}

在这里插入图片描述

  1. repeat()
    可以简化重复的值。该函数接受两个参数,第一个参数是重复的次数,第二个参数是所要重复的值。
    比如上面行高都是一样的,我们可以这么去实现,实际效果是一模一样的
    .wrapper {display: grid;gap: 5px;grid-template-columns: 200px 100px 200px;/*  2行,而且行高都为 50px  */grid-template-rows: repeat(2, 50px);
    }

.

  1. auto-fill
    表示自动填充,多少列(行)自适应,让一行(或者一列)中尽可能的容纳更多的单元格。

    grid-template-columns: repeat(auto-fill, 200px) 表示列宽是 200 px,但列的数量是不固定的,只要浏览器能够容纳得下,就可以放置元素,代码以及效果如下图所示:

    .wrapper-2 {display: grid;gap: 5px;/*  列宽200px  多少列自适应 */grid-template-columns: repeat(auto-fill, 200px);grid-template-rows: 50px 50px;
    }
    

    在这里插入图片描述
    .

  2. fr
    fr 单位代表网格容器中可用空间的一等份。
    grid-template-columns: 200px 1fr 2fr 表示第一个列宽设置为 200px,后面剩余的宽度分为两部分,宽度分别为剩余宽度的 1/3 和 2/3。代码以及效果如下图所示:

    .wrapper {display: grid;gap: 5px;/*  第一个列宽设置为 200px,后面列宽分别为剩余宽度的 1/3 和 2/3  */grid-template-columns: 200px 1fr 2fr;grid-template-rows: 50px 50px;
    }
    

    在这里插入图片描述
    .

  3. minmax()
    minmax() 函数产生一个长度范围,表示长度就在这个范围之中都可以应用到网格项目中。

    它接受两个参数,分别为最小值和最大值。

    grid-template-columns: 1fr 1fr minmax(300px, 2fr) 的意思是,第三个列宽最少也是要 300px,但是最大不能大于第一第二列宽的两倍。代码以及效果如下:

    .wrapper {display: grid;gap: 5px;/*  第三个列宽最少也是要 300px,但是最大不能大于第一第二列宽的两倍  */grid-template-columns: 1fr 1fr minmax(300px, 2fr);grid-template-rows: 50px 50px;
    }
    

    在这里插入图片描述
    .

  4. auto
    通过 auto 关键字,我们可以轻易实现三列或者两列布局。
    grid-template-columns: 100px auto 100px 表示第一第三列为 100px,中间由浏览器决定长度,代码以及效果如下:

    .wrapper {display: grid;gap: 5px;/*  第一第三列为 100px,中间自适应  */grid-template-columns: 100px auto 100px;grid-template-rows: 50px 50px;
    }
    

    在这里插入图片描述


row-gap、column-gap、gap 属性

  • row-gap:设置行间距
  • column-gap :设置列间距
  • gap:是两者的简写形式

grid-row-gap、grid-column-gap、grid-gap 属性已被废弃,建议使用新的、未被废弃的属性row-gapcolumn-gapgap

这些属性是在CSS Grid规范拟定早期加入的,用于设置网格布局中行与行之间、列与列之间以及行和列之间的间距。然而,随着gap属性在CSS3新特性中的普及,这些旧的grid-*属性被逐渐废弃。

.wrapper {display: grid;grid-template-columns: 200px 100px 100px;grid-template-rows: 50px 50px 50px;/*  行间距是10px  */row-gap: 10px;/*  列间距是20px  */column-gap: 20px;/* 简写: 行间距是10px  列间距是20px */gap: 10px 20px;
}

在这里插入图片描述


grid-template-areas 属性

grid-template-areas 属性用于定义区域,一个区域由一个或者多个单元格组成

一般这个属性跟网格元素的 grid-area 一起使用,我们在这里一起介绍。
grid-area 属性指定项目放在哪一个区域

.wrapper {display: grid;gap: 10px;grid-template-columns: 120px  120px  120px;grid-template-areas:". header  header""sidebar content content";
}.sidebar {grid-area: sidebar;
}.content {grid-area: content;
}.header {grid-area: header;
}

上面代码表示划分出 6 个单元格,其中值得注意的是 . 符号代表空的单元格,也就是没有用到该单元格。

header元素会占据第一行的两个连续区域,aside元素会占据第二行的第一个区域,而两个content 元素会占据第二行的后两个区域。
在这里插入图片描述


grid-auto-flow 属性

grid-auto-flow 属性控制着自动布局算法怎样运作,精确指定在网格中被自动布局的元素怎样排列。

  • grid-auto-flow: row:放置顺序是"先行后列",即先填满第一行,再开始放入第二行(默认值是 row)

    .wrapper {display: grid;gap: 5px;grid-template-columns: 100px 200px 100px;grid-auto-rows: 50px;grid-auto-flow: row;
    }
    

    在这里插入图片描述

  • grid-auto-flow: column:放置顺序是"先列后行",即先填满第一列,再开始放入第二列

    .wrapper {display: grid;gap: 5px;grid-auto-columns: 100px;grid-template-rows: 50px 50px;grid-auto-flow: column;
    }
    

    在这里插入图片描述


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

作用的是每个单元格item

  • justify-items每个单元格的水平位置(左中右)
  • align-items每个单元格的垂直位置(上中下)
  • place-items:是两者的简写形式
.wrapper {display: grid;gap: 5px;grid-template-columns: 100px 200px 100px;grid-auto-rows: 50px;justify-items: start;
}

它们都有四个值:start | end | center | stretch

  • stretch:拉伸,占满单元格的整个宽度(默认值)

在这里插入图片描述

  • start:对齐单元格的起始边缘
    在这里插入图片描述

  • end:对齐单元格的结束边缘
    在这里插入图片描述

  • center:单元格内部居中
    在这里插入图片描述


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

作用的是整个内容区域content

  • justify-content:是整个内容区域在容器里面的水平位置(左中右)
  • align-content:是整个内容区域在容器里面的垂直位置(上中下)
.wrapper {display: grid;gap: 5px;grid-template-columns: 100px 200px 100px;grid-auto-rows: 50px;justify-content: start;
}

它们都有七个值:start | end | center | stretch | space-around | space-between | space-evenly

  • start:对齐容器的起始边框
  • end:对齐容器的结束边框
  • center:容器内部居中
    在这里插入图片描述

.

  • space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与容器边框的间隔大一倍
  • space-between:项目与项目的间隔相等,项目与容器边框之间没有间隔
  • space-evenly:项目与项目的间隔相等,项目与容器边框之间也是同样长度的间隔
  • stretch:项目大小没有指定时,拉伸占据整个网格容器
    在这里插入图片描述

grid-auto-columns、grid-auto-rows 属性

仅影响那些未明确设置大小的列(行)

  • grid-auto-columns:设置网格容器中列的默认大小
  • grid-auto-rows:设置网格容器中行的默认大小

该属性的语法允许使用多种值:

  • auto:默认值,由容器的大小决定列的尺寸
  • max-content:根据列中最大的网格元素设置每列的大小
  • min-content:根据列中最小的网格元素设置每列的大小
  • length:使用自定义的长度值设置列的大小
.wrapper {display: grid;gap: 10px;grid-template-columns: 200px 100px;/*  只设置了两行,但实际的数量会超出两行,超出的行高会以 grid-auto-rows 算 */grid-template-rows: 100px 100px;grid-auto-rows: 50px;
}
  • 显式网格:这里grid-template-columnsgrid-template-rows 属性只是指定了两行两列,也就是4个元素的显式网格。
  • 隐式网格:但实际有九个元素,剩下的4个元素就是隐式网格。通过 grid-auto-rows 可以指定隐式网格的行高为 50px

如下图所示:
在这里插入图片描述

在早期的CSS Grid规范中,当网格容器的内容超出了显式定义的网格线时,会创建隐式网格。

然而,隐式网格的某些行为可能会导致布局的不确定性,因此现在更推荐使用显式定义网格线的方式来避免这些问题。



项目属性

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

可以指定网格项目所在的四个边框,分别定位在哪根网格线,从而指定项目的位置

  • grid-column-start:左边框所在的垂直网格线
  • grid-column-end:右边框所在的垂直网格线
  • grid-row-start:上边框所在的水平网格线
  • grid-row-end:下边框所在的水平网格线
.wrapper {display: grid;grid-template-columns: repeat(3, 1fr);gap: 20px;grid-auto-rows: minmax(100px, auto);
}
.one {grid-column-start: 1;grid-column-end: 2;background: #19CAAD;
}
.two { grid-column-start: 2;grid-column-end: 4;grid-row-start: 1;grid-row-end: 2;/*   如果有重叠,就使用 z-index */z-index: 1;background: #8CC7B5;
}
.three {grid-column-start: 3;grid-column-end: 4;grid-row-start: 1;grid-row-end: 4;background: #D1BA74;
}
.four {grid-column-start: 1;grid-column-end: 2;grid-row-start: 2;grid-row-end: 5;background: #BEE7E9;
}
.five {grid-column-start: 2;grid-column-end: 3;grid-row-start: 2;grid-row-end: 5;background: #E6CEAC;
}
.six {grid-column: 3;grid-row: 4;background: #ECAD9E;
}

上面代码中:.two 所在的网格项目,垂直网格线是从 2 到 4,水平网格线是从 1 到 2。其中它跟 .three (垂直网格线是从3 到 4,水平网格线是从 1 到 4) 是有冲突的。可以设置 z-index 去决定它们的层级关系


grid-area 属性

grid-area 属性指定项目放在哪一个区域,与上面的 grid-template-areas类似

<div class="wrapper"><div class="box header">Header</div><div class="box sidebar">Sidebar</div><div class="box content">Content</div>
</div>
.wrapper {margin: 50px;display: grid;gap: 10px;grid-template-columns: 120px  120px  120px;grid-template-areas:". header  header""sidebar content content";background-color: #fff;color: #444;
}.sidebar {grid-area: sidebar;
}.content {grid-area: content;
}.header {grid-area: header;
}

在这里插入图片描述


justify-self、align-self、place-self 属性

justify-itemsalign-itemsplace-items属性的用法完全一致,但只作用于单个项目

  • justify-self:设置单元格内容的水平位置(左中右)
  • align-self:设置单元格内容的垂直位置(上中下)
  • place-self:是两者的简写形式

它们有同样的四个值:start | end | center | stretch

.item {justify-self: start;
}
.item-1 {justify-self: end;
}
.item-2 {justify-self: center;
}
.item-3 {justify-self: stretch;
}
  • stretch:拉伸,占满单元格的整个宽度(默认值)
    在这里插入图片描述

  • start:对齐单元格的起始边缘
    在这里插入图片描述

  • end:对齐单元格的结束边缘
    在这里插入图片描述

  • center:单元格内部居中
    在这里插入图片描述



Grid 实战

fr 实现等分响应式

fr 等分单位,可以将容器的可用空间分成想要的多个等分空间。利用这个特性,我们能够轻易实现一个等分响应式。

grid-template-columns: 1fr 1fr 1fr 表示容器分为三等分

.wrapper {display: grid;gap: 10px 20px;grid-template-columns: 1fr 1fr 1fr;grid-auto-rows: 50px;
}

在这里插入图片描述

等分布局并不只有 Grid 布局才有,像 flex 布局也能轻松实现:flex: 1


repeat + auto-fit——固定列宽,改变列数量

网格能够固定列宽,并根据容器的宽度来改变列的数量。

这个时候,我们可以用到上面提到 repeat() 函数以及 auto-fit 关键字

grid-template-columns: repeat(auto-fit, 200px) 表示固定列宽为 200px,数量是自适应的,只要容纳得下,就会往上排列,代码以及效果实现如下:

.wrapper {display: grid;gap: 10px 20px;/* 固定列宽为 200px,数量是自适应的 */grid-template-columns: repeat(auto-fit, 200px);grid-auto-rows: 50px;
}

在这里插入图片描述


repeat+auto-fit+minmax 去掉右侧空白

上面看到的效果中,右侧通常会留下空白,这是我们不希望看到的。如果列的宽度也能在某个范围内自适应就好了。

minmax() 函数就帮助我们做到了这点。

grid-template-columns: repeat(auto-fit, 200px) 改成 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)) 表示每列的数量是自适应的;列宽至少是200px,如果还有空余则一起等分。

.wrapper {display: grid;gap: 10px 20px;/* 每列的数量是自适应的;列宽至少是200px,如果还有空余则一起等分 */grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));grid-auto-rows: 50px;
}

在这里插入图片描述


repeat+auto-fit+minmax-span-dense 解决空缺问题

如果每个网格元素的长度不相同,则通过 span 关键字进行设置网格项目的跨度

grid-column-start: span 3,表示这个网格项目跨度为 3。

.four {grid-column-start: span 3;
}

在这里插入图片描述
怎么右侧又有空白了?原来是有一些长度太长了,放不下。

这个时候就到我们的 dense 关键字 出场了。

grid-auto-flow: row dense 表示尽可能填充,而不留空白

.wrapper {display: grid;gap: 10px 20px;grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));grid-auto-rows: 50px;grid-auto-flow: row dense;
}

网友评价

  • 张鑫旭:强虽然强,但是学起来累啊,我并不看好日后的普及。

  • 强大并不意味着实用,还是要考虑实际情况

  • Grid兼容性低于flex,不兼容ie


链接:最强大的 CSS 布局 —— Grid 布局 https://juejin.cn/post/6854573220306255880


http://www.mrgr.cn/p/71117086

相关文章

KNN算法思想与Python实现

古语说得好,物以类聚,人以群分;近朱者赤,近墨者黑。这两句话的大概意思就是,你周围大部分朋友是什么人,那么你大概率也就是这种人,这句话其实也就是K最近邻算法的核心思想。kNN(k- Nearest Neighbor)法即k最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较…

数据结构练习-算法与时间复杂度

----------------------------------------------------------------------------------------------------------------------------- 1. 设n是描述问题规模的非负整数&#xff0c;下列程序段的时间复杂度是( )。 x0;while(n>(x1)*(x1)xx1; A.O(logn) B.O(n^(1/2)) C.O(n)…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

HarmonyOS 应用生命周期有哪些? 按返回键会调用哪些生命周期?

UIAbility 生命周期:onCreate :页面初始化,变量定义,资源加载。 onWindowStageCreate:设置 UI 界面加载、设置 WindowStage 的事件订阅。 onForeground:切换至前台,申请系统需要的资源,或者重新申请在 onBackground()中释放的资源。 onBackground:切换至后台,释放 U…

(007)Blender 根据顶点组分离模型

1.选中模型&#xff0c;并且进入【3D视图】【编辑模式】&#xff1a; 2.选择顶点组&#xff1a; 3.分离选中项&#xff1a;

DRF之过滤 排序 分页

DRF之过滤 排序 分页使用【过滤 排序 分页】都需要在继承了GenericAPIView的视图类下使用 并指定类属性【queryset 和 serializer_class】【一】过滤 # 所有过滤类都继承 【BaseFilterBackend】 from rest_framework.filters import BaseFilterBackend【1】drf自带的过滤 # 导入…

图文结合手把手教你创建SpringCloud项目

前言 什么是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的开发便利性简化了分布式系统的开发,比如服务注册、服务发现、网关、路由、链路追踪等。Spring Cloud 并不是重复造轮子,而是将市面上开发得比较好的模块集成进去,进行封装,从而减少了…

redis中的缓存穿透问题

缓存穿透 缓存穿透问题&#xff1a; 一般请求来到后端&#xff0c;都是先从缓存中查找数据&#xff0c;如果缓存中找不到&#xff0c;才会去数据库中查询数据。 而缓存穿透就是基于这一点&#xff0c;不断发送请求查询不存在的数据&#xff0c;从而使数据库压力过大&#xff…

ubuntu无法用快捷键启动终端(CTRL+AIT+T)

我的电脑不知道安装什么东西之后&#xff0c;就不能用快捷键&#xff08;CTRLAITT&#xff09;打开终端了 只能在文件夹内&#xff0c;点击鼠标右键选择终端&#xff0c;然后打开终端 一直这么用了几个月&#xff0c;今天实在受不了了&#xff0c;所以解决此问题 本文参考文章…

力扣-118. 杨辉三角

1.题目介绍 题目地址(118. 杨辉三角 - 力扣(LeetCode)) https://leetcode.cn/problems/pascals-triangle/ 题目描述 给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例 1: 输入: numRows = 5 输出: …

IDEA中springboot项目编译两次的问题

原因:因为在导入项目的之后,项目无法运行,问题1:显示缺少org.springbootframe的依赖,不知道怎么解决,网上搜了个方法,就是勾选下图的选项,意思是把build操作由IDEA交给Maven,勾选之后确实可以启动项目了但是后面在执行Mybatis时,问题2:我发现无论如何都会报一个唯一…

深入刨析 mysql 底层索引结构B+树

文章目录 前言一、什么是索引&#xff1f;二、不同索引结构对比2.1 二叉树2.2 平衡二叉树2.3 B-树2.4 B树 三、mysql 的索引3.1 聚簇索引3.2 非聚簇索引 前言 很多人看过mysql索引的介绍&#xff1a;hash表、B-树、B树、聚簇索引、主键索引、唯一索引、辅助索引、二级索引、联…

计算机为什么需要中断?

// generated by ChatGPT-3.5 & hk416hasu中断是计算机系统中一种重要的机制,它允许系统在执行过程中临时中止当前任务,转而处理其他优先级更高或更紧急的任务,然后再返回原来的任务。以下是一些计算机需要中断的原因:1. 响应外部事件:计算机系统需要能够响应各种外部…

SpringCloud之负载均衡Ribbon

Ribbon 是一个客户端负载均衡工具&#xff0c;主要功能是将面向服务的Rest模板&#xff08;RestTemplate&#xff09;请求转换成客户端负载均衡的服务调用。通过Ribbon&#xff0c;开发人员可以在客户端实现请求的负载均衡&#xff0c;而无需单独部署负载均衡器。Ribbon支持多…

Linux实现文件共享

#nfs-utils、rpcbind 软件包来提供 NFS 共享服务 #客户端创建共享文件夹&#xff1a; nmcli c reload nmcli c up ens160 systemctl stop firewalld systemctl disable firewalld rpm -q nfs-utils rpcbind #查看是否安装 systemctl enable rpcbind systemctl enable nfs…

OpenHarmony网络协议通信—libevent [GN编译] - 事件通知库

libevent主要是用C语言实现了事件通知的功能 下载安装 直接在OpenHarmony-SIG仓中搜索libevent并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/libevent 修改添加依赖的编译脚本 在/developtools/bytrace_standard/…

【爆款推荐】初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高分!-011

PDF格式公众号回复关键字:ZKYDT011原文1 The writer lost her father at the age of four, didn’t she? 解析 1 The writer 这位作者, lost 失去, her father 她的父亲, at the age of four 在4岁的时候, didn’t she?不是吗? 这位作家四岁时失去了父亲,不是吗? 2 Eve…

Laravel 6 - 第十三章 请求

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

关于双向循环列表的插入、删除、遍历

目录 双向循环链表公式初始化双向循环链表 构建双向循环链表结构体 // 双向循环链表节点定义 typedef struct double_loop_node { char data[DATA_LEN]; // 数据域,存储数据长度 struct double_loop_node *next; …

02-属性事件过滤双向绑定

es6的对象写法 // 正常的写法 let arr = [逃课, 打游戏, 欺负小满] let hobbyDetail = {name: "大乔",age: 4,hobby: arr } console.log(hobbyDetail)// 简写 // 正常的写法 let arr = [逃课, 打游戏, 欺负小满] let hobbyDetail = {name: "大乔",age: 4,h…