Tampermonkey 5.1.0 离线安装详解:从crx文件到用户脚本管理

简介:Tampermonkey(篡改猴)5.1.0离线安装包是一款适用于Chrome等主流浏览器的用户脚本管理器,可在无网络环境下完成安装,特别适合需要固定版本、内网部署或手动加载扩展的用户。压缩包共83个文件,以json配置、js脚本、png图标及html页面为主,另含license与css样式文件,整体大小仅1.56MB,核心脚本逻辑、界面与语言资源完整齐备。目前已有7565人学习下载,是获取这一热门插件离线版本的可靠渠道。安装后即可通过浏览器工具栏管理用户脚本,借助Greasy Fork等平台资源去除广告、调整布局或增强网页功能;包内保留的多语言区域配置、编辑器样式及各类图标素材,也便于用户后续自定义、备份或离线分发。

1. 篡改猴离线安装包:为什么一个 5.1.0 的 crx 值得单独存

浏览器重置后的第一个早晨,我打开内部单据系统,发现要重复点击几十个表格。想用插件把机械化操作变成脚本,应用商店却始终加载不出来,网络策略把外部地址全部挡在外面。这时候我想到桌面上那份 Tampermonkey 5.1.0 离线安装包,它不需要连接任何外部站点,只要一个本地 crx 文件,就能把完整的用户脚本管理环境装进浏览器。它解决的核心问题是:在没有应用商店、断网或受限网络下依然能安装插件;另一个作用是版本锁定,不让浏览器悄悄升级到你不熟悉的新版。适合定期重装系统的人、固定环境维护者以及被脚本问题折腾过的人。

2. 篡改猴 5.1.0 的工作方式:先弄懂脚本接管页面的那几条规则

2.1 用户脚本不是网页代码:注入、隔离与授权边界

插件世界里最容易踩的坑,是把“安装脚本管理器”等同于“脚本已经生效”。实际上,篡改猴装好之后什么都不做,它只负责把写在用户脚本里的 JavaScript 按规则注入到指定页面。真正改变页面行为的是脚本本身,这也是为什么很多下载包里同时附带了 .user.js 文件。

有人会问:既然只是执行 JavaScript,为什么不直接打开浏览器控制台粘贴代码?我的回答是,控制台里的代码刷新就丢,没有站点匹配功能,没有跨域存储接口,也没有图形化的开关菜单。篡改猴的价值在于把“对哪个站点执行、什么时候执行、能不能存数据、要不要跨域请求”这些参数变成可管理的元数据。

元数据声明块位于脚本文件顶部,被// ==UserScript==注释包裹。这里面的@name、@version、@match、@run-at、@grant都是注入行为的控制参数。下面是最小可用的脚本:

// ==UserScript== // @name 最小接管测试 // @namespace local.test // @version 1.0.0 // @match https://办公系统.example.com/* // @run-at document-end // @grant none // ==/UserScript== alert('篡改猴注入成功');

这段代码的逻辑很直白:名称和版本都只是展示信息,@match声明了只对这个地址下的页面生效,@run-at决定注入时机,document-end表示等 DOM 解析完成再执行,@grant none则表示不使用扩展提供的特殊接口,脚本直接运行在页面上下文里。参数说明:办公系统.example.com是我随手写的例子,实际使用时替换成你的目标域名;@match支持通配符,例如http://*.example.com/*能匹配所有子域名。

这里要特别强调@grant的作用。如果写成@grant none,脚本与页面共享同一个全局环境,可以直接读取页面里的全局变量,但拿不到 GM 系列接口。反过来,只要声明了任何一个 GM 接口,篡改猴会把脚本关进隔离环境,页面变量和脚本变量互相看不见,但你能用GM_setValue做持久化存储、GM_xmlhttpRequest发跨域请求、GM_registerMenuCommand在菜单里注册命令。

我经常看到有人在这一点上翻车:想一键操作某个管理系统,脚本里用了GM_setValue,却忘了在元数据里声明@grant GM_setValue,结果控制台不断报GM_setValue is not defined。这不是扩展没装上,而是授权边界没划清楚。记住一个口诀:用了哪个 GM 接口,就在@grant里写哪个。

2.2 运行时机与动态页面:为什么“脚本装了但没反应”

