jQuery入门学习

news2024/11/27 14:49:45

jQuery框架

jQuery是一个快速的、简洁的JavaScript框架(库),它会封装很多JavaScript中常用的功能代码,提供了一个简洁的JS设计模式

  • 优化HTML文档操作(优化DOM操作)
  • 事件处理
  • 动画设计
  • Ajax

要使用JQ我们需要引入对应的库文件做支持

<script src="js/jquery-3.5.1.min.js"></script>

下载jQuery库文件:

**jQuery官网:**https://jquery.com/

jQuery3.5.1链接:https://pan.baidu.com/s/1OtZlCek-1t3ZKgfoPiwuAw?pwd=6666 提取码:6666

jQuery基础语法

由三个部分组成

1、启动符:$ ,如果该符号在语言中已经作为关键字或者预留字使用,可以替换成 jQuery

2、选择器【用来选择需要操作的JQ元素】

3、方法【对元素进行操作】

jQuery选择器

$("h1")   //document.querySelectorAll()
$(".tit")

jQuery事件

jQuery事件是把DOM当中常用的事件进行了一个封装,成了一个方法来调用

$(".tit").click(function(){
    //回调函数就是当你的事件触发的时候要执行的事情
})
鼠标事件键盘事件表单事件文档/窗口事件
clickkeypresssubmitload
dblclickkeydownchangeresize
mouseenterkeyupfocusscroll
mouseleaveblurunload
hover

对于不常用的事件,jQ提供了一个on方法来实现绑定

$("#btn").on("click",function(){
    console.log("呵呵呵呵")
})

jQuery事件委托

jQuery事件委托通过on方法实现

<ul class="ul1">
    <li>1</li>
    <li class="active">2</li>
    <li>3</li>
    <li>4</li>
    <li>5</li>
</ul>
<script>
    $(".ul1").on("click","li.active",function(){
        console.log(new Date());
    })
</script>

jQuery事件移除

jQuery使用off方法

$("css选择器").off("事件类型",函数名)
//如果没有写函数名,就移除所有

jQuery单次事件

//原生写法
document.querySelector("#btn").addEventListener("click",function(){
	console.log("我被点了");
	document.querySelector("#btn").removeEventListener("click",arguments.callee)
})

//jQ写法
$("#btn").one("click",function(){
	console.log("我被点了")
})

jQuery动画方法

1、show() / hide() / toggle() 执行元素的显示隐藏

注意:toggle方法有版本兼容的问题,如果要使用toggle简易采用1.7.2一下的版本

2、slideUp() / slideDown() / slideToggle() 元素执行上下滑动

3、fadeIn() / fadeOut() / fadeTo(speed,opacity) / fadeToggle() 渐隐渐显

4、animate() 自定义动画方法

$(".switch").click(function(){
    $(".box").animate({
        "width":"500px",
        "height":"500px"
    },2000,function(){
        console.log("我完了")
    })
})

jQuery css方法

1、addClass() 在选中的元素上添加一个类

2、removeClass() 在选中的元素上删除一个类

3、toggleClass() 在选中的元素上替换一个类

4、css() 这个方法可以在获取的元素中任意添加或者获取样式

获取样式
var a = $(".box").css("width");
设置样式

$(".box").hover(function(){
    $(this).css({
        width:"500px",
        height:"500px"
    })
},function(){
    $(this).css({
        width:"300px",
        height:"300px"
    })
})

jQuery属性方法

1、html() 等价原生DOM中的innerHTML属性

$(".box").html("<h1>哈哈</h1>")  //传参表示赋值
$(".box").html()   //取值

2、text() 等价原生DOM中的innerText属性

3、val() 对表单的value属性进行操作

以上三个传参就是赋值,不传参就是取值

4、attr() 操作标签属性

$("input").attr("type");
$("input").attr("type","password")   //注意低版本无法设置type属性

5、removeAttr() 移除一个属性

6、prop() 对标签的单属性进行操作

$("input").prop("checked",false)

jQuery的尺寸方法

