Mobile-Agent终极指南:如何构建跨平台GUI智能代理系统
Mobile-Agent终极指南如何构建跨平台GUI智能代理系统【免费下载链接】MobileAgentMobile-Agent: The Powerful GUI Agent Family项目地址: https://gitcode.com/GitHub_Trending/mo/MobileAgent在当今多设备协同的工作环境中你是否经常需要在手机、电脑和浏览器之间频繁切换执行重复性的GUI操作传统自动化工具往往局限于单一平台而Mobile-Agent通过统一的智能代理框架实现了跨平台GUI操作的革命性突破。这个由阿里通义实验室开发的开源项目通过先进的多模态视觉语言模型和强化学习技术让自然语言指令能够驱动复杂的多步骤任务自动化。核心理念为什么需要跨平台GUI智能代理现代工作流通常涉及多个设备和平台在手机上查看通知在电脑上编辑文档在浏览器中搜索信息。传统自动化方案面临三个核心挑战挑战一平台碎片化- 不同操作系统和设备使用不同的API和交互模式挑战二动态界面适配- GUI元素位置和状态随时变化挑战三复杂任务规划- 多步骤操作需要智能决策和错误恢复Mobile-Agent通过统一的代理架构解决了这些问题。简单来说它就像一个能够同时操作手机、电脑和浏览器的数字助手理解你的意图并自动完成复杂的跨平台任务。技术洞察GUI智能代理的核心价值GUI智能代理的价值不仅在于自动化重复操作更在于其理解能力和适应能力。Mobile-Agent能够视觉感知通过屏幕截图理解当前界面状态意图理解将自然语言指令转化为具体操作序列跨平台协调在不同设备间传递任务状态和数据自我优化从执行经验中学习并改进策略架构解析Mobile-Agent的技术实现Mobile-Agent-v3.5采用了创新的多平台架构设计让你能够无缝控制各类设备。让我们深入探索其技术实现细节。Mobile-Agent-v3.5多平台架构图展示云端沙箱环境与统一控制接口的协同工作核心架构组件云端沙箱环境提供PC、浏览器和移动设备三种沙箱环境基于阿里云基础设施部署。这种设计确保了环境的一致性和可重复性同时避免了本地设备配置的复杂性。统一控制接口通过PyAutoGUIPC、ADB移动、Playwright浏览器实现标准化操作。这种抽象层让代理能够以统一的方式与不同平台交互大大降低了开发复杂度。多代理协同系统包含四个关键角色Manager任务规划与协调中心Operator原子操作执行单元Reflector操作结果验证与反馈Notetaker进度记录与经验存储关键要点多代理协同的优势相比单代理架构多代理系统具有显著优势职责分离每个代理专注于特定功能提高执行效率错误隔离单个代理的失败不会导致整个系统崩溃并行处理多个代理可以同时处理不同子任务知识积累经验可以在代理间共享和复用部署指南从零开始搭建Mobile-Agent环境如果你准备在自己的环境中部署Mobile-Agent这里提供详细的部署指南。我们建议从云端体验开始逐步过渡到本地部署。环境准备与安装云端体验推荐新手ModelScope在线演示无需本地环境直接体验跨平台自动化阿里云百炼API提供稳定的生产级服务接口本地部署步骤# 1. 克隆项目仓库 git clone https://gitcode.com/GitHub_Trending/mo/MobileAgent.git cd MobileAgent # 2. 安装基础依赖 pip install -r Mobile-Agent-v3.5/requirements.txt # 3. 安装GUI-Owl模型 pip install qwen_agent # 4. 配置环境变量 export MOBILE_AGENT_HOME$(pwd) export PYTHONPATH$MOBILE_AGENT_HOME:$PYTHONPATHAndroid设备连接配置对于移动设备自动化Android配置是关键步骤# 启用USB调试 adb devices # 确认设备连接 adb shell settings put global development_settings_enabled 1 # 安装必要应用 adb install -r Mobile-Agent-v3.5/android_world_v3.5/apps/*.apk最佳实践配置优化建议根据我们的经验以下配置能够显著提升系统性能# config/performance.yaml performance_config: screenshot_quality: 85 # 截图质量平衡清晰度与传输速度 operation_delay: 0.5 # 操作间隔避免过快导致界面未响应 retry_count: 3 # 失败重试次数 timeout: 30 # 单步操作超时时间秒 memory_config: cache_size: 100 # 界面元素缓存数量 experience_pool: 1000 # 经验池大小 compression: true # 启用数据压缩实战案例跨平台购物比价自动化让我们通过一个真实场景来展示Mobile-Agent的强大能力——在多个电商平台比价购买任天堂Switch Joy-Con。Mobile-Agent-v2与Mobile-Agent-E在购物比价任务中的执行轨迹对比显示性能显著提升任务执行流程分析用户指令理解在亚马逊、沃尔玛、百思买上查找任天堂Switch Joy-Con的最优价格Manager规划阶段分解为三个子任务按优先级排序Operator执行阶段打开Chrome浏览器并访问亚马逊网站搜索Nintendo Switch Joy-Con产品记录价格信息$77切换到沃尔玛重复搜索流程最后检查百思买平台Reflector验证阶段确认搜索结果准确性处理页面加载失败Notetaker记录阶段保存各平台价格标记沃尔玛$71为最优选项性能对比分析从执行轨迹对比图中可以看到明显的性能差异Mobile-Agent-v2在百思买搜索失败任务提前终止Mobile-Agent-E成功完成所有平台搜索找到最优价格成功率提升从67%提升至100%多代理协同工作流程展示Manager、Operator、Reflector、Notetaker的协同机制多代理协同机制深度解析Mobile-Agent的核心创新在于其多代理架构每个代理都有明确的职责和协作机制。Manager代理智能任务规划引擎Manager代理负责将用户的高层指令分解为可执行的子任务。如果你遇到复杂的多步骤任务Manager会理解用户意图分析指令中的关键信息和约束条件制定高层计划生成任务执行的总体策略任务分解将复杂任务拆分为原子操作序列分配执行顺序基于依赖关系和优先级排序# Manager代理的工作流程示例 def manager_workflow(user_instruction): # 1. 意图分析 intent analyze_intent(user_instruction) # 2. 资源检查 available_platforms check_available_platforms() # 3. 任务分解 subtasks decompose_task(intent, available_platforms) # 4. 优先级排序 execution_plan prioritize_subtasks(subtasks) return execution_planOperator代理精准操作执行器Operator负责具体的GUI交互操作支持多种原子操作点击操作精确坐标点击、元素ID点击、文本匹配点击文本输入键盘模拟、剪贴板操作、自动补全滑动滚动页面导航、列表浏览、手势识别截图分析实时屏幕状态感知、元素定位Reflector代理实时错误诊断系统当操作出现问题时Reflector会执行以下诊断流程失败原因分析元素未加载、网络超时、权限不足等修正建议生成基于错误类型提出具体解决方案重试策略制定立即重试、等待后重试、更换方法必要时上报当连续失败时上报Manager重新规划Notetaker代理长期记忆管理器Notetaker维护任务的长期记忆包括进度状态当前完成百分比、剩余步骤关键信息已获取的数据、重要发现经验教训成功/失败的操作模式、优化建议快捷方式发现的优化操作路径、常用模式性能优化与调优技巧Mobile-Agent提供多种模型规格根据需求选择合适的模型能够显著提升性能。模型选择策略模型规格适用场景内存需求推理速度推荐配置GUI-Owl-1.5-2B边缘设备、快速响应低快移动设备、实时应用GUI-Owl-1.5-8B平衡性能与效率中中等通用场景、多任务GUI-Owl-1.5-32B复杂任务、高精度高较慢企业级、关键任务Thinking变体需要深度规划额外20%慢20-30%复杂决策、战略规划内存优化配置# config/memory_optimization.yaml memory_config: short_term: capacity: 100 # 短期记忆容量 retention: 300 # 保留时间秒 eviction_policy: lru # 淘汰策略 long_term: storage_path: ./experience_db compression: true max_size_gb: 10 backup_interval: 3600 # 备份间隔秒 experience_replay: batch_size: 32 priority_sampling: true replay_ratio: 0.3 # 经验回放比例网络延迟优化对于云端部署建议采用以下优化策略使用CDN加速静态资源缓存减少传输延迟连接池管理复用HTTP连接减少握手开销请求批处理合并多个小请求减少往返次数压缩传输启用gzip压缩减少数据量智能重试基于错误类型的差异化重试策略技术洞察性能瓶颈识别在实际使用中如果你遇到性能问题可以关注以下几个关键指标响应时间从指令输入到开始执行的时间执行成功率任务完成的比例错误恢复率从错误中恢复的比例资源利用率CPU、内存、网络使用情况常见问题排查指南设备连接问题症状ADB无法识别设备或连接不稳定解决方案# 检查USB调试是否启用 adb devices -l # 重启ADB服务 adb kill-server adb start-server # 检查设备授权状态 adb shell getprop ro.build.version.sdk # 查看连接日志 adb logcat | grep -i usb模型加载失败症状GUI-Owl模型无法加载或推理错误解决方案# 检查模型路径和权限 import os model_path os.path.expanduser(~/.cache/modelscope/hub) print(f模型路径: {model_path}) print(f路径存在: {os.path.exists(model_path)}) print(f可写权限: {os.access(model_path, os.W_OK)}) # 手动下载模型如果需要 from modelscope import snapshot_download model_dir snapshot_download(iic/GUI-Owl-1.5-8B-Instruct)操作执行超时症状点击操作无响应或等待时间过长解决方案增加操作等待时间适当延长元素加载等待时间添加元素存在性检查在执行操作前确认元素可见实现智能重试机制基于错误类型的差异化重试使用更精确的元素定位结合多种定位策略最佳实践错误处理策略我们建议采用分层的错误处理策略def execute_with_retry(operation, max_retries3): 带重试的操作执行 for attempt in range(max_retries): try: result operation() if result.success: return result else: # 分析失败原因 error_type analyze_error(result) wait_time calculate_wait_time(error_type, attempt) time.sleep(wait_time) except Exception as e: # 记录异常并决定是否重试 if should_retry(e, attempt): continue else: raise # 所有重试都失败 return OperationResult(successFalse, errorMax retries exceeded)实际应用场景案例场景一自动化办公流程需求每天自动收集市场数据并生成报告Mobile-Agent实现自动打开数据源网站并登录执行搜索和筛选操作下载CSV文件打开Excel处理数据生成图表创建PPT报告并添加分析内容邮件发送报告给相关人员技术要点使用多代理协同处理不同格式的数据实现错误恢复机制处理网络波动配置定时任务自动化执行场景二跨平台内容创作需求在手机拍照后自动编辑并发布到社交媒体Mobile-Agent实现从相册选择最新照片自动裁剪和调整使用修图应用调整亮度、对比度、饱和度添加文字水印和品牌标识分享到小红书、微博、抖音等平台统计发布后的互动数据生成分析报告技术要点图像处理与文本识别的结合多平台账号管理和安全认证数据分析与可视化展示场景三智能客服辅助需求自动处理常见用户咨询和问题Mobile-Agent实现监控客服系统新消息自动分类在知识库中搜索匹配答案生成个性化回复模板提交给人工审核或直接发送收集用户反馈优化回答质量技术要点自然语言理解与分类知识图谱构建与查询个性化回复生成反馈循环优化进阶技巧自定义扩展与集成自定义操作扩展如果你需要支持特定的应用程序或操作可以扩展Operator代理class CustomOperator(Operator): 自定义操作扩展 def execute_custom_action(self, action_type, params): 执行自定义操作 if action_type custom_app_action: return self._handle_custom_app(params) elif action_type api_integration: return self._call_external_api(params) else: return super().execute_action(action_type, params) def _handle_custom_app(self, params): 处理特定应用的自定义操作 # 实现特定应用的自动化逻辑 app_name params.get(app_name) action params.get(action) # 根据应用类型执行相应操作 if app_name custom_erp: return self._operate_erp_system(action) elif app_name legacy_system: return self._handle_legacy_interface(action) return OperationResult(successFalse, errorUnsupported app)第三方系统集成Mobile-Agent支持与多种第三方系统集成# 与企业系统集成示例 class EnterpriseIntegration: 企业系统集成类 def __init__(self): self.crm_client CRMClient() self.erp_client ERPClient() self.bi_tool BusinessIntelligenceTool() def automate_business_process(self, process_name, data): 自动化业务流程 # 1. 从CRM获取客户信息 customer_info self.crm_client.get_customer(data[customer_id]) # 2. 在ERP中创建订单 order_result self.erp_client.create_order(customer_info, data[products]) # 3. 更新BI报表 self.bi_tool.update_sales_report(order_result) # 4. 发送通知 self._send_notifications(customer_info, order_result) return {success: True, order_id: order_result[id]}性能监控与告警建立完善的监控体系对于生产环境至关重要class PerformanceMonitor: 性能监控与告警系统 def __init__(self): self.metrics { response_time: [], success_rate: [], error_rate: [], resource_usage: {} } def record_metric(self, metric_name, value): 记录性能指标 if metric_name not in self.metrics: self.metrics[metric_name] [] self.metrics[metric_name].append({ timestamp: time.time(), value: value }) # 检查是否需要触发告警 self._check_alerts(metric_name, value) def _check_alerts(self, metric_name, value): 检查性能指标是否触发告警 thresholds self._get_thresholds(metric_name) if value thresholds[warning]: self._send_alert(f警告: {metric_name} 超过阈值 ({value})) elif value thresholds[critical]: self._send_alert(f严重: {metric_name} 超过临界值 ({value}))未来发展与社区贡献Mobile-Agent项目持续演进最新版本v3.5已经支持更强大的功能最新技术特性多平台统一控制PC、移动、浏览器一体化操作体验强化学习优化通过MRPO框架显著提升性能工具调用集成支持MCP协议和外部API调用长期记忆增强改进的经验回放机制实时协作支持多代理实时协同工作社区贡献指南如果你希望为项目做出贡献可以从以下几个方面入手问题反馈在项目issue中报告bug或提出改进建议代码贡献遵循项目的PR流程提交功能改进或bug修复案例分享提交你的成功应用案例和使用经验文档改进帮助完善中文文档、教程和示例测试覆盖增加测试用例提高代码质量技术洞察项目演进方向基于当前技术趋势和用户需求Mobile-Agent的未来发展方向可能包括边缘计算优化在资源受限设备上运行轻量级模型隐私保护增强本地化处理敏感数据多模态融合结合语音、手势等多种交互方式自适应学习根据用户习惯自动优化操作策略生态扩展支持更多平台和应用程序下一步行动建议根据你的具体需求和技术背景我们建议采取以下步骤对于初学者从云端体验开始使用ModelScope在线演示了解基本功能运行官方示例按照Mobile-Agent-v3.5/README.md中的教程操作尝试简单任务从单一平台、简单任务开始逐步增加复杂度加入社区讨论在GitHub Discussions中提问和学习对于开发者深入理解架构研究多代理协同机制和通信协议扩展自定义功能基于现有框架开发特定领域的操作性能优化实践根据实际场景调整配置参数集成到现有系统将Mobile-Agent作为组件集成到业务系统中对于企业用户概念验证选择1-2个关键业务场景进行试点风险评估评估安全性、可靠性和合规性要求团队培训培养内部的技术支持和开发团队规模化部署制定分阶段的上线计划关键要点成功实施的关键因素根据我们的经验成功实施Mobile-Agent项目需要考虑以下关键因素明确业务目标确定自动化要解决的具体问题选择合适的模型根据任务复杂度和资源约束选择模型规格建立监控体系实时跟踪性能指标和错误率制定应急预案准备手动接管和故障恢复方案持续优化迭代基于使用反馈不断改进配置和策略Mobile-Agent代表了GUI自动化领域的最新进展通过智能代理技术让机器真正理解并操作图形界面。无论是个人效率提升还是企业流程自动化这个开源项目都提供了强大的技术基础和实践方案。现在就开始你的跨平台自动化之旅探索智能代理技术的无限可能【免费下载链接】MobileAgentMobile-Agent: The Powerful GUI Agent Family项目地址: https://gitcode.com/GitHub_Trending/mo/MobileAgent创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

