css3新增-网格Grid布局

目录

      • flex弹性布局
      • Gird布局
        • 开启网格布局
        • 定义网格中的行和列
          • 长度值
          • 百分比值
          • 新单位fr
          • 关键字
          • 函数minmax(min, max)
          • 函数-repeat
            • auto-fill vs auto-fit
          • 举例说明
          • grid-template-areas
          • gap
          • grid-auto-columns和grid-auto-rows
          • justify-content+align-content
            • justify-content
            • align-content
          • justify-items + align-items
          • 子元素合并行/列
            • 网格线编号系统
            • grid-column+ grid-row+grid-area
            • 举例说明·
            • 命名网格线

flex弹性布局

flex布局

flex适合一维布局,在进行二维布局时 => 布局当多行,最后一行数量与前面行数不一致会出现展示问题,如下:
在这里插入图片描述
开发者期待的结果是每行展示4个,若是不足4个左对齐。

显然这种情况需要单独处理 如最初就判断元素数量若是%4不为0添加空元素不齐等方式。

但是使用Gird则会轻松解决如上问题。

Gird布局

gird /ɡəːd /(该的 )布局又称网格布局,是将一个容器划分为一个个单元格。

开启网格布局
/* 给父元素设置display: grid | inline-grid;即可开启网格布局*/
display: grid; /*开启块级grid网格布局*/
display:inline-grid; /* 开启内联级的网格布局 */

当开启网格布局之后,以display: grid;为例

  • 父元素成为会成为一个块级网格容器,;这意味着它会像普通的块级元素一样,独占一行宽度若不设置默认会与父元素同宽

  • 子元素被称为 网格项,它们已经脱离了常规的文档流格式上下文,进入了网格格式化上下文;

    它们的行为由网格布局控制。

    举例说明

    <style>.box{width: 800px;min-height: 200px;border: 1px solid #000;/* 开始网格布局 */display: grid;}.box div{background-color: aqua;border-radius: 10px;}
    </style>
    
    <div class="box"><div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div>
    </div>
    

在这里插入图片描述
这里看起来好像这个display:gird并没有任何效果的样子。

如上: 子元素没有设置宽高 默认填充整个单元格;

通过上述例子可以看到 当开启网格布局之后

  • 默认 列数/列宽:只有1列 该列宽度为父元素宽度 => gird-template-columns: 1fr;
  • 默认 行数/行高:行数 = 元素个数 / 列数 有余数+1 / 行高 = 父元素高度/ 行数;
  • 默认 子元素宽高: 每个子元素会占据一个网格单元格, 若是子元素没有设置宽高则默认与单元格同宽同高 => align-content: stretch; justify-content: strecth; 修改这两个属性后 子元素就会由内容撑开宽高了。
定义网格中的行和列
  • 定义网格的行结构 和 列结构
    grid-template-columns:定义网格的列结构和每列的宽度;
    
    grid-template-rows:定义网格的行结构和每行的宽度;
    

其强大之处在于它的属性值是非常灵活的

这两个属性的语法完全相同,只是方向不同,在此使用columns进行展示。

长度值

若是属性值为长度值,单位可以是px\rem\em等单位

grid-template-columns: 150px 150px 150px 150px;

上述代码表示将网格分为4列,每列的宽度为150px

grid-template-columns: 200px 100px 300px;

上述代码表示将网格分为3列,宽度分别为200px 100px 300px;

百分比值

属性的值也可以是百分比,表示按比例分配父元素的宽度

grid-template-columns: 25% 50% 25%;

上述代码表示将网格分为3列 第二列的宽度是第一列和第三列的2倍;

新单位fr

使用百分比可以按照比例分配,但是若是列过多需要计算值并且每增加/减少一列都需要重新计算 => 不灵活;

fr是Grid 布局中独有的单位,代表“剩余空间”的等分份额。它解决了百分比和固定值布局不灵活的问题。

grid-template-columns: 1fr 1fr 1fr 1fr;

上述代码表示将网格列分为4列并且宽度等分。

grid-template-columns: 1fr 2fr 1fr 1fr;

上述代码表示将网格列分为4列,宽度以1:2:1:1的形式进行展示。

grid-template-columns: 100px 2fr 1fr 1fr;

上述代码表示将网格分为4列,第一列固定为100px,剩余宽度分给后面的三列,比例为2:1:1

关键字
  • auto:由浏览器决定宽度。通常会让内容撑满剩余空间,类似于 flex: 1

    grid-template-columns: 100px  100px auto 100px;
    // 假设父盒子的宽度为800px 那么就是将网格分为4列 每列的宽度分别是100px 100px 800-100-100-100 = 500px 100px
    grid-template-columns: 1fr 1fr auto 1fr;
    // 先按照内容给第三列划分宽度,剩余宽度平均分给第一、二、四列
    
  • min-content: 列/行的最小宽度/高度,由该轨道中最小不可断内容(如一个长单词或一张图片)决定。

  • max-content: 列/行的宽度/高度,由该轨道中最大内容(如最长的单词或最宽的图片)决定。

函数minmax(min, max)

minmax(min, max): 定义一个尺寸范围,轨道尺寸将在这个范围内变化。

min: 最小值

max: 最大值

非常有用,可以创建响应式布局。

函数-repeat

repeat的作用是重复创建具有相同模式的轨道,简化书写

repeat(count | auto-fill | auto-fit, track-list)
  • count: 重复次数,如 3。

  • auto-fill / auto-fit: 根据容器宽度自动填充轨道(用于创建响应式布局)。

举例说明

 grid-template-columns: 1fr 1fr 1fr 1fr; /* 简写 */grid-template-columns: repeat(4, 1fr);
grid-template-columns: 1fr 1fr auto 1fr;/* 简写 */
grid-template-columns: repeat(2, 1fr) auto 1fr;
auto-fill vs auto-fit
/* 尽可能多的创建宽度为200px的列*/
grid-template-columns: repeat(auto-fit, 200px);

auto-fill vs auto-fit: 当轨道数量不足以填满一行时,auto-fill 会保留空白轨道空间,而 auto-fit 会将空白轨道折叠(将其尺寸压缩为0),让非空白轨道扩张以填满空间。在大多数响应式布局中,auto-fit 更常用。

让我们在实际应用场景理解一下这个问题 => 现在想设置宽度为200px的列,至于设置几行需要根据父元素的宽度来决定(响应式的),此时就可以使用auto-fill/auto-fit来实现

grid-template-columns: repeat(auto-fill, 200px);
grid-template-columns: repeat(auto-fit, 200px);

但是此时发现一个问题,以父元素宽度为700px为例,发现空余部分会被保留,如下:
在这里插入图片描述
看起来就比较丑,若是希望多余空白部分被均分,可以进行如下配置

 grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));

