网站制作 东莞/如何提高网站在搜索引擎中的排名

网站制作 东莞,如何提高网站在搜索引擎中的排名,网站页面跳转怎么做,wordpress移动端导航栏文章目录 🌍一. 数据交换--JSON❄️1. JSON介绍❄️2. JSON 快速入门❄️3. JSON 对象和字符串对象转换❄️4. JSON 在 java 中使用❄️5. 代码演示 🌍二. 异步请求--Ajax❄️1. 基本介绍❄️2. JavaScript 原生 Ajax 请求❄️3. JQuery 的 Ajax 请求 &a…

在这里插入图片描述

文章目录

    • 🌍一. 数据交换--JSON
      • ❄️1. JSON介绍
      • ❄️2. JSON 快速入门
      • ❄️3. JSON 对象和字符串对象转换
      • ❄️4. JSON 在 java 中使用
      • ❄️5. 代码演示
    • 🌍二. 异步请求--Ajax
      • ❄️1. 基本介绍
      • ❄️2. JavaScript 原生 Ajax 请求
      • ❄️3. JQuery 的 Ajax 请求
    • 🌍三. 线程数据共享和安全 -ThreadLocal
      • ❄️1. ThreadLocal基本介绍
      • ❄️2. 源码分析


🙋‍♂️ 作者:@whisperrr.🙋‍♂️

👀 专栏:JavaWeb👀

💥 标题:【JavaWeb12】数据交换与异步请求:JSON与Ajax的绝妙搭配是否塑造了Web的交互革命?💥

❣️ 寄语:比较是偷走幸福的小偷❣️

前言:
数据交换和异步请求技术在Web开发中扮演着举足轻重的角色。JSON和Ajax作为这两大技术的代表,已经成为了前端工程师必备的技能。本文将带您深入了解JSON与Ajax的原理、应用场景和细节说明,助您在Web开发领域更进一步。

🌍一. 数据交换–JSON

❄️1. JSON介绍

1.JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation)
2.JSON 是轻量级的文本数据交换格式
3.JSON 独立于语言 [解读:即 java 、php、asp.net , go 等都可以使用 JSON]
4.JSON 具有自我描述性,更易理解, 一句话,非常的好用…
在这里插入图片描述

❄️2. JSON 快速入门

1.JSON 的定义格式