1、width() / height() 获取盒子的content大小

2、innerWidth() / innerHeight() 获取盒子的content+padding的大小

3、outerWidth() / outerHeight()获取盒子的content+padding+border的大小

5、outerWidth(true) / outerHeight(true)获取盒子的content+padding+border+margin的大小

文档就绪函数

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/jquery-3.5.1.min.js"></script>
		<script>
			$("#btn").click(function(){
				console.log("haha")
			})
		</script>
	</head>
	<body>
		<button id="btn">按钮</button>
	</body>
</html>

代码分析:

上面的代码当中,按钮是不会有事件触发的,因为它是先绑定的事件,再加载的DOM元素,再绑定事件的时候DOM元素还没有加载出来

在原生JS中window中有一个事件onload,它代表所有元素已经加载完毕才会触发,所以我们可以使用这个事件

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<script src="js/jquery-3.5.1.min.js"></script>
		<script>
			window.onload = function(){
				$("#btn").click(function(){
					console.log("haha")
				})
			}
		</script>
	</head>
	<body>
		<button id="btn">按钮</button>
	</body>
</html>

代码分析:

这些写其实不太好,因为它是将所有的元素加载完毕之后才会触发,如果一个页面上所有的元素已经加载好了,但是任然有一些大图片或者一些其他外部资源没有加载好,这个时候onload是不会触发的,这个从用户体验角度来讲不太好

优化一下

document.addEventListener("DOMContentLoaded",function(){
    $("#btn").click(function(){
        console.log("haha")
    })
})

代码分析:

上面的写法就更优化了,把对象改成document,通过触发事件DOMContentLoaded 从而不需要等待DOM以外的东西加载好就可以触发

而上面这套写法,在JQ当中有一个专门函数叫做文档就绪函数

$(document).ready(function(){
    $("#btn").click(function(){
        console.log("haha")
    })
})

进一步简化

$(function(){
    $("#btn").click(function(){
        console.log("haha")
    })
})

Ajax方法

我们自己封装过一套ajax请求,JQ也有自己封装的

$.ajax({
	async:true,               //是否异步,默认false
	type:"get",               //请求方法,默认是get
	url:"",                   //请求地址
	dataType:"json",          //返回的数据类型,如果是json则自动反序列化
	success:function(data){   
		//请求成功时,执行的回调,data相当于xhr对象中的response
	},
	error:function(err){
		//请求失败时执行的回调,err错误信息
	}
}) 

简化了一下

$.get(url,function(data){

})

jQuery实战小功能:

常见的广告,点击即消失:

广告一般采用的时固定定位,会随着滑动,一起滑动。

<div class="rightBottom">
    <h2>广告位招租 <a onclick="del()">X</a></h2>
</div>
.rightBottom{
    height: 350px;
    width: 150px;
    position: fixed;
    background-color: red;
    right: 0;
}
.rightBottom a{
    position: fixed;
    top: 210px;
    right: 5px;
    font-size: large;
    height: 50px;
}
.rightBottom h2{
    text-align: center;
    line-height: 350px;
}

我们用jQuery实现点击消失,

//删除广告
function del() {
    $(".rightBottom").hide()
}

我们这里用$ 获取到广告所在的元素,当点击X时,触发hide()隐藏方法。

GIF 2023-10-2 12-42-49

鼠标悬停出现下拉图片:

事先准备好要下拉出现的图片:

<div class="table">
    <div class="avatar">
        移到我这里
    </div>
    <div class="avatar1">
        <img src="./img/22091QFQGN6-0-lp.jpg">
    </div>
</div>
.table{
    width: 300px;
    height: 600px;
    background-color: #c833a0;
}
.avatar{
    width: 100px;
    height: 50px;
    margin: auto;
    background-color: blue;
}
.avatar1 img{
    width: 100px;
    height: 200px;
    margin-left: 100px;
    /*先将图片隐藏*/
    display: none;
}

这里我们使用jQuery的mouseenter(鼠标移入) mouserout(鼠标移除) slideDown(下滑),slideUp(上滑)。