minmax(200px, 1fr) 表示列宽最小为200px,最大可以扩展到1fr;

这里要重点关注minmax函数里面的1fr => 1fr 的计算方式:

当容器有剩余空间时,所有设置为 1fr 的轨道会平均分配这些剩余空间每个 1fr 代表"一份"剩余空间

通过设置父容器的宽度为百分比,再配合auto-fill和minmax(),就能根据屏幕大小自动调整网格的列数,让布局始终优雅地适应各种设备。

举例说明

现在将所有元素统一大小宽高均为80px 填充在父元素内, 超过父元素宽度就换行

<style>.box{width: 300px;height: 300px;border: 1px solid #000;/* 开始网格布局 */display: grid;grid-template-columns: repeat(auto-fit, 80px);/* grid-template-rows: repeat(auto-fit, 80px);  这行代码写了是没有意义的 当划分好列之后,会根据子元素的数量划分行数 行高会根据行数平分父元素的高度!!!!!*/}.box div{background-color: aqua;color: #fff;border-radius: 2px;}
</style>
</head>
<body><div class="box"><div>1</div><div>1</div><div>1</div><div>1</div><div>1</div><div>1</div><div>1</div><div>1</div><div>1</div></div>
</body>

在这里插入图片描述
此时发现子元素之间没有间隙并且父元素🈶️空白缝隙

  • 若是不想保留父元素的空白缝隙 => 子元素平分,可以这样写
    grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
    
  • 若是想将元素之间留有空隙,可以使用gap属性
grid-template-areas

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

gap

控制网格之间的间距有以下几种属性

  • column-gap - 控制网格列之间的间距

  • row-gap - 控制网格行之间的间距

  • gap - 同时设置column-gap和row-gap的简写属性

注意: gap属性是控制网格之间的间距的 和父元素的间距是没有设置的,如下:

grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
gap: 24px;

上述案例在网页中展示如下:
在这里插入图片描述
若是需要父元素和子元素之间设置相同大小,需要给父元素设置padding

padding: 24px;
grid-auto-columns和grid-auto-rows

设定隐藏的网格轨道的大小

justify-content+align-content
justify-content

justify-content 属性用于**控制整个网格在网格容器内的水平对齐方式 **=> 适用于当网格总宽度小于网格容器宽度时)