你的磁盘正在悄悄“打嗝“?用Czkawka和Krokiet彻底治愈存储空间消化不良

你的磁盘正在悄悄“打嗝“?用Czkawka和Krokiet彻底治愈存储空间消化不良

你的磁盘正在悄悄"打嗝"?用Czkawka和Krokiet彻底治愈存储空间消化不良 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka 你知道…

2026/10/13 2:17:27 阅读更多 →
】AI省Token项目一键整合软件tokless

】AI省Token项目一键整合软件tokless

链接:https://pan.quark.cn/s/8ac129187415 目前随着AI水平已经可以能vibe coding这样重度使用AI,但是token的花费也越来越大,省token的项目也是目前越来越流行,就目前而言,全网热门的这几个省token的项目&#xff0c…

2026/10/3 2:06:01 阅读更多 →
AI窗户设计生成器:从Stable Diffusion部署到API集成的全流程实践

AI窗户设计生成器:从Stable Diffusion部署到API集成的全流程实践

这次我们来看一个关于“窗户怎么设计”的技术项目。虽然这个标题看起来偏向建筑或室内设计,但在当前的技术语境下,它很可能指向一个利用AI进行窗户设计生成、效果图渲染或自动化布局的工具。这类项目通常结合了计算机视觉、生成式AI和参数化设计&#xf…

2026/10/11 17:20:09 阅读更多 →

最新新闻

Unity水下波光Shader:动态折射与材质自适应光照实现

Unity水下波光Shader:动态折射与材质自适应光照实现

1. 这个效果到底在解决什么问题:水面光影的“动态欺骗”本质很多人看到“Unity Shader实现水中波光照射动物身上的效果”这个标题,第一反应是:“不就是加个高光贴图或者用个Blinn-Phong算一下反射吗?”——这恰恰是踩进第一个认知…

2026/10/13 13:00:12 阅读更多 →
MATLAB水果识别实战:从图像处理到STM32部署

MATLAB水果识别实战:从图像处理到STM32部署

简介:本资源是一个基于MATLAB实现的轻量级水果图像识别程序,面向图像处理初学者、自动化专业学生及农业智能化应用开发者,解决常见水果(如香蕉、梨、西红柿、青椒等)的自动分类识别问题,适用于课程设计、小…

2026/10/13 13:00:12 阅读更多 →
金山毒霸卸载后残留弹窗的根源与彻底清理指南

金山毒霸卸载后残留弹窗的根源与彻底清理指南

卸载金山毒霸之后还在被弹窗骚扰,这事儿太常见了。我见过不少用户重装了系统才解决问题,其实根本不用这么极端。这篇内容就把残留弹窗的来源、手工清理步骤和常见坑一次性说清楚。 先说明白一个核心事实:金山毒霸的卸载程序只会移除主体程序…