//向下弹出信息
$(".avatar").mouseenter(function () {
    $(".avatar1 img").slideDown().css("display", "block");
})
//向上弹回信息
$(".avatar").mouseout(function () {
    $(".avatar1 img").slideUp();
})

当我们将鼠标移入就会显示出图片:

GIF 2023-10-2 12-39-51

选项卡:

<div class="container clearfix">
<div class="left fixLeft">
    <!-- 默认选中第一个标签 -->
    <div class="creative content">选项一</div>
    <div class="content content2">选项二</div>
    <div class="content">选项三</div>
</div>
<div class="right clearfix">
    <div class="imgContent fixRight">
        <!-- 默认选中第一张图 -->
        <img src="./img/5ad84013361bd.jpg" alt="" class="show">
        <img src="./img/5ad840133c288.jpg" alt="">
        <img src="./img/5b5f2f313af2b.jpg" alt="">
    </div>
</div>
</div>
* {
    margin: 0;
    padding: 0;
}

a {
    color: #000;
    text-decoration: none;
}

ul {
    list-style: none;
}

.fixLeft {
    float: left;
}

.fixRight {
    float: left;
}

.clearfix:after {
    content: '';
    display: block;
    clear: both;
}
.container {
    width: 1200px;
    margin: 0 auto;
    background-color: #ccc;
    height: 320px;
    margin-top: 50px;
    border: #000 solid 1px;
}
.left .content{
    width: 150px;
    height: 100px;
    background-color: rgb(198, 220, 156);
    line-height: 100px;
    text-align: center;
}
.content2{
    margin: 10px 0;
}
img{
    width: 1050px;
    height: 320px;
    display: none;
}
body{
    background-color: #ccc;
}

/* 展示下一张图片 */
.show{
    display: block;
}
/* 显示下一个选项 */
.creative{
    color: white;
}

我们先用$获取到所有左侧导航数组,通过遍历,当我们鼠标移动到某个导航时,就获取到当前的索引值,再将所有的导航目录的样式全部变为一般样式,当鼠标悬停到某个导航时,再添加creative高亮样式,图也是同理,每一个导航都对应着一张图片,通过if判断筛选出符合的图片,再将所有的图片的样式全部none,并且在选中的图片加上显示show样式。

$(".content").each(function () {
    $(this).mouseover(function () {
        var index = $(this).index();
        $(".content").removeClass("creative").css("background-color", "rgb(198, 220, 156)");
        $(this).addClass("creative").css("background-color", "skyblue");
        $(".imgContent img").each(function () {
            if ($(this).index() == index) {
                $(".imgContent img").removeClass("show");
                $(this).addClass("show");
            }
        })
    })
})

GIF 2023-10-2 12-45-56

加强版: 当我们不去指向导航时,也让图片和菜单自动选中更替,这里我们就要用到setTimeout()定时,总共3张图片,我们就让他们隔一段时间,出现0 1 2(注意:数组索引是从0开始的)即可。我们再通过0,1,2找到对应的图片和导航,并赋予样式。

//定时轮播图
function add(i = -1) {
    if (i == 2) {
        i = 0;
        setTimeout("add(" + i + ")", 2000);
    } else {
        i++;
        setTimeout("add(" + i + ")", 2000);
    }
    console.log(i);
    var imgs = $(".imgContent img");
    var contents = $(".content");
    $(".imgContent img").removeClass("show");
    $(".content").removeClass("creative").css("background-color", "rgb(198, 220, 156)");
    imgs.eq(i).addClass("show");
    contents.eq(i).addClass("creative").css("background-color", "skyblue");
}
add();

GIF 2023-10-2 12-46-48

这时我们不去滑动也能实现图片自动播放。

源码:

HTML:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="../jQuery/day2.css">
    <script src="../jquery-3.5.1.min.js"></script>
</head>