属性值说明
start网格与网格容器的左端对齐(默认值)
end网格与网格容器的右端对齐
center网格处于网格容器的X轴的中间
stretch调整网格项的大小,使其宽度填充整个网格容器
space-around相当于给每一列单元格添加相同的左右margin
space-between只给单元格内部添加边距,与父元素之间无边距
space-evenly每一列之间的左右间距是相同的 与边缘也有相同的距离

注意点: stretch只在特定情境有效

  • [1] 网格总宽度小于容器宽度
  • [2] 网格项目`没有固定宽度内容尺寸限制
  • 网格轨道尺寸使用可拉伸单位(如 fr、auto)

举例说明

display: grid;
grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
gap: 24px;
/* justify-content: center; */

像上述例子中,justify-content设置不设置没有任何意义;

因为repeat(auto-fit, minmax(80px, 1fr))的意思是尽可能多的划分宽度为80px的列 若是有空白缝隙平分给这些划分好的列;

所以上述案例中的 网格总宽度 = 网格容器也就是父元素的宽度(而justify-content适用于 网格总宽度< 网格容器也就是父元素的宽度)!

  width: 300px;height: 300px;border: 1px solid #000;/* 开始网格布局 */display: grid;grid-template-columns: repeat(2, 50px);gap: 24px;

如上:设置了两列100px<300px 此时就可以通过justify-content来控制单元格的显示位置了

在这里插入图片描述

justify-content通常与 align-content 一起使用,实现网格在容器中的精确定位。

align-content

align-content 属性用于控制整个网格在容器内的垂直对齐方式(当网格总宽度小于容器宽度时)

属性值说明
start网格与网格容器的上端对齐
end网格与网格容器的下端对齐
center网格处于网格容器的Y轴的中间
stretch调整网格项的大小,使其高度填充整个网格容器 (默认值)
space-around相当于给每一列单元格添加相同的上下margin
space-between只给单元格内部添加边距,与父元素之间无边距
space-evenly每一列之间的上下间距是相同的 与边缘也有相同的距离

这里就解释了为什么没有给子元素设置高度但是子元素依旧能够填充整个单元格的原因了 => align-content的默认属性值为stretch

若是修改该属性值,子元素的高度就是由内容来撑开了,如下
在这里插入图片描述
若是还是想要在不设置高度的情况下进行拉伸可以使用 align-items(子元素的属性)进行控制

justify-items + align-items

justify-content 与 align-content是控制网格在网格容器中的对齐方式

而 justify-items 与 align-items是控制内容在单元格中的对齐方式。

子元素合并行/列
网格线编号系统

网格线从1开始编号,从左到右(列),从上到下(行)

一个6列的网格有7条垂直线

一个4行的网格有5条水平线

grid-column+ grid-row+grid-area

语法:

grid-column : [start] / [end] - 从start网线开始到end网线结束 控制列占据 
grid-row: [start] / [end] - 从start网线开始到end网线结束 控制行占据

也可以使用span 关键子进行简写以列为例

gird-column: start / span num  - 从start网线开始 跨越num列

若是该元素同时跨域行和列 也可以使用gird-area简写

gird-area: [row-start] / [column-start] / [row-end] / [column-end]  
举例说明·
<style>.box{width: 300px;height: 300px;border: 1px solid #000;/* 开始网格布局 */display: grid;grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));gap: 24px;}.box div{background-color: aqua;color: #fff;}.haveTwo{grid-column: 2 / 4; /* 这表示该元素将在第2条网线开始到第4条网线结束占据2列*/grid-row: 1 / span 2 ;}
</style>
<body><div class="box"><div>1</div><div class="haveTwo">2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div></div>
</body>

在这里插入图片描述
当然上述案例可以直接使用grid-area结果是相同的,如下

grid-area: 1 / 2 / 3 / 4 ;
命名网格线

在定义轨道的同时,还可以给网格线命名以提高代码可读性,使用方括号定义名称,如 [main-start]

.container {grid-template-columns: [sidebar-start] 200px [sidebar-end content-start] 1fr [content-end];/* 创建了两条列轨道。产生了四条垂直的网格线,它们被命名为:1. sidebar-start2. sidebar-end (同时也是 content-start)3. content-end*/
}

若是使用auto-fit,应该如何命名网格线呢? 这完全不用担心,gird内置自动索引功能,如下

 grid-template-columns: repeat(auto-fit, [col-start] minmax(80px, 1fr) [col-end]);/*创建n条轨道产生了n+2条垂直网线 它们被命名为第一列:col-start 1 和 col-end 1第二列:col-start 2 和 col-end 2第三列:col-start 3 和 col-end 3以此类推...*/

上述示例中 为网格线命名以及使用网格线和并列代码修改如下

grid-template-columns: repeat(auto-fit, [col-start] minmax(80px, 1fr) [col-end]);
grid-column: col-start 2 / col-end 3;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/96722.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/96722.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

最新最强新太极工具3.6 支持Windows和不支持mac电脑,支持免改码,和改码,支持12—18系统

温馨提示&#xff1a;文末有资源获取方式最新最强太极工具3.6支持Windows和Mac计算机&#xff0c;支持无代码更改和代码更改&#xff0c;支持12-18个系统 支持A7-A11芯片、Apple 5s x、iPad A7至A11芯片&#xff0c;支持所有者锁定、激活锁定、无法激活&#xff08;密码界面和禁…

深入浅出 C++20:新特性与实践

C20 是 C 编程语言的一次重要更新&#xff0c;引入了许多新特性和改进&#xff0c;旨在提升代码的简洁性、安全性和性能。本文将详细介绍 C20 的一些核心特性&#xff0c;并通过示例代码帮助读者理解这些特性的应用场景。C20 新特性总结 以下是 C20 的主要新特性及其简要描述&a…

CSS 属性概述

CSS 属性概述 CSS 属性用于控制 HTML 元素的样式和行为&#xff0c;包括布局、颜色、字体、动画等。以下是常用的 CSS 属性分类及示例&#xff1a; 布局相关属性 display: 控制元素的显示方式&#xff0c;如 block、inline、flex、grid。position: 定义元素的定位方式&#…

--- 统一请求入口 Gateway ---

spring cloud gateway 官方文档 Spring Cloud Gateway 中文文档 什么是api网关 对于微服务的每个接口&#xff0c;我们都需要校验请求的权限是否足够&#xff0c;而微服务把项目细化除了许多个接口&#xff0c;若这些接口都要对服务进行权限校验的话&#xff0c;那么无疑加重…

返利app的消息队列架构:基于RabbitMQ的异步通信与解耦实践

返利app的消息队列架构&#xff1a;基于RabbitMQ的异步通信与解耦实践 大家好&#xff0c;我是阿可&#xff0c;微赚淘客系统及省赚客APP创始人&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在返利app的业务流程中&#xff0c;用户下单、返利计算…

Vue3 响应式失效 debug:Proxy 陷阱导致数据更新异常的深度排查

人们眼中的天才之所以卓越非凡&#xff0c;并非天资超人一等而是付出了持续不断的努力。1万小时的锤炼是任何人从平凡变成超凡的必要条件。———— 马尔科姆格拉德威尔 &#x1f31f; Hello&#xff0c;我是Xxtaoaooo&#xff01; &#x1f308; “代码是逻辑的诗篇&#xff0…

【贪心算法】day10

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录&#xff0c;按专题划分每题主要记录&#xff1a;&#xff08;1&#xff09;本人解法 本人屎山代码&#xff1b;&#xff08;2&#xff09;优质解法 优质代码&#xff1b;&#xff…

LeetCode算法日记 - Day 42: 岛屿数量、岛屿的最大面积

目录 1. 岛屿数量 1.1 题目解析 1.2 解法 1.3 代码实现 2. 岛屿的最大面积 2.1 题目解析 2.2 解法 2.3 代码实现 1. 岛屿数量 https://leetcode.cn/problems/number-of-islands/ 给你一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的的二维…

短波红外相机在机器视觉检测方向的应用

短波红外相机在机器视觉检测方向的应用短波红外相机&#xff1a;机器视觉的“低成本突破者”一、打破成本困局&#xff1a;短波红外的“平民化”革新二、核心技术&#xff1a;有机材料的“硬核创新”1. 材料革命&#xff1a;有机感光层的优势2. 工艺兼容&#xff1a;嫁接成熟CM…

【数据结构与算法】图 Floyd算法

相关题目&#xff1a; 1334. 阈值距离内邻居最少的城市 - 力扣&#xff08;LeetCode&#xff09; 资料 &#xff1a; Floyd算法原理及公式推导 - 知乎 Floyd 算法是一种经典的动态规划算法&#xff0c;用与求解图中所有顶点之间的最短短路路径。它由Robert Floyd 于1962…

卫星通信天线的指向精度,含义、测量和计算

卫星通信天线的指向精度&#xff0c;含义、测量和计算我们在卫星通信天线的技术规格书中&#xff0c;都会看到天线指向精度这个指标。一般来说&#xff0c;技术规格书上的天线指向精度的参数是这么写的&#xff1a;“天线指向精度≤1/10半功率波束带宽”今天这个文章&#xff0…

基于LSTM与3秒级Tick数据的金融时间序列预测实现

数据加载模块解析 def load_data(filepath):df pd.read_csv(filepath)return df该函数承担基础数据采集职责&#xff0c;通过Pandas库读取CSV格式的高频交易数据&#xff08;典型如股票分笔成交明细&#xff09;。输入参数为文件路径字符串&#xff0c;输出结构化DataFrame对象…

C# --- Field and Property

C# --- Field and Property字段 (Field) vs. 属性 (Property)Property的声明初始化方法单例类property错误初始化导致线程泄漏字段 (Field) vs. 属性 (Property) 字段 (Field) - 数据的存储容器 字段是直接在类或结构中声明的变量。它是存储数据的地方&#xff0c;是对象状态的…

【Python】实现一个文件夹快照与比较工具

1. 工具简介 在日常开发、项目管理或备份场景中&#xff0c;我们经常需要知道某个文件夹中的文件是否发生变化&#xff0c;例如&#xff1a; 项目源码是否新增或修改文件&#xff1f;数据集是否被不小心删除或篡改&#xff1f;备份文件夹是否和上次一致&#xff1f; 本教程将教…

LINUX913 shell:set ip [lindex $argv 0],\r,send_user,spawn ssh root@ip “cat “

问题 获取公钥 [codesamba ~]$ cat pub.sh #!/bin/usr/expect set ip "$1" set password 123456 set timeout 20 spawn ssh root192.168.235.100:cat ~/.ssh/id_rsa.pub expect { "yes/no" {send "yes/r";exp_continue} "password:" {…

Acwing算法基础课--链表

一、单链表 AcWing 826. 单链表 代码 N 100010 idx 0 e [0] * N ne [0] * N head -1def init():global idx,headidx 0head -1def add_head(x):global idx,heade[idx] xne[idx] headhead idxidx 1def delete(k):ne[k] ne[ne[k]]def add_k(k,x):global idxe[idx] …

AI表征了西方的有界,AI+体现了东方的无界

AI表征了西方的有界&#xff0c;AI体现了东方的无界&#xff0c;试图通过文化差异的视角来对比传统AI&#xff08;AI&#xff09;与增强型或融合型AI&#xff08;AI&#xff09;的特征。一、“AI表征了西方的有界”西方的“有界”可以理解为&#xff1a;1、逻辑清晰、结构严谨&…

LabVIEW泵轮检测

​在现代制造业蓬勃发展的浪潮下&#xff0c;汽车行业也迎来了高速发展期。液力变矩器作为实现车辆自动变速的关键零件产品&#xff0c;在汽车动力系统中扮演着不可或缺的角色。泵轮作为液力变矩器的核心组成部分&#xff0c;其生产质量直接影响着液力变矩器的性能。因此&#…

RT-DETRv2 中的坐标回归机制深度解析:为什么用 `sigmoid(inv_sigmoid(ref) + delta)` 而不是除以图像尺寸?

引言&#xff1a;一个看似简单的公式&#xff0c;背后藏着工业级设计智慧 在阅读 RT-DETRv2&#xff08;Real-Time DETR v2&#xff09;源码时&#xff0c;我曾被一行代码深深震撼&#xff1a; inter_ref_bbox F.sigmoid(bbox_head[i](output) inverse_sigmoid(ref_points_de…

简单了解一下GraphRAG

传统RAG的缺点 当我们将一段文本信息以句子分割后&#xff0c;存入到向量数据库中。用户提问“老王喜欢吃什么”&#xff0c;这个问题会与向量数据库中的许多句子关联性比较强&#xff0c;能返回准确且具体的信息。 但是&#xff0c;若是问题换成“出现了几次西瓜”&#xff0c…