多数人新建脚本时保留默认的@run-at document-end,意思是页面解析完再执行。对静态页面来说这个时机合理,但现在的办公系统、数据平台几乎全是动态加载。尤其是内部管理系统,表格和按钮都在页面加载过程中由 JavaScript 异步渲染,你在 document-end 那一刻去找按钮,它可能还不存在。

常见的应对是调整注入时机:

// ==UserScript== // @name 等待按钮出现 // @match https://办公系统.example.com/list // @run-at document-start // @grant none // ==/UserScript== function waitForAction() { const actionBtn = document.querySelector('#batch-commit'); if (actionBtn) { actionBtn.click(); return; } setTimeout(waitForAction, 500); } waitForAction();

这段代码从document-start就开始尝试查找按钮,找不到就每隔 500 毫秒再查一次,一旦找到目标元素就立刻点击。500 毫秒是我常用的起始间隔:太短会空转消耗 CPU,太长可能错过页面某个瞬时状态。如果按钮不是固定 id,而是由前端框架反复重建的节点,应该改用 MutationObserver 监听 DOM 变化,在回调里判断目标元素是否存在,比轮询更稳。

这里有个边界:@run-at document-start注入脚本时,document.body可能还未创建。代码里直接querySelector不会报错,只是返回 null,然后进入下一轮等待。但如果脚本一开始就要给 body 挂事件监听,就必须包一层 DOMContentLoaded 判断,否则会拿到空引用。很多用户脚本在更新版本后出现“时好时坏”,多半就是运行时机与动态加载对不上。

2.3 版本锁定的利与弊:5.1.0 离线包到底锁住了什么

在线商店自动安装的篡改猴是跟着官方走的,每次浏览器启动都可能静默更新。离线安装包则是把版本固定在 5.1.0,不接收自动更新。这个特性在固定工作环境里是刚需:脚本经过反复调试后已经稳定,官方更新一旦改变菜单结构、存储分区或默认注入策略,反而会打破原有脚本。

5.1.0 相对 4.x 系列有几个可见差异:工具栏菜单重新设计,脚本列表与仪表盘入口更集中;存储分区更细,GM_setValue的数据组织方式有调整;内置编辑器对旧版脚本头部注释的兼容性有变化。老脚本如果长期不维护,在 5.x 下可能需要补@grant声明,或者调整@match通配范围。所以离线包不是“万能兼容器”,而是“确定性优先”:你在 5.1.0 上验证通过的行为,不会因为自动更新变成另一个行为。

代价同样明显:官方后续修复的兼容性问题,离线包一个都收不到。我通常的做法是先把 5.1.0 离线包用起来,等手头脚本全部跑稳之后,再每隔几个月拿新版包替换一次,每次替换前在目标站点上重新跑一遍回归脚本。

3. 离线安装的落地路径:从文件类型确认到扩展页面加载

3.1 先分清拿到的是 crx、zip 还是已解压目录

很多下载资源为了方便,会把篡改猴 5.1.0 做成 crx 或 zip 两种形态。crx 是浏览器扩展的打包格式,经过签名,扩展名是 .crx;zip 是把扩展源目录压起来的压缩包;已解压目录则是一个文件夹。拿到文件后别急着双击,先看扩展名。

如果是 tampermonkey_5_1_0.crx,正常路径是进入浏览器扩展管理页拖拽安装。如果只有 zip,先用压缩工具打开,确认里面有没有 manifest.json。一个常见情况是 zip 解压出来后还存在一层目录嵌套,例如解压后是 tampermonkey_5_1_0/src/ 这样的结构,里面各项文件散落,加载扩展时要选中真正包含 manifest.json 的那一层。

判断 crx 是否完整也有技巧:打开压缩工具查看内部分支,如果能看到_metadata目录和manifest.json文件,说明包结构正常。如果压缩工具直接报“文件头部损坏”,多半是下载中断或 crx 头部信息异常,重新下载再试。

3.2 基于 Chromium 内核的浏览器:扩展管理页的两个开关

离线安装的主要操作发生在浏览器扩展管理页面。在地址栏输入扩展管理页地址,例如chrome://extensions,回车后会看到已安装扩展列表,右上角是“开发者模式”开关。先把它打开,这一操作是后续本地安装的前提。