2026/10/13 13:00:12 阅读更多 →
深度学习图像预处理:transforms 核心技术与实战指南

深度学习图像预处理:transforms 核心技术与实战指南

1. 图像预处理到底在解决什么问题 做过深度学习项目的人都有一个共识:模型效果不好,八成不是网络结构的问题,而是数据没喂对。我刚开始接触计算机视觉那会儿,拿到一批图片就直接往网络里塞,结果训练loss震荡得厉害&…

2026/10/13 13:00:12 阅读更多 →
Linux内核模块入门:从Hello World驱动到加载卸载全流程

Linux内核模块入门:从Hello World驱动到加载卸载全流程

1. 项目概述:从“Hello World”开始,真正摸到Linux内核驱动的脉搏你点开这个标题,大概率不是想看教科书式的定义,而是手痒了——想亲手敲几行代码,让自己的程序跑进内核空间,亲眼看着insmod命令执行后&…

2026/10/13 13:00:12 阅读更多 →
Windows下Claude Code安装配置与避坑全攻略

Windows下Claude Code安装配置与避坑全攻略

“Claude Code 在 Windows 上到底能不能用?”——这恐怕是过去一个月我在各种技术群里被问最多的问题。一方面,这个命令行形态的 AI 编程代理确实很香,直接在终端里让它读仓库、改代码、跑测试、提 PR,整个工作流都在一个地方流转…

2026/10/13 12:59:11 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练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/12 18:11:17 阅读更多 →