var 变量名 = { "k1" : value, // Number 类型"k2" : "value", // 字符串类型"k3" : [],// 数组类型"k4" : {}, // json 对象类型"k5" : [{},{}] // json 数组};

2.解读 JSON 规则

  1. 映射(元素/属性)用冒号 : 表示,“名称”:值 , 注意名称是字符串,因此要用双引号引起来
  2. 并列的数据之间用逗号 , 分隔。“名称 1”:值,“名称 2”:值
  3. 映射的集合(对象)用大括号 {} 表示。{“名称 1”:值,“名称 2”:值}
  4. 并列数据的集合(数组)用方括号 [] 表示。 [{“名称 1”:值,“名称 2”:值}, {“名称 1”:值," 名称 2":值}]
  5. 元素值类型:string, number, object, array, true, false, null

3.JSON 快速入门案例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>json 快速入门案例</title>
<script type="text/javascript">
var myJson = { "key1": "教育", // 字符串"key2": 123, // Number "key3": [1, "hello", 2.3], // 数组"key4": {"age": 12, "name": "jack"}, //json 对象"key5": [ //json 数组{"k1": 10, "k2": "milan"}, {"k3": 30, "k4": "smith"}]
};
//访问 json 的属性
console.log("key1= " + myJson.key1);
// 访问 json 的数组属性
console.log("key3[1]= " + myJson.key3[1]); // hello
// 访问 key4 的 name 属性
console.log("name= " + myJson.key4.name); // jack
// 访问 key5 json 数组的第一个元素
console.log("myJson.key5[0]= " + myJson.key5[0]); //[object, object]
console.log("myJson.key5[0].k2= " + myJson.key5[0].k2)// milan
</script>
</head>
<body>
<h1>json 快速入门案例</h1>
</body>
</html>

❄️3. JSON 对象和字符串对象转换

1.应用案例

  1. JSON.stringify(json)功能: 将一个 json 对象转换成为 json 字符串 [简单说名字来源.]Serialize
  2. JSON.parse( jsonString )功能: 将一个 json 字符串转换成为 json 对象

代码演示:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>JSON 对象和字符串对象转换</title>
<script type="text/javascript">
// 一个 json 对象
var jsonObj = {"name": "韩顺平教育", age: 10};
//JSON 是一个 build-in 对象,内建对象,有方法可以使用
console.log(JSON)
// 把 json 对象转换成为字符串对象
var jsonStr = JSON.stringify(jsonObj);
console.log(jsonStr);
// 把 json 对象的字符串,转换成为 json 对象
var jsonObj2 = JSON.parse(jsonStr);
console.log(jsonObj2);
</script>
</head>
<body>
<h1>JSON 对象和字符串对象转换</h1>
</body>
</html>

2.注意事项和细节

1.JSON.springify(json 对 象) 会 返 回对 应 string, 并 不 会影 响 原 来 json 对 象.
2.JSON.parse(string) 函数会返回对应的 json 对象, 并不会影响原来 string.
3.在定义 Json 对象时, 可以使用 ' ' 表示字符串.
比如 var json_person = {"name": "jack", "age": 100};
也可以写成 var json_person = {'name': 'jack', 'age': 100};
4.但是在把原生字符串转成 json 对象时, 必须使用 "", 否则会报错
比如:var str_dog = "{'name':'小黄狗', 'age': 4}"; 转 json 就会报错.
5.JSON.springify(json 对象) 返回的字符串, 都是 “” 表示的字符串, 所以在语法格式正确的情况下, 是可以重新转成 json 对象的.

❄️4. JSON 在 java 中使用

1.说明

  1. java 中使用 json,需要引入到第 3 方的包 gson.jar
  2. Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
  3. 可以对 JSON 字符串 和 Java 对象相互转换

2.JSON 在 Java 中应用场景

  1. Javabean 对象和 json 字符串 的转换
  2. List 对象和 json 字符串 的转换
  3. map 对象和 json 字符串 的转换

3.应用场景示意图
在这里插入图片描述

❄️5. 代码演示

1.代码演示:演示javabean 和 json字符串的转换

//创建一个gson对象,做完一个工具对象使用Gson gson = new Gson();//演示javabean 和 json字符串的转换Book book = new Book(100, "零基础学Java");//1. 演示把javebean -> json字符串String strBook = gson.toJson(book);System.out.println("strBook=" + strBook);//2. json字符串->javabeanBook book2 = gson.fromJson(strBook, Book.class);System.out.println("book2=" + book2);

解读
(1) strBook 就是 json字符串
(2) Book.class 指定将 json字符串转成 Book对象
(3) 底层是反射机制

2.代码演示:演示把list对象 -> json字符串

        //1. 演示把list对象 -> json字符串List<Book> bookList = new ArrayList<>();bookList.add(new Book(200, "天龙八部"));bookList.add(new Book(300, "三国演义"));//因为把对象,集合转成字符串, 相对比较简单//底层只需要遍历, 按照json格式拼接返回即可String strBookList = gson.toJson(bookList);System.out.println("strBookList= " + strBookList);

因为把对象,集合转成字符串, 相对比较简单
底层只需要遍历, 按照json格式拼接返回即可

3.代码演示:演示把json字符串 -> list对象
(1) 如果需要把json字符串 转成 集合这样复杂的类型, 需要使用gson提供的一个类
(2) TypeToken , 是一个自定义泛型类, 然后通过TypeToken来指定我们需要转换成的类型

  Type type = new TypeToken<List<Book>>() {}.getType();List<Book> bookList2 = gson.fromJson(strBookList, type);System.out.println("bookList2= " + bookList2);

(1) 返回类型的完整路径java.util.List<com.hspedu.json.Book>
(2) gson的设计者,需要得到类型的完整路径,然后进行底层反射
(3) 所以gson 设计者就提供TypeToken, 来搞定.

== 使用TypeToken , 为什么要加 {}==
首先我们看一下TypeToken的源码

 com.google.gson.reflectpublic class TypeToken<T> {final Class<? super T> rawType;final Type type;final int hashCode;protected TypeToken() {this.type = getSuperclassTypeParameter(this.getClass());this.rawType = Types.getRawType(this.type);this.hashCode = this.type.hashCode();}

(1) 如果我们 new TypeToken<List<Book>>()
错误提示 'TypeToken()' has protected access in 'com.google.gson.reflect.TypeToken'
(2) 因为TypeToken 的无参构造器是protected , 而new TypeToken<List<Book>>()就是调用其无参构造器
(3) 根据java基础, 如果一个方法是protected ,而且不在同一个包,是不能直接访问的, 因此报错
(4) 为什么new TypeToken<List<Book>>(){}使用就可以,这里就涉及到匿名内部类的知识.
(5) 当 new TypeToken<List<Book>>(){} 其实这个类型就是不是 TypeToken 而是一个匿名内部类(子类),继承
(6) 而且这个匿名内部类是有自己的无参构造器(隐式), 根据java基础规则 当执行子类的无参构造器时, 默认super();

4.代码演示:演示把mapt对象 -> json字符串(与list基本一致)

        //把map对象->json字符串Map<String, Book> bookMap = new HashMap<>();bookMap.put("k1", new Book(400, "射雕英雄传"));bookMap.put("k2", new Book(500, "西游记"));String strBookMap = gson.toJson(bookMap);System.out.println("strBookMap=" + strBookMap);// 把json字符串 -> map对象// new TypeToken<Map<String, Book>>() {}.getType()=> java.util.Map<java....String,com.hspedu.json.Book>Map<String, Book> bookMap2 = gson.fromJson(strBookMap,new TypeToken<Map<String, Book>>() {}.getType());

🌍二. 异步请求–Ajax

❄️1. 基本介绍

1.Ajax 是什么

  1. AJAX 即"Asynchronous Javascript And XML"(异步 JavaScript 和 XML)
  2. Ajax 是一种浏览器异步发起请求(指定发哪些数据),局部更新页面的技术
    Ajax 经典应用场景
  3. 搜索引擎根据用户输入关键字,自动提示检索关键字
  4. 动态加载数据,按需取得数据【树形菜单、联动菜单…】
  5. 改善用户体验。【输入内容前提示、带进度条文件上传…】
  6. 电子商务应用。 【购物车、邮件订阅…】
  7. 访问第三方服务。【访问搜索服务、rss 阅读器】
  8. 页面局部刷新

2.Ajax 原理示意图

在这里插入图片描述

❄️2. JavaScript 原生 Ajax 请求

1 Ajax 文档
首先给大家推荐一下Ajax的在线文档
https://www.w3school.com.cn/js/js_ajax_intro.asp

2.通过下面的问题来引出Ajax

点击验证用户名, 使用 ajax 方式, 服务端验证该用户名是否已经占用了, 如果该用户已经占用, 以 json 格式返回该用户信息

    <script type="text/javascript">window.onload = function () { //页面加载后执行functionvar checkButton = document.getElementById("checkButton");//给checkButton绑定onclickcheckButton.onclick = function () {//1. 创建XMLHttpRequest对象(!!!) [ajax引擎对象]var xhr = new XMLHttpRequest();//   获取用户填写的用户名var uname = document.getElementById("uname").value;//2. 准备发送指定数据 open, send            //(1)"GET" 请求方式可以 GET/POST//(2)"/ajax/checkUserServlet?username=" + uname 就是 url//(3)true , 表示异步发送xhr.open("GET", "/ajax/checkUserServlet?uname=" + uname, true);//在send函数调用前,给XMLHttpRequest 绑定一个事件onreadystatechange//该事件表示,可以去指定一个函数,当数据变化,会触发onreadystatechange// 每当 xhr对象readyState 改变时,就会触发 onreadystatechange 事件xhr.onreadystatechange = function () {//如果请求已完成,且响应已就绪, 并且状态码是200if (xhr.readyState == 4 && xhr.status == 200) {//把返回的jon数据,显示在divdocument.getElementById("div1").innerHTML = xhr.responseText;//console.log("xhr=", xhr)var responseText = xhr.responseText;//console.log("返回的信息=" + responseText);      //3. 真正的发送ajax请求[http请求]// 老韩再说明如果你POST 请求,再send("发送的数据")xhr.send();}}</script>

3 原生 Ajax 请求问题分析

  1. 编写原生的 Ajax 要写很多的代码,还要考虑浏览器兼容问题,使用不方便。
  2. 在实际工作中,一般使用 JavaScript 的库(比如 Jquery) 发送 Ajax 请求,从而解决这个问题

❄️3. JQuery 的 Ajax 请求

JQuery Ajax 操作方法
1.在线文档:
https://www.w3school.com.cn/jquery/jquery_ajax_get_post.asp

在这里插入图片描述
2.$.ajax 方法

  1. $.ajax 常用参数
    url: 请求的地址
    type : 请求的方式 get 或 post
    data :发送到服务器的数据。将自动转换为请求字符串格式
    success: 成功的回调函数
    error: 失败后的回调函数
    dataType: 返回的数据类型 常用 json 或 text
  2. 说明:完整的参数参看手册

3.$.get 请求和$.post 请求

  1. $.get$.post 常用参数
    url: 请求的 URL 地址
    data: 请求发送到服务器的数据
    success: 成功时回调函数
    type: 返回内容格式,xml, html, script, json, text
  2. 说明:$.get $.post 底层还是使用$.ajax()方法来实现异步请求

4.$.getJSON

  1. $.getJSON 常用参数
    url: 请求发送的哪个 URL
    data: 请求发送到服务器的数据
    success: 请求成功时运行的函数
  2. 说明:$.getJSON 底层使用$.ajax()方法来实现异步请求

🌍三. 线程数据共享和安全 -ThreadLocal

❄️1. ThreadLocal基本介绍

1.什么是 ThreadLocal

  1. ThreadLocal 的作用,可以实现在同一个线程数据共享, 从而解决多线程数据安全问题.
  2. ThreadLocal 可以给当前线程关联一个数据(普通变量、对象、数组)set 方法 [源码!]
  3. ThreadLocal 可以像 Map 一样存取数据,key 为当前线程, get 方法
  4. 每一个 ThreadLocal 对象,只能为当前线程关联一个数据,如果要为当前线程关联多个数据,就需要使用多个 ThreadLocal 对象实例
  5. 每个 ThreadLocal 对象实例定义的时候,一般为 static 类型
  6. ThreadLocal 中保存数据,在线程销毁后,会自动释放
  7. 类图
    在这里插入图片描述

ThreadLocal<Object> threadLocal = new ThreadLocal<>();
threadLocal.set(dog);

如果希望在同一个线程共享多个对象/数据,就在创建一个 ThreadLocal 对象
//threadLocal2.set(pig);

❄️2. 源码分析

1.set 源码分析 只要明白这个机制,后面的 set get 全部通透

public void set(T value) {//获取当前线程
Thread t = Thread.currentThread();
//获取当前线程的 ThreadLocal.ThreadLocalMap 属性 threadLocals , 类型是 ThreadLocal 的静态内部类
//threadLocals 有 一 个 属 性 Entry[], 类 型
ThreadLocal.ThreadLocalMap.Entry//k-> ThreadLocal 对象 v-> 值
ThreadLocalMap map = getMap(t);if (map != null)
map.set(this, value);//存放这里的 this 就是 ThreadLocal, 可以debug 源码,一目了然
else
createMap(t, value);//创建}

说明:
1.ThreadLocalMap 对象是和当前 Thread 对象的绑定的属性
2.ThreadLocalMap 对象含有 Entry[] table; 这个 Entry(K,V)
3.这个 key 就是 ThreadLocal 对象, V 就是你要在放入的对象,比如 dog
4.当执行了 了 threadLocal.set(dog) 后,内存布局图为 [看图]
在这里插入图片描述

2.Debug 源码图,非常重要

在这里插入图片描述
在这里插入图片描述
这里涉及到的弱引用,涉及到知识点很多,暂不深入.

结尾:
随着对JSON与Ajax技术的深入探讨,我们不仅揭开了数据交换与异步请求的神秘面纱,也领略了它们在现代Web开发中的巨大作用。这两者的结合,不仅提高了数据处理的效率,也优化了用户的交互体验。

希望通过本文,你能更加熟练地运用JSON与Ajax,为构建更加出色的Web应用贡献力量。让我们一起在技术的道路上,不断前行,共创辉煌。

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

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

相关文章

前端杂的学习笔记

什么是nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 Nginx是一款轻量级的Web 服务器/反向代理服务器&#xff0c;处理高并发能力是十分强大的&#xff0c;并且支持热部署&#xff0c;启动简单&#xff0c;可以做到7*24不间断运行 正代和反代 学习nginx&a…

玩转ChatGPT:GPT 深入研究功能

一、写在前面 民间总结&#xff1a; 理科看Claude 3.7 Sonnet 文科看DeepSeek-R1 那么&#xff0c;ChatGPT呢&#xff1f; 看Deep Research&#xff08;深入研究&#xff09;功能。 对于科研狗来说&#xff0c;在这个文章爆炸的时代&#xff0c;如何利用AI准确、高效地收…

RabbitMQ 2025/3/5

高性能异步通信组件。 同步调用 以支付为例&#xff1a; 可见容易发生雪崩。 异步调用 以支付为例&#xff1a; 支付服务当甩手掌柜了&#xff0c;不管后面的几个服务的结果。只管库库发&#xff0c;后面那几个服务想取的时候就取&#xff0c;因为消息代理里可以一直装&#x…

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下

Hadoop、Hive、Spark的关系

Part1&#xff1a;Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架&#xff0c;一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程&#xff0c;map将一个任务分成多个小任务&#xff0c;reduce的部分将结果汇总之后返回。 3、HIv…

[密码学实战]Java实现国密TLSv1.3单向认证

一、代码运行结果 1.1 运行环境 1.2 运行结果 1.3 项目架构 二、TLS 协议基础与国密背景 2.1 TLS 协议的核心作用 TLS(Transport Layer Security) 是保障网络通信安全的加密协议,位于 TCP/IP 协议栈的应用层和传输层之间,提供: • 数据机密性:通过对称加密算法(如 AE…

09 HarmonyOS NEXT 仿uv-ui Tag组件开发教程系列(三)

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; 文章目录 Tag组件实战应用与最佳实践1. 复杂场景应用1.1 标签筛选系统 2. 性能优化实践2.1 状态管理优化2.2 渲染性能优化 3. 实用功能扩展3.1 拖拽…

clickhouse查询效率低

《关于ClickHouse查询效率低的探讨》 在数据处理的世界里&#xff0c;数据库扮演着至关重要的角色。ClickHouse是一款专为在线分析处理&#xff08;OLAP&#xff09;设计的列式存储数据库管理系统。它因其快速的数据写入和查询速度而闻名&#xff0c;尤其适合处理海量数据。如…

Linux系统基于ARM平台的LVGL移植

软硬件介绍&#xff1a;Ubuntu 20.04 ARM 和&#xff08;Cortex-A53架构&#xff09;开发板 基本原理 LVGL图形库是支持使用Linux系统的Framebuffer帧缓冲设备实现的&#xff0c;如果想要实现在ARM开发板上运行LVGL图形库&#xff0c;那么就需要把LVGL图形库提供的关于帧缓冲设…

旋转编码器原理与应用详解:从结构到实战 | 零基础入门STM32第四十七步

主题内容教学目的/扩展视频旋转编码器电路原理&#xff0c;跳线设置&#xff0c;结构分析。驱动程序与调用。熟悉电路和驱动程序。 师从洋桃电子&#xff0c;杜洋老师 &#x1f4d1;文章目录 一、旋转编码器是什么&#xff1f;二、内部结构揭秘2.1 机械组件解剖2.2 核心部件说明…

aws(学习笔记第三十二课) 深入使用cdk(API Gateway + event bridge)

文章目录 aws(学习笔记第三十二课) 深入使用cdk学习内容&#xff1a;1. 使用aws API Gatewaylambda1.1. 以前的练习1.2. 使用cdk创建API Gateway lambda1.3. 确认cdk创建API Gateway lambda 2. 使用event bridge练习producer和consumer2.1. 代码链接2.2. 开始练习2.3. 代码部…

城市霓虹灯夜景拍照后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 在城市霓虹灯夜景拍摄中&#xff0c;由于现场光线复杂等因素&#xff0c;照片可能无法完全呈现出当时的视觉感受。通过 Lr 调色&#xff0c;可以弥补拍摄时的不足。例如&#xff0c;运用基本调整面板中的曝光、对比度、阴影等工具&#xff0c;可以处理出画面的整体明暗…

自然语言处理:文本分类

介绍 大家好&#xff0c;我这个热衷于分享知识的博主又来啦&#xff01;之前我们一起深入探讨了自然语言处理领域中非常重要的两个方法&#xff1a;朴素贝叶斯和逻辑斯谛回归。在探索的过程中&#xff0c;我们剖析了朴素贝叶斯如何基于概率原理和特征条件独立假设&#xff0c;…

K8S高可用集群-小白学习之二进制部署(ansible+shell)

一.K8S高可用集群配置概述 序言:本文从一个小白的视角进行K8S的研究和部署,采用二进制的方式是为了更清楚了分解部署流程及了解这个集群是怎么运作的,加上ansible+shell是方便在这个过程中,遇到了问题,我们可以不断的快速重复部署来测试和研究问题的所在点,本文的架构图…

【编译器】VSCODE搭建ESP32-C3

【编译器】VSCODE搭建ESP32-C3 文章目录 [TOC](文章目录) 前言一、下载配置二、编译三、烧录四、参考资料总结 前言 使用工具&#xff1a; 1. 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、下载配置 安装IDF&#xff0c;打开例程 二、编译 三…

通义千问本地配置并实现微调

通义千问本地配置并实现微调 最小Qwen模型大小942mb from modelscope import snapshot_download model_dir = snapshot_download(“qwen/Qwen2.5-0.5B”, cache_dir=“./models2.5”) Qwen2.5-0.5B:942MB from modelscope import snapshot_download model_dir = snapshot_d…

Magento2根据图片文件包导入产品图片

图片包给的图片文件是子产品的图片&#xff0c;如下图&#xff1a;A104255是主产品的sku <?php/*** 根据图片包导入产品图片&#xff0c;包含子产品和主产品* 子产品是作为主图&#xff0c;主产品是作为附加图片*/use Magento\Framework\App\Bootstrap;include(../app/boot…

考研408

是否需要考研&#xff1f; 考研前期准备 目标院校 每年9月10月才会公布 考试时长3小时 数据结构 1.时间复杂度选择题计算 2.顺序表链表特点;指针、结构体语法&#xff0c;链表结点定义&#xff0c;链表头结点与头指针,常见的五种链 表&#xff0c;链表的插入删除操作;顺…

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…

CSS—网格布局Grid

网格布局grid 提供了带有行和列的基于网格的布局系统&#xff0c;无需使用浮动和定位。 当 HTML 元素的 display 属性设置为 grid 或 inline-grid 时&#xff0c;它就会成为网格容器。 更多布局模式可以参考之前的博客&#xff1a; ​​​​​​CSS—flex布局、过渡transit…