具体流程:

  1. 在文件管理器里定位 crx 文件。
  2. 把 crx 直接拖到扩展管理页的空白区域。
  3. 页面弹出确认框,显示扩展名称和版本号,点击添加。
  4. 确认工具栏出现篡改猴图标,扩展管理页中版本号显示 5.1.0。

提示:开发者模式只在需要拖入离线包时打开,安装完成后可以关掉。关闭后已安装的扩展不会消失,但如果扩展是未签名方式加载的,后续重启浏览器可能给出提醒。

如果浏览器版本较旧,拖拽 crx 时页面没有任何反应,可以尝试单击 crx 文件,浏览器会弹出安装确认框。不要同时在 crx 文件上双击,“双击”往往只会触发解压工具,而不是安装。

3.3 兜底路径:把 crx 转成解压目录再加载

有些新版本浏览器会明文拦截非商店渠道的 crx,提示“只能通过官方渠道添加”。这时候不要硬碰,改用“加载已解压的扩展程序”这条兜底路径。

操作步骤:

  1. 复制 crx,把副本后缀改成 .zip。
  2. 使用压缩工具解压,得到一个包含 manifest.json 的文件夹。
  3. 回到扩展管理页,点击“加载已解压的扩展程序”。
  4. 选择刚才解压出的文件夹。

关键点在于目录选择。如果解压后的结果是tampermonkey_src/5.1.0_0/manifest.json,就要选5.1.0_0这一层,而不是tampermonkey_src。选了外层目录,扩展管理页会提示“清单文件缺失或不可读”。另外,解压目录的完整路径里尽量不要有中文和空格,部分浏览器对非 ASCII 路径解析有问题,加载时会莫名其妙失败。把文件夹挪到纯英文路径下再加载,是最省事的处理方式。

还有一个细节:如果是通过这种方式加载,扩展并不会保留原 crx 的签名验证身份,部分浏览器会把它当作“开发者模式下的扩展”处理。为了解决重启后被停用的问题,我一般会在解压后的 manifest.json 里检查是否有key字段;若缺少,尝试从原始 crx 中提取公钥补写,再重新加载。补上 key 后,浏览器对扩展的识别会稳定很多。

3.4 安装后的验证:版本号、图标与存储权限

安装完成后第一件事是确认版本。在扩展管理页点击篡改猴的“详细信息”,查看版本号是否严格为 5.1.0。版本号不对,说明拿到的包可能不是标称版本,后续所有脚本行为都可能对不上。

然后确认工具栏出现篡改猴图标。如果找不到,点工具栏右侧的拼图按钮,在扩展列表里找 Tampermonkey,把它固定到工具栏上。这个操作只影响入口可见性,不影响脚本运行。

最后验证存储权限。打开篡改猴仪表盘,进入“设置-通用”,改动一个设置项再恢复默认,如果页面能正常保存,说明扩展的 IndexedDB 存储正常。这一步容易被忽略,但很多脚本报错“无法存储数据”,根本不是脚本问题,而是扩展的存储链路被浏览器限制,原因通常是多个版本的篡改猴同时共存,需要把旧版本全部停用,只留 5.1.0。

4. 常见安装问题与排查:五个实际踩过的坑

4.1 提示“只能通过官方渠道添加扩展”

现象:把 crx 拖入扩展管理页,按钮置灰,或者点击后弹出拦截提示,扩展无法加入。

原因:较新的 Chromium 内核浏览器默认启用了扩展来源校验,即使是本地 crx,只要不是来自官方商店,就被视为高风险来源。开发者模式未开启时尤其如此。

解决:回到扩展管理页,确认右上角“开发者模式”已经打开,重新拖入。如果仍被拦截,按第 3.3 节的方法把 crx 解压,再使用“加载已解压的扩展程序”。这条路径避开了来源校验,是目前离线安装最通用的做法。

4.2 扩展显示已启用,但工具栏找不到图标

现象:扩展管理页显示篡改猴“已启用”,打开网页后右上角完全看不到入口。

原因:现代浏览器会把不常用的扩展统一收进溢出菜单,或者浏览器自动把新安装的扩展标记为隐藏。这属于 UI 层收纳规则,不影响脚本注入。