<body>
    <div class="container clearfix">
        <div class="left fixLeft">
            <!-- 默认选中第一个标签 -->
            <div class="creative content">选项一</div>
            <div class="content content2">选项二</div>
            <div class="content">选项三</div>
        </div>
        <div class="right clearfix">
            <div class="imgContent fixRight">
                <!-- 默认选中第一张图 -->
                <img src="./img/5b7595e3e915e.jpg" alt="" class="show">
                <img src="./img/5ad840133c288.jpg" alt="">
                <img src="./img/5b5f2f313af2b.jpg" alt="">
            </div>
        </div>
    </div>
    <div class="rightBottom">
        <h2>广告位招租 <a onclick="del()">X</a></h2>
    </div>
    <div class="table">
        <div class="avatar">
            移到我这里
        </div>
        <div class="avatar1">
            <img src="./img/22091QFQGN6-0-lp.jpg">
        </div>
    </div>

    <script>
        $(".content").each(function () {
            $(this).mouseover(function () {
                var index = $(this).index();
                $(".content").removeClass("creative").css("background-color", "rgb(198, 220, 156)");
                $(this).addClass("creative").css("background-color", "skyblue");
                $(".imgContent img").each(function () {
                    if ($(this).index() == index) {
                        $(".imgContent img").removeClass("show");
                        $(this).addClass("show");
                    }
                })
            })
        })
        //删除广告
        function del() {
            $(".rightBottom").hide()
        }

        //向下弹出信息
        $(".avatar").mouseenter(function () {
            $(".avatar1 img").slideDown().css("display", "block");
        })
        //向上弹回信息
        $(".avatar").mouseout(function () {
            $(".avatar1 img").slideUp();
        })

        //定时轮播图
        function add(i = -1) {
            if (i == 2) {
                i = 0;
                setTimeout("add(" + i + ")", 2000);
            } else {
                i++;
                setTimeout("add(" + i + ")", 2000);
            }
            console.log(i);
            var imgs = $(".imgContent img");
            var contents = $(".content");
            $(".imgContent img").removeClass("show");
            $(".content").removeClass("creative").css("background-color", "rgb(198, 220, 156)");
            imgs.eq(i).addClass("show");
            contents.eq(i).addClass("creative").css("background-color", "skyblue");
        }
        add();
    </script>
</body>

</html>

CSS

* {
    margin: 0;
    padding: 0;
}

a {
    color: #000;
    text-decoration: none;
}

ul {
    list-style: none;
}

.fixLeft {
    float: left;
}

.fixRight {
    float: left;
}

.clearfix:after {
    content: '';
    display: block;
    clear: both;
}
.container {
    width: 1200px;
    margin: 0 auto;
    background-color: #ccc;
    height: 320px;
    margin-top: 50px;
    border: #000 solid 1px;
}
.left .content{
    width: 150px;
    height: 100px;
    background-color: rgb(198, 220, 156);
    line-height: 100px;
    text-align: center;
}
.content2{
    margin: 10px 0;
}
img{
    width: 1050px;
    height: 320px;
    display: none;
}
body{
    background-color: #ccc;
}

/* 展示下一张图片 */
.show{
    display: block;
}
/* 显示下一个选项 */
.creative{
    color: white;
}
.rightBottom{
    height: 350px;
    width: 150px;
    position: fixed;
    background-color: red;
    right: 0;
}
.table{
    width: 300px;
    height: 600px;
    background-color: #c833a0;
}
.rightBottom a{
    position: fixed;
    top: 210px;
    right: 5px;
    font-size: large;
    height: 50px;
}
.rightBottom h2{
    text-align: center;
    line-height: 350px;
}
.avatar{
    width: 100px;
    height: 50px;
    margin: auto;
    background-color: blue;
}
.avatar1 img{
    width: 100px;
    height: 200px;
    margin-left: 100px;
}
    height: 320px;
    display: none;
}
body{
    background-color: #ccc;
}

/* 展示下一张图片 */
.show{
    display: block;
}
/* 显示下一个选项 */
.creative{
    color: white;
}
.rightBottom{
    height: 350px;
    width: 150px;
    position: fixed;
    background-color: red;
    right: 0;
}
.table{
    width: 300px;
    height: 600px;
    background-color: #c833a0;
}
.rightBottom a{
    position: fixed;
    top: 210px;
    right: 5px;
    font-size: large;
    height: 50px;
}
.rightBottom h2{
    text-align: center;
    line-height: 350px;
}
.avatar{
    width: 100px;
    height: 50px;
    margin: auto;
    background-color: blue;
}
.avatar1 img{
    width: 100px;
    height: 200px;
    margin-left: 100px;
}

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

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

相关文章

MySQL进阶_3.性能分析工具的使用

文章目录 第一节、数据库服务器的优化步骤第二节、查看系统性能参数第三节、 慢查询日志第四节、 查看 SQL 执行成本第五节、 分析查询语句&#xff1a;EXPLAIN 第一节、数据库服务器的优化步骤 当我们遇到数据库调优问题的时候&#xff0c;可以按照以下流程进行分析。整个流程…

【Java每日一题】— —第十八题:求二维数组中的元素最小值及其索引。(2023.10.02)

&#x1f578;️Hollow&#xff0c;各位小伙伴&#xff0c;今天我们要做的是第十八题。 &#x1f3af;问题&#xff1a; 求二维数组中的元素最小值及其索引。 测试结果如下&#xff1a; &#x1f3af; 答案&#xff1a; int [][]anew int[3][];a[0]new int [3];a[1]new int[5…

【Leetcode】 17. 电话号码的字母组合

给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。 示例 1&#xff1a; 输入&#xff1a;digits "23" 输出&…

如何在 Wio Terminal 上运行 RT-Thread 操作系统

Wio Terminal 是 Seeed Studio 设计的一款开发套件。它基于 SAMD51 的微控制器&#xff0c;运行速度为 120MHz&#xff08;最高可达 200MHz&#xff09;&#xff0c;拥有 4MB 外部闪存和 192KB RAM&#xff0c;具有 Realtek RTL8720DN 支持的无线连接&#xff0c;同时支持蓝牙和…

京东数据报告:2023年8月京东手机行业品牌销售排行榜

鲸参谋监测的京东平台8月份手机市场销售数据已出炉&#xff01; 根据鲸参谋电商数据分析平台的数据显示&#xff0c;8月份&#xff0c;京东平台手机的销售量为380万&#xff0c;环比下滑约7%。同比下滑约17%&#xff1b;销售总额为120亿&#xff0c;环比下滑约17%&#xff0c;…

开启赏车新体验 远航汽车即将亮相2023中国(天津)国际汽车展览会

2023年9月28日至10月4日&#xff0c;2023中国&#xff08;天津&#xff09;国际汽车展览会将在国家会展中心&#xff08;天津&#xff09;举行。本次车展预计展出总面积20万平方米&#xff0c;是本年度北方地区规模最大、品牌最齐全的国际顶级车展。远航汽车将携旗下多款车型亮…

c#设计模式-结构型模式 之 装饰者模式

&#x1f680;介绍 在装饰者模式中&#xff0c;装饰者类通常对原始类的功能进行增强或减弱。这种模式是在不必改变原始类的情况下&#xff0c;动态地扩展一个对象的功能。这种类型的设计模式属于结构型模式&#xff0c;因为这种模式涉及到两个类型之间的关系&#xff0c;这两个…

Java编程技巧:分类

1、表结构 字段名称字段类型字段解释idvarchar主键idnamevarchar分类名称sequenceint同级排序parentvarchar父级分类id&#xff0c;一级分类的父级分类id为0pathvarchar分类id路径&#xff0c;中间用英文逗号,分隔&#xff0c;方便使用find_in_set函数搜索namePathvarchar分类…

90、Redis 的 value 所支持的数据类型(String、List、Set、Zset、Hash)---->Hash 相关命令

本次讲解要点&#xff1a; Hash 相关命令&#xff1a;是指value中的数据类型 启动redis服务器&#xff1a; 打开小黑窗&#xff1a; C:\Users\JH>e: E:>cd E:\install\Redis6.0\Redis-x64-6.0.14\bin E:\install\Redis6.0\Redis-x64-6.0.14\bin>redis-server.exe red…

