使用gradio库的File模块实现文件上传和展示
博主原文链接:https://www.yourmetaverse.cn/nlp/378/

使用gradio库的File模块实现文件上传和展示
gradio是一个功能强大的Python库,用于构建交互式的机器学习和深度学习应用程序。其中的File模块提供了文件上传和展示的功能。本文将介绍gradio库的File模块以及其常用的四个方法:change、clear、upload和select。
File模块简介
File模块是gradio库中的一个组件,用于创建一个文件组件,允许用户上传通用文件(用作输入)或显示通用文件(用作输出)。
作为输入时,File模块将上传的文件作为tempfile._TemporaryFileWrapper或List[tempfile._TemporaryFileWrapper]传递给函数,具体取决于file_count参数的设置(或者是bytes/List[bytes],取决于type参数的设置)。
作为输出时,File模块期望函数返回一个文件的路径(str类型),或者返回一个包含文件路径的列表(List[str])。
示例代码
下面是一个使用File模块的示例代码,将上传的zip文件转换为JSON格式并进行展示。
from zipfile import ZipFileimport gradio as grdef zip_to_json(file_obj):files = []with ZipFile(file_obj.name) as zfile:for zinfo in zfile.infolist():files.append({"name": zinfo.filename,"file_size": zinfo.file_size,"compressed_size": zinfo.compress_size,})return filesdemo = gr.Interface(zip_to_json, "file", "json")if __name__ == "__main__":demo.launch()
该示例代码创建了一个接口,用户可以上传zip文件,然后将文件解析为JSON格式并显示在界面上。
常用方法介绍
1. change方法:
- 作用:当组件的值发生变化时触发,可以是用户输入导致的变化,也可以是函数更新导致的变化。
- 参数:
- fn: 包装在接口中的函数,通常是一个机器学习模型的预测函数。每个参数对应一个输入组件,函数应返回一个值或一个值的元组,元组中的每个元素对应一个输出组件。
- inputs: 用作输入的组件列表。
- outputs: 用作输出的组件列表。
- 其他参数:用于配置接口的各种参数,如api_name、status_tracker等。
2. clear方法:
- 作用:当用户清除组件(如图像或音频)时触发。
- 参数同change方法。
3. upload方法:
- 作用:当用户上传文件到组件时触发。
- 参数同change方法。
4. select方法:
- 作用:当用户从文件列表中选择文件时触发。
- 参数同change方法。
通过这四个方法,我们可以实现对上传的文件进行处理,并将结果展示给用户。
参数详解
File模块参数:
| 参数 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| value | str | list[str] | Callable | None | None | 默认文件路径。如果是可调用对象,则在应用程序加载时调用该函数以设置组件的初始值。 |
| file_count | str | “single” | 如果是"single",允许用户上传一个文件。如果是"multiple",允许用户上传多个文件。如果是"directory",允许用户上传所选目录中的所有文件。返回类型将根据"multiple"或"directory"的情况为每个文件返回一个列表。 |
| file_types | list[str] | None | None | 要上传的文件扩展名或文件类型的列表(例如[‘image’,‘.json’,‘.mp4’])。"file"允许上传任何文件,"image"仅允许上传图像文件,"audio"仅允许上传音频文件,"video"仅允许上传视频文件,"text"仅允许上传文本文件。 |
| type | str | “file” | 组件返回的值类型。"file"返回一个与上传文件具有相同基本名称的临时文件对象,可以通过file_obj.name检索其完整路径,"binary"返回一个字节对象。 |
| label | str | None | None | 组件在界面中的名称。 |
| every | float | None | None | 如果value是可调用对象,则在客户端连接打开时每隔指定的秒数运行函数一次。否则没有影响。队列必须启用。可以通过此组件的.load_event属性访问事件(例如取消它)。 |
| show_label | bool | True | 如果为True,将显示标签。 |
| container | bool | True | 如果为True,将组件放置在容器中,为边框提供一些额外的填充。 |
| scale | int | None | None | 相对于相邻组件在一行中的宽度。例如,如果组件A的scale=2,组件B的scale=1,那么A的宽度将是B的两倍。应为整数。 |
| min_width | int | 160 | 最小像素宽度,如果屏幕空间不足以满足此值,将换行。如果某个比例值导致该组件比min_width更窄,则首先将尊重min_width参数。 |
| interactive | bool | None | None | 如果为True,将允许用户上传文件;如果为False,只能用于显示文件。如果未提供,则根据组件用作输入或输出来推断。 |
| visible | bool | True | 如果为False,将隐藏组件。 |
| elem_id | str | None | None | 可选字符串,用作此组件在HTML DOM中的id。可用于定位CSS样式。 |
| elem_classes | list[str] | str | None | None | 可选的字符串列表,用作此组件在HTML DOM中的类。可用于定位CSS样式。 |
change 方法参数:
| 参数 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| fn | Callable | None | - | 要封装为界面的函数。通常是机器学习模型的预测函数。函数的每个参数对应一个输入组件,并且函数应该返回一个值或值的元组,其中元组中的每个元素对应一个输出组件。 |
| inputs | Component | list[Component] | set[Component] | None | None | 要用作输入的组件列表。如果函数不接受输入,则应将其设置为空列表。 |
| outputs | Component | list[Component] | None | None | 要用作输出的组件列表。如果函数不返回输出,则应将其设置为空列表。 |
| api_name | str | None | None | 定义此参数将在API文档中公开端点。 |
| status_tracker | None | None | - |
| scroll_to_output | bool | False | 如果为True,将在完成时滚动到输出组件。 |
| show_progress | Literal[‘full’] | Literal[‘minimal’] | Literal[‘hidden’] | “full” | 如果为True,在等待期间将显示进度动画。 |
| queue | bool | None | None | 如果为True,将请求放入队列中(如果队列已启用)。如果为False,即使队列已启用,也不会将此事件放入队列中。如果为None,将使用gradio应用程序的队列设置。 |
| batch | bool | False | 如果为True,则函数应处理一批输入,即应接受每个参数的输入值列表。列表应具有相同的长度(并且最多为max_batch_size的长度)。然后需要返回一个元组列表(即使只有一个输出组件),元组中的每个列表对应一个输出组件。 |
| max_batch_size | int | 4 | 如果从队列调用此方法(仅当batch=True时才相关),则最大批处理在一起的输入数量。 |
| preprocess | bool | True | 如果为False,将不会在运行’fn’之前运行组件数据的预处理(例如,如果使用Image组件调用此方法,则将其保留为base64字符串)。 |
| postprocess | bool | True | 如果为False,将不会在将’fn’的输出返回给浏览器之前运行组件数据的后处理。 |
| cancels | dict[str, Any] | list[dict[str, Any]] | None | None | 要在此侦听器触发时取消的其他事件的列表。例如,设置cancels=[click_event]将取消click_event,其中click_event是另一个组件的.click方法的返回值。尚未运行的函数(或正在迭代的生成器)将被取消,但当前正在运行的函数将被允许完成。 |
| every | float | None | None | 在客户端连接打开时每隔指定的秒数运行此事件。以秒为单位解释。队列必须启用。 |
clear 方法参数:
| 参数 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| fn | Callable | None | - | 要封装为界面的函数。通常是机器学习模型的预测函数。函数的每个参数对应一个输入组件,并且函数应该返回一个值或值的元组,其中元组中的每个元素对应一个输出组件。 |
| inputs | Component | list[Component] | set[Component] | None | None | 要用作输入的组件列表。如果函数不接受输入,则应将其设置为空列表。 |
| outputs | Component | list[Component] | None | None | 要用作输出的组件列表。如果函数不返回输出,则应将其设置为空列表。 |
| api_name | str | None | None | 定义此参数将在API文档中公开端点。 |
| status_tracker | None | None | - |
| scroll_to_output | bool | False | 如果为True,将在完成时滚动到输出组件。 |
| show_progress | Literal[‘full’] | Literal[‘minimal’] | Literal[‘hidden’] | “full” | 如果为True,在等待期间将显示进度动画。 |
| queue | bool | None | None | 如果为True,将请求放入队列中(如果队列已启用)。如果为False,即使队列已启用,也不会将此事件放入队列中。如果为None,将使用gradio应用程序的队列设置。 |
| batch | bool | False | 如果为True,则函数应处理一批输入,即应接受每个参数的输入值列表。列表应具有相同的长度(并且最多为max_batch_size的长度)。然后需要返回一个元组列表(即使只有一个输出组件),元组中的每个列表对应一个输出组件。 |
| max_batch_size | int | 4 | 如果从队列调用此方法(仅当batch=True时才相关),则最大批处理在一起的输入数量。 |
| preprocess | bool | True | 如果为False,将不会在运行’fn’之前运行组件数据的预处理(例如,如果使用Image组件调用此方法,则将其保留为base64字符串)。 |
| postprocess | bool | True | 如果为False,将不会在将’fn’的输出返回给浏览器之前运行组件数据的后处理。 |
| cancels | dict[str, Any] | list[dict[str, Any]] | None | None | 要在此侦听器触发时取消的其他事件的列表。例如,设置cancels=[click_event]将取消click_event,其中click_event是另一个组件的.click方法的返回值。尚未运行的函数(或正在迭代的生成器)将被取消,但当前正在运行的函数将被允许完成。 |
| every | float | None | None | 在客户端连接打开时每隔指定的秒数运行此事件。以秒为单位解释。队列必须启用。 |
upload 方法参数:
| 参数 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| fn | Callable | None | - | 要封装为界面的函数。通常是机器学习模型的预测函数。函数的每个参数对应一个输入组件,并且函数应该返回一个值或值的元组,其中元组中的每个元素对应一个输出组件。 |
| inputs | Component | list[Component] | set[Component] | None | None | 要用作输入的组件列表。如果函数不接受输入,则应将其设置为空列表。 |
| outputs | Component | list[Component] | None | None | 要用作输出的组件列表。如果函数不返回输出,则应将其设置为空列表。 |
| api_name | str | None | None | 定义此参数将在API文档中公开端点。 |
| status_tracker | None | None | - |
| scroll_to_output | bool | False | 如果为True,将在完成时滚动到输出组件。 |
| show_progress | Literal[‘full’] | Literal[‘minimal’] | Literal[‘hidden’] | “full” | 如果为True,在等待期间将显示进度动画。 |
| queue | bool | None | None | 如果为True,将请求放入队列中(如果队列已启用)。如果为False,即使队列已启用,也不会将此事件放入队列中。如果为None,将使用gradio应用程序的队列设置。 |
| batch | bool | False | 如果为True,则函数应处理一批输入,即应接受每个参数的输入值列表。列表应具有相同的长度(并且最多为max_batch_size的长度)。然后需要返回一个元组列表(即使只有一个输出组件),元组中的每个列表对应一个输出组件。 |
| max_batch_size | int | 4 | 如果从队列调用此方法(仅当batch=True时才相关),则最大批处理在一起的输入数量。 |
| preprocess | bool | True | 如果为False,将不会在运行’fn’之前运行组件数据的预处理(例如,如果使用Image组件调用此方法,则将其保留为base64字符串)。 |
| postprocess | bool | True | 如果为False,将不会在将’fn’的输出返回给浏览器之前运行组件数据的后处理。 |
| cancels | dict[str, Any] | list[dict[str, Any]] | None | None | 要在此侦听器触发时取消的其他事件的列表。例如,设置cancels=[click_event]将取消click_event,其中click_event是另一个组件的.click方法的返回值。尚未运行的函数(或正在迭代的生成器)将被取消,但当前正在运行的函数将被允许完成。 |
| every | float | None | None | 在客户端连接打开时每隔指定的秒数运行此事件。以秒为单位解释。队列必须启用。 |
select 方法参数:
| 参数 | 数据类型 | 默认值 | 描述 |
|---|---|---|---|
| fn | Callable | None | - | 要封装为界面的函数。通常是机器学习模型的预测函数。函数的每个参数对应一个输入组件,并且函数应该返回一个值或值的元组,其中元组中的每个元素对应一个输出组件。 |
| inputs | Component | list[Component] | set[Component] | None | None | 要用作输入的组件列表。如果函数不接受输入,则应将其设置为空列表。 |
| outputs | Component | list[Component] | None | None | 要用作输出的组件列表。如果函数不返回输出,则应将其设置为空列表。 |
| api_name | str | None | None | 定义此参数将在API文档中公开端点。 |
| status_tracker | None | None | - |
| scroll_to_output | bool | False | 如果为True,将在完成时滚动到输出组件。 |
| show_progress | Literal[‘full’] | Literal[‘minimal’] | Literal[‘hidden’] | “full” | 如果为True,在等待期间将显示进度动画。 |
| queue | bool | None | None | 如果为True,将请求放入队列中(如果队列已启用)。如果为False,即使队列已启用,也不会将此事件放入队列中。如果为None,将使用gradio应用程序的队列设置。 |
| batch | bool | False | 如果为True,则函数应处理一批输入,即应接受每个参数的输入值列表。列表应具有相同的长度(并且最多为max_batch_size的长度)。然后需要返回一个元组列表(即使只有一个输出组件),元组中的每个列表对应一个输出组件。 |
| max_batch_size | int | 4 | 如果从队列调用此方法(仅当batch=True时才相关),则最大批处理在一起的输入数量。 |
| preprocess | bool | True | 如果为False,将不会在运行’fn’之前运行组件数据的预处理(例如,如果使用Image组件调用此方法,则将其保留为base64字符串)。 |
| postprocess | bool | True | 如果为False,将不会在将’fn’的输出返回给浏览器之前运行组件数据的后处理。 |
| cancels | dict[str, Any] | list[dict[str, Any]] | None | None | 要在此侦听器触发时取消的其他事件的列表。例如,设置cancels=[click_event]将取消click_event,其中click_event是另一个组件的.click方法的返回值。尚未运行的函数(或正在迭代的生成器)将被取消,但当前正在运行的函数将被允许完成。 |
| every | float | None | None | 在客户端连接打开时每隔指定的秒数运行此事件。以秒为单位解释。队列必须启用。 |
总结:
本文介绍了gradio库的File模块及其常用的四个方法:change、clear、upload和select。通过使用这些方法,我们可以实现文件的上传和展示功能,为用户提供更加丰富的交互体验。
相关文章:
使用gradio库的File模块实现文件上传和展示
❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…...
网络安全进阶学习第四课——SSRF服务器请求伪造
文章目录 一、什么是SSRF?二、SSRF成因三、SSRF简析四、PHP存在SSRF的风险函数五、后台源码获取方式六、SSRF危害七、SSRF漏洞挖掘从WEB功能上寻找,从URL关键字中寻找 八、SSRF具体利用ssrf常利用的相关协议PHP伪协议读取文件端口扫描 九、SSRF存在的必要…...
js处理扁平数组和树结构相互转换
一、将扁平的数据转为树形结构 在 js中,可以使用递归算法将扁平的数据转换为树形结构。 扁平数据通常是一个带有 parentId 属性的数组,而树形结构通常是一个带有 children 属性的对象。 1、方法一 下面是一个简单的例子,演示如何将扁平数…...
Spark弹性分布式数据集
1. Spark RDD是什么 RDD(Resilient Distributed Dataset,弹性分布式数据集)是一个不可变的分布式对象集合,是Spark中最基本的数据抽象。在代码中RDD是一个抽象类,代表一个弹性的、不可变、可分区、里面的元素可并行计…...
ffmpeg学习记录
1、对图片进行裁剪 ffmpeg -i input.jpg -vf cropiw/3:ih:20:0 caijian.jpg PS: crop100:100:12:34 相同效果: cropw100:h100:x12:y34 2、视频增加文字水印 使用drawtext滤镜进行增加水印 参数 类型 说明 text 字符串 文字 textfile 字符串 文字文件 …...
ChatGPT:为教育创新提供五大机遇
随着智能技术的不断发展,ChatGPT在教育场景中的创新价值可能比我们能够意识到的还要多。比如它可以自动处理作业、在线答疑,可以辅助语言学习、实时沟通,甚至还可以用于评估诊断、科学研究。国内外关于利用ChatGPT实现教育创新的场景描绘已经…...
Educational Codeforces Round 151 (Rated for Div. 2)
Edu 151 A. Forbidden Integer 题意: 你有[1, k]内除了 x x x的整数,每个数可以拿多次,问 ∑ n \sum n ∑n是否可行并构造 思路: 有1必能构造,否则假如没有1,假如有2, 3必定能构造出大于等于2的所有数&…...
【AI机器学习入门与实战】机器学习算法都有哪些分类?
👍【AI机器学习入门与实战】目录 🍭基础篇 🔥 第一篇:【AI机器学习入门与实战】AI 人工智能介绍 🔥 第二篇:【AI机器学习入门与实战】机器学习核心概念理解 🔥 第三篇:【AI机器学习入…...
React之hooks
Hooks函数 1.useState():状态钩子。纯函数组件没有状态,用于为函数组件引入state状态, 并进行状态数据的读写操作。 const [state, setState] useState(initialValue); // state:初始的状态属性,指向状态当前值,类似…...
1.监控分布式--zabbix
文章目录 监控分布式-zabbix、prometheus概念工作原理功能组件部署zabbix安装Nginx和PHP环境部署数据库编码安装zabbix编译安装zabbix server客户端安装zabbix agent服务 监控分布式-zabbix、prometheus 利用一个优秀的监控软件,我们可以: 通过一个友好的界面进行…...
java stream 多个集合去重取交集
文章目录 背景案例代码 背景 原因是需要从表里查多个集合list,然后取多个集合得交集,并且元素是对象,所以使用了下面的方式,当然方式有很多种,仅供参考。 案例 下面提供了一段多个集合join取交集的例子,…...
给LLM装上知识:从LangChain+LLM的本地知识库问答到LLM与知识图谱的结合
第一部分 什么是LangChain:连接本地知识库与LLM的桥梁 作为一个 LLM 应用框架,LangChain 支持调用多种不同模型,提供相对统一、便捷的操作接口,让模型即插即用,这是其GitHub地址,其架构如下图所示 (点此查…...
视频与AI,与进程交互(二) pytorch 极简训练自己的数据集并识别
目标学习任务 检测出已经分割出的图像的分类 2 使用pytorch pytorch 非常简单就可以做到训练和加载 2.1 准备数据 如上图所示,用来训练的文件放在了train中,验证的文件放在val中,train.txt 和 val.txt 分别放文件名称和分类类别ÿ…...
LLM - 第2版 ChatGLM2-6B (General Language Model) 的工程配置
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/131445696 ChatGLM2-6B 是开源中英双语对话模型 ChatGLM-6B 的第二代版本,在保留了初代模型对话流畅、部署门槛较低等众多优…...
从0开始,手写MySQL事务
说在前面:从0开始,手写MySQL的学习价值 尼恩曾经指导过的一个7年经验小伙,凭借精通Mysql, 搞定月薪40K。 从0开始,手写一个MySQL的学习价值在于: 可以深入地理解MySQL的内部机制和原理,Mysql可谓是面试的…...
React中useState的setState方法请求了好多次
1、问题描述 最近在写react的时候碰到了一个很奇怪的问题。 可以看到那个getXXX()的方法一直不断的被调用,网页一直请求,根本停不下来了。 2、产生原因 要弄明白这个原因,首先要先了解一下react生命周期。 react是组件式的编程,一…...
【MYSQL基础】基础命令介绍
基础命令 MYSQL注释方式 -- 单行注释/* 多行注释 哈哈哈哈哈 哈哈哈哈 */连接数据库 mysql -u root -p12345678退出数据库连接 使用exit;命令可以退出连接 查询MYSQL版本 mysql> select version(); ----------- | version() | ----------- | 8.0.27 | ----------- 1…...
多元回归预测 | Matlab基于灰狼算法优化深度置信网络(GWO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型
文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元回归预测 | Matlab基于灰狼算法优化深度置信网络(GWO-DBN)的数据回归预测,matlab代码回归预测,多变量输入模型,matlab代码回归预测,多变量输入模型,多变量输入模型 评价指标包括:MAE、RMSE和R2等,代码质…...
校园wifi网页认证登录入口
很多校园wifi网页认证登录入口是1.1.1.1 连上校园网在浏览器写上http://1.1.1.1就进入了校园网 使 用 说 明 一、帐户余额 < 0.00元时,帐号被禁用,需追加网费。 二、在计算中心机房上机的用户,登录时请选择新建帐号时给您指定的NT域&…...
[SpringBoot]Spring Security框架
目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征 关于Spring Security的配置 关于默认的登录页 关于请求的授权访问(访问控制) 使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCry…...
利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动
一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
2024年赣州旅游投资集团社会招聘笔试真
2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