解决:打开工具栏上的拼图按钮,在列表中找到 Tampermonkey,点击旁边的固定图标。如果固定之后图标仍不出现,检查是不是同时装了两个版本的篡改猴,停用并删除旧版本,只保留 5.1.0。

4.3 重启浏览器后扩展被自动停用

现象:重启浏览器后,扩展列表里篡改猴显示灰色,提示“请停用以开发者模式运行的扩展程序”。

原因:通过“加载已解压的扩展程序”安装的扩展没有商店签名,浏览器在每次启动时会重新做一次校验。某些安全策略配置下,未签名扩展会被直接关闭。

解决:我的习惯是先解压 crx,检查 manifest.json 是否包含key字段。没有的话,从原始 crx 中提取公钥并写入该字段,再重新加载。补上 key 后,扩展 ID 会稳定下来,浏览器校验通过的几率明显提升。如果浏览器所在环境启用了组织级策略,要求所有扩展必须有管理员白名单,那靠本地操作无解,需要让管理员把扩展 ID 加入允许列表。

4.4 站点检测到脚本注入特征,功能按钮消失

现象:登录业务系统后弹出“检测到非标准插件”的提示,或者原本该出现的按钮被页面脚本隐藏。

原因:部分站点会通过检查 navigator 对象或 DOM 节点上的额外属性,识别出篡改猴创建的隔离环境特征,从而触发反自动化逻辑。

解决:把脚本的@grant改成none,让代码直接运行在页面上下文,很多隔离环境特征会消失。再把@match范围收紧到具体业务页面,不要在无关页面上注入,减少误伤范围。需要明确的是,篡改猴目前做不到彻底伪装成原生页面脚本;如果目标站点对自动化有强对抗,该禁用就禁用,不要硬扛。

4.5 脚本保存正常,但目标页面一点反应都没有

现象:脚本在编辑器里保存成功,状态显示已启用,打开目标页面后控制台无任何报错,页面也没变化。

原因:最常见是@match写得不匹配。协议、域名、端口三者有一个不一致,脚本就不会注入。其次是目标元素位于 iframe 中,而脚本只注入了顶层页面。

解决:先打开目标页面控制台,输入typeof GM_info。如果返回 undefined,说明扩展根本没有在这个页面注入,去检查@match的协议和域名是否完全一致。如果返回 object,脚本注入了但没找到元素,说明是运行时机问题,参考第 2.2 节改成轮询或 MutationObserver。涉及 iframe 时,需要把 iframe 的真实地址也写进@match,并在脚本开头通过window.self !== window.top判断当前上下文,只处理目标那个 iframe。

5. 装完不是终点:用一个自检脚本确认控制权在自己的手里

安装状态和可用状态是两回事。我习惯在离线包落地后立刻跑一遍自检脚本,确认篡改猴真的接管了页面注入、存储和菜单这三条链路。

// ==UserScript== // @name 自检脚本 // @match https://办公系统.example.com/check // @grant GM_setValue // @grant GM_getValue // @grant GM_registerMenuCommand // ==/UserScript== const checkKey = 'install_check'; const passed = GM_getValue(checkKey, false); GM_setValue(checkKey, true); if (!passed) { GM_registerMenuCommand('自检菜单', () => console.log('菜单链路正常')); console.log('[ts-check] 首次运行:存储链路正常'); }

这段脚本用GM_getValue和GM_setValue验证存储链路,用GM_registerMenuCommand验证菜单链路。第一次打开匹配页面时,控制台输出“存储链路正常”,右键篡改猴图标能看到“自检菜单”,点击后输出“菜单链路正常”。参数说明:三个@grant声明缺一不可,否则对应接口未定义;验证完把这个脚本删掉,避免一直驻留在业务页面。

验证通过后,再决定更新策略。如果离线包是为了稳定,建议在篡改猴设置里关闭自动检查更新,避免后台请求制造不必要的网络记录;如果想要新功能,就手动定时替换新版安装包,而不是在线升级。

从那以后,我每次重装系统或换浏览器都会强制走一遍:看文件类型、开启开发者模式、拖入或解压加载、核对版本号 5.1.0、跑自检脚本、删除自检。这套流程走完,篡改猴才算真正装进了浏览器,而不是仅仅“显示已安装”。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