Linux系统下C语言实现百度网盘(附实现步骤,和全部代码讲解)

Linux系统下C语言实现百度网盘 Linux操作系统下用C语言写一个网盘完整代码&#xff1a;服务器客户端 Linux操作系统下用C语言写一个网盘 本次实验完成了完整的网盘功能&#xff08;查询文件&#xff0c;下载文件&#xff0c;上传文件&#xff0c;刷新界面&#xff0c;和退出系…

服务器流量只有1tb,害怕被刷怎办,这篇文章教你防止对方刷流量!

本篇文章主要讲解&#xff0c;服务器流量监控和关闭网络请求的方法教程&#xff0c;在某种情况下可以有效杜绝被刷流量的困扰。 日期&#xff1a;2023年10月2日 作者&#xff1a;任聪聪 根本有效避免刷流的前置办法 说明&#xff1a;只选择固定带宽&#xff0c;不限流量的服务器…

【Linux进行时】进程地址空间

进程地址空间 例子引入&#xff1a; 我们在讲C语言的时候&#xff0c;老师给大家画过这样的空间布局图&#xff0c;但是我们对它不了解 我们写一个代码来验证Linux进程地址空间 #include<stdio.h> #include<assert.h> #include<unistd.h> int g_value100; …

【吞噬星空】连播两集,尼赫鲁对徐欣动手,罗峰修分身强势复仇

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析吞噬星空资讯。 吞噬星空动画第四季定档之后&#xff0c;官方真的是太宠粉了&#xff0c;每天都会公布全新预告情报&#xff0c;无论是外星人物角色&#xff0c;亦或者宇宙星球建模&#xff0c;那都是相当的炸裂。如今更…

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…

怒刷LeetCode的第22天(Java版)

目录 第一题 题目来源 题目内容 解决方法 方法一&#xff1a;回溯算法 方法二&#xff1a;基于位运算的回溯 第二题 题目来源 题目内容 解决方法 方法一&#xff1a;动态规划 方法二&#xff1a;分治法 方法三&#xff1a;前缀和数组 第三题 题目来源 题目内容…

通讯网关软件014——利用CommGate X2HTTP实现HTTP访问OPC Server

本文介绍利用CommGate X2HTTP实现HTTP访问OPC Server。CommGate X2HTTP是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;SCADA系统配置OPC Server&#xff0c;现在上位机需要通过Http Client…

Springboot+Vue+Mysql实现模拟汽车保养系统(附源码)

前言 本项目基于springbootvue搭建的汽车保养的系统&#xff0c;页面较为粗糙&#xff0c;前端好的小伙伴可自行优化。 项目环境 -环境框架后端JDK1.8SpringBootmybatisPlus前端NodeJS16.0Vue2.0ElementPlus数据库MySQL8.0- 数据库设计 数据表备注banner轮播图表car用户汽…

树的表示——孩子兄弟表示法

从图中可以看出&#xff0c;树的每个结点&#xff0c;都有不确定的指向他们的孩子的节点&#xff0c;如果我们定义这样一个结构体来便是数的结构的话&#xff1a; struct TreeNode { int val; struct TreeNodep1; struct TreeNodep1; … }; 是不能够表示一棵树的&#xff0c;因…

可视化 | (一)数据基础及基本数据可视化方法

​ 文章目录 &#x1f4da;数据可视化的基本流程&#x1f4da;数据属性&#x1f4da;基本可视化图表类型&#x1f407;数据分析三规则&#x1f407;条形图&#xff08;Bar Chart&#xff09;&#x1f407;饼图&#xff08;Pie Chart&#xff09;&#x1f407;衡量易变性 (meas…

计算机网络(一):概述

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 1. 计算机网络在信息时代的作用 计算机网络已由一种通信基础设施发展成为一种重要的信息服务基础设施计算机网络已经像水、电、煤气这些基础设施一样&#xff0c;成为我们生活中不可或…