Spring AI Alibaba停更后,Java AI应用开发的替代方案与迁移实践

Spring AI Alibaba停更后,Java AI应用开发的替代方案与迁移实践

1. 一个停更消息引发的Java AI生态焦虑前几天在技术群里看到有人转了一句话:“Spring AI Alibaba已停更了,Java还有希望吗?”底下跟了一串表情包,有叹气的,有吃瓜的,也有认真在问“那我手上的项目要不要换语…

2026/10/20 10:11:53 阅读更多 →
千万级CSV导出零内存溢出实战:JDBC流式查询+OpenCSV直写

千万级CSV导出零内存溢出实战:JDBC流式查询+OpenCSV直写

简介:本资源是一套面向Java中高级开发者的高性能CSV大数据导出解决方案,专为解决千万级数据导出时内存溢出、响应迟滞等生产痛点而设计。方案采用分批处理多线程并行流式写入核心策略,集成线程池管理(ThreadPools)、任…

2026/10/20 10:11:53 阅读更多 →
招聘信息系统开发实战:ThinkPHP与Laravel框架选型与设计要点

招聘信息系统开发实战:ThinkPHP与Laravel框架选型与设计要点

招聘信息系统这个题目,说实话在学校里做课程设计和毕业设计时并不少见,但能把它做扎实、做出亮点的,往往不是在功能堆得多华丽,而是看你对业务模型的抽象能力、对框架特性的拿捏程度,以及遇到实际问题时能不能快速定位…

2026/10/20 10:11:53 阅读更多 →

最新新闻

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

Vidu Q4 Preview深度评测:AI视频生成迈向生产力工具的关键一步

最近几个创作群里讨论最多的,绕不开Vidu Q4 Preview。做AI视频的同仁应该都有感觉,这个赛道现在卷到什么程度:几乎每隔几天就有新版本、新模型冒出来,但大多是“看起来厉害、一上手就露馅”。Vidu Q4 Preview这次放出的内容&#…

2026/10/21 0:33:56 阅读更多 →
AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

AI在芯片设计中的黑盒困局:一次IR压降事故带来的反思

芯片世界里,有一句话最近被工程师们重复得越来越多:AI赢了棋局,却讲不出思路。就在上个月,我拿着一个AI辅助完成的block级floorplan给物理设计团队,线长比上一版少了12%,拥塞图也干净得不像话。结果等IR压降…

2026/10/21 0:33:56 阅读更多 →
计算智能体入门:从状态机到Q-learning的决策实现

计算智能体入门:从状态机到Q-learning的决策实现

1. 从零理解计算智能体的核心骨架计算智能体这个概念,听起来像是学术论文里的术语,但把它拆开来看,其实就是一个能感知环境、做出决策、执行动作的软件实体。你可以把它想象成一个在迷宫里找路的小机器人,它能看到周围哪里有墙、哪…

2026/10/21 0:33:55 阅读更多 →
MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

MoE混合专家模型:稀疏激活如何破解大模型容量与成本困局

从Transformer诞生起,前馈网络(FFN)就是"又笨重又绕不开"的角色:它占了模型近三分之二的参数量,但每个token都得老老实实把所有参数过一遍。你扩大模型容量,推理成本就跟着线性往上涨&#xff0c…

2026/10/21 0:33:55 阅读更多 →
开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

开源30B模型硬刚闭源旗舰:科研场景实测与本地部署指南

最近开源圈又热闹起来了,一个主打科研场景的30B级别开源模型,直接放话要跟两家头部闭源大模型掰手腕。我当时第一反应是“又来一个刷榜的”,但仔细看完技术报告和社区实测数据之后,觉得这波还真不是营销话术,确实有货。…

2026/10/21 0:33:55 阅读更多 →
LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

LLM强化学习全解析:PPO、GRPO、DPO等五类方法选型与实践

做LLM训练绕不开强化学习这块,标题里这五个字看着简单,真要分类起来其实挺讲究的。我前几年刚开始接触大模型对齐时,也把PPO、DPO、GRPO这些名词搞得晕头转向,后来用了一段时间才理清楚它们之间的血缘关系和适用场景。这篇博文就把…

2026/10/21 0:32:54 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →