小程序分类页左右联动滚动实现:scroll-view锚点定位与高亮同步
1. 这个左右联动的分类页到底解决了什么问题做电商类小程序商品分类页是绕不开的一个页面。你打开任何一个购物小程序点进“分类”标签大概率看到的就是左边一列一级分类右边一片二级分类或者商品网格左边点一下右边跟着滚右边滚到某个位置左边的高亮也跟着变。这个交互看起来简单但真动手写的时候坑比想象中多。我最近刚把一个商城小程序的分类页重做了一遍从最早的“点击左边、右边整体切换”改成了现在的“左右双向联动滚动”。改完之后最直观的感受是用户找东西的效率明显高了因为右边不再是每次只显示一个二级分类而是把所有二级分类按顺序铺开用户可以直接一路往下滑左边的高亮自动跟着走不用反复点来点去。这个页面的核心关键词就是左右滚动条联动、scroll-view 滚动、锚点定位、分类高亮同步。它适合谁看如果你正在做小程序商城、外卖点餐、图书分类、课程目录这类“一级分类 二级内容”的结构并且希望交互体验接近主流电商 App那这篇内容基本可以直接抄作业。哪怕你只是刚学小程序、想搞懂scroll-view的滚动 API 怎么配合使用这里面的思路和踩坑记录也能帮你少走弯路。我下面会从整体设计思路讲起然后拆解核心细节再给出一套可以直接跑的实操方案最后把我调试过程中遇到的那些“看起来能用但就是不对劲”的问题整理成排查表。全程按我实际项目的做法来讲参数和判断逻辑都会说清楚为什么这么定。2. 整体设计思路为什么选双向联动而不是简单切换2.1 两种常见方案的取舍商品分类页最基础的实现有两种。第一种是点击切换式左边一级分类右边只渲染当前选中分类下的内容点左边某一项右边整个内容区替换掉。这种写法简单数据量小的时候性能也好但问题是用户想从“手机”看到“电脑”再看到“配件”必须点三次而且右边每次都是“跳变”没有连续浏览的流畅感。第二种就是双向联动滚动式右边把所有二级分类按顺序全部渲染出来每个二级分类是一个区块区块之间有明显的标题分隔。用户可以直接在右边一路往下滑滑到哪个区块左边对应的一级分类就高亮。反过来点左边某一项右边自动滚到对应区块的位置。这种方案更接近主流电商 App 的体验用户既能“点”也能“滑”两种操作方式都支持。我最终选第二种核心原因是用户浏览路径更短。分类页的用户目的很明确——找某个具体品类。连续滚动比反复点击更符合“逛”的习惯尤其是二级分类多的时候滚动浏览的效率远高于点击切换。代价是右边要一次性渲染更多节点对性能有一定要求但这个后面有优化手段。2.2 数据结构怎么设计才支撑联动联动的前提是数据能对上号。我用的结构大概是这样的一级分类数组categories每个元素有id、name二级分类按一级分类分组每组有parentId、title、items。渲染的时候右边遍历一级分类每个一级分类下面渲染它对应的二级分组。关键点在于右边每个二级分组的顶部位置必须能算出来或者测出来。因为点击左边时右边要滚到对应位置这个位置就是该一级分类下第一个二级分组的顶部偏移量。我一开始想用固定高度去算结果发现二级分组的标题高度、商品项高度都不完全一致固定高度算出来的偏移量会累积误差滚到后面就偏了。后来改成动态测量页面渲染完成后用createSelectorQuery去查每个分组节点的boundingClientRect把它们的top值存到一个数组里点击时直接取这个数组的值来滚。提示动态测量一定要等节点渲染完成后再执行通常放在onReady或者数据更新后的nextTick里否则查不到节点或者拿到的是旧位置。2.3 联动方向与触发时机的设计联动有两个方向逻辑要分开处理不能混在一起否则会互相触发导致抖动。方向一点左边右边滚。这个由点击事件触发拿到索引后从测量好的位置数组里取出目标scrollTop调用scroll-view的scroll-into-view或者scrollTop属性来滚动。这里我建议用scroll-into-view给每个二级分组一个唯一id直接滚到那个 id省去自己算偏移量。但scroll-into-view有个问题它滚动时也会触发scroll事件如果不加锁就会反过来触发左边高亮的重新计算可能造成高亮跳一下又跳回来。方向二滑右边左边亮。这个由scroll事件触发实时拿到当前scrollTop和测量好的位置数组做比较判断当前落在哪个区间更新左边高亮索引。这个逻辑要加节流不然滚动时触发太频繁性能吃不消。所以整个设计的核心就是两个方向各自有触发源用一个标志位或者时间戳做互斥避免循环触发。这个点在后面实操部分我会给出具体代码。3. 核心细节解析scroll-view 的关键参数与测量逻辑3.1 scroll-view 必须开的几个属性小程序的scroll-view要支持纵向滚动scroll-y必须设为true同时容器要有固定高度否则滚动不起来。我右边区域的高度是calc(100vh - 顶部搜索栏高度)左边同理。这里有个细节如果页面本身也在滚动scroll-view的滚动会和页面滚动冲突所以分类页通常要把页面滚动禁掉让左右两个scroll-view各自独立滚动。另外enhanced属性建议开启开启后滚动性能更好而且支持scroll-anchoring等特性。scroll-with-animation在点击左边滚动右边时建议开启滚动过程有过渡动画体验更顺滑但在用户手动滑动右边时这个属性不影响因为手动滑动本来就是连续的。scroll-view classright-scroll scroll-y enhanced scroll-with-animation scroll-into-view{{scrollIntoView}} bindscrollonRightScroll styleheight: {{rightHeight}}px; !-- 二级分类分组 -- /scroll-view3.2 位置测量createSelectorQuery 的正确用法测量每个二级分组的位置我用的是wx.createSelectorQuery().selectAll(.group-item).boundingClientRect()。这里有个坑selectAll拿到的是一个数组顺序和渲染顺序一致但如果你在数据更新后立刻测量可能拿到的是空数组或者旧数据。我的做法是在setData的回调里用wx.nextTick包一层再测量。wx.nextTick(() { const query wx.createSelectorQuery().in(this); query.selectAll(.group-item).boundingClientRect(rects { this.groupTops rects.map(r r.top); }).exec(); });注意rects里的top是相对于视口的而scroll-view的scrollTop是相对于滚动容器内容顶部的。如果scroll-view本身不在视口顶部这两个值会有偏差。所以更稳妥的做法是测量时同时拿到scroll-view容器的top然后用分组.top - 容器.top得到相对偏移量。我一开始没减这个值结果点击左边滚到的位置总是差一截排查了半天才发现是坐标系没对齐。3.3 高亮判断区间比较而不是相等比较右边滚动时判断当前高亮哪个一级分类不能直接用scrollTop groupTops[i]因为滚动是连续的几乎不可能正好相等。正确做法是找到最后一个groupTops[i] scrollTop的 i。也就是说当前滚动位置落在哪个分组区间内就高亮哪个。onRightScroll(e) { if (this.lockScroll) return; const scrollTop e.detail.scrollTop; let index 0; for (let i 0; i this.groupTops.length; i) { if (scrollTop this.groupTops[i] - 10) { index i; } else { break; } } if (index ! this.activeIndex) { this.setData({ activeIndex: index }); } }那个-10是一个容差值因为滚动位置和测量位置之间可能有几像素的误差加个容差能避免高亮在边界处来回跳。这个值我试过 5、10、20最后定在 10 比较稳太小了容易抖太大了高亮切换会滞后。3.4 互斥锁防止两个方向互相触发这是整个联动里最关键的一环。点击左边时右边会滚动滚动又会触发onRightScroll如果不加锁onRightScroll会重新计算高亮可能把刚点的高亮又改掉。我的做法是加一个lockScroll标志点击左边时设为true滚动动画结束后用setTimeout估算或者监听滚动停止再设为false。onLeftTap(e) { const index e.currentTarget.dataset.index; this.lockScroll true; this.setData({ activeIndex: index, scrollIntoView: group- index }); setTimeout(() { this.lockScroll false; }, 400); }400ms 是滚动动画的大致时长设太短锁还没释放就又被触发设太长用户手动滑动时会被误锁。实测下来 300 到 500 之间都可以我用的 400。4. 实操过程从零搭一个可用的分类页4.1 页面结构与样式布局整个页面分左右两栏左边宽度固定右边自适应。左边每个一级分类是一个view选中态加左边框和背景色。右边每个二级分组包含一个标题和一个商品网格。view classcontainer scroll-view classleft-scroll scroll-y view wx:for{{categories}} wx:keyid classleft-item {{activeIndex index ? active : }} >onLoad() { this.fetchCategories().then(list { this.setData({ categories: list }, () { wx.nextTick(() { this.measureGroups(); }); }); }); }measureGroups里除了测量每个分组的top还要拿到scroll-view容器的top做坐标转换。这一步我踩过坑前面提过不再重复。4.3 点击左边滚动的完整实现点击左边时除了设置scrollIntoView还要立即更新activeIndex让高亮马上响应不用等滚动结束。然后加锁防止滚动事件反向修改高亮。onLeftTap(e) { const index e.currentTarget.dataset.index; if (index this.data.activeIndex) return; this.lockScroll true; this.setData({ activeIndex: index, scrollIntoView: group- index }); clearTimeout(this.unlockTimer); this.unlockTimer setTimeout(() { this.lockScroll false; }, 400); }这里用clearTimeout是为了防止用户快速连点多个定时器叠加导致锁释放时机混乱。4.4 右边滚动时的高亮同步右边滚动时用前面说的区间比较法更新高亮。这里要加节流我用的简单时间戳节流16ms 一次差不多一帧一次既跟手又不至于太频繁。onRightScroll(e) { if (this.lockScroll) return; const now Date.now(); if (now - this.lastScrollTime 16) return; this.lastScrollTime now; const scrollTop e.detail.scrollTop; let index 0; for (let i 0; i this.groupTops.length; i) { if (scrollTop this.groupTops[i] - 10) { index i; } else { break; } } if (index ! this.data.activeIndex) { this.setData({ activeIndex: index }); } }4.5 参数选择与计算过程说明几个关键参数我列一下选择依据。容差值 10px因为测量和实际滚动之间有亚像素误差加上不同机型渲染差异10px 能覆盖大部分情况。锁定时长 400msscroll-with-animation的默认动画时长大约 300ms留 100ms 余量。节流间隔 16ms对应 60fps 的一帧再小没有意义再大会感觉高亮滞后。右边scroll-view的高度计算windowHeight - 搜索栏高度 - 底部安全区。搜索栏我用的 88rpx底部安全区用env(safe-area-inset-bottom)处理。这些值在不同机型上会有差异所以我是动态算的不是写死的。5. 常见问题与排查技巧实录5.1 点击左边后高亮又跳回去这是最典型的问题原因就是滚动事件反向触发了高亮计算。排查思路先确认lockScroll有没有生效在onRightScroll里打印lockScroll的值如果点击后滚动过程中它还是false说明锁没加上或者被提前释放了。常见原因是setTimeout的时长设太短或者有多个定时器叠加。解决办法就是前面说的用clearTimeout清理旧定时器并且把时长设到 400ms 左右。5.2 滚到后面位置越来越偏这是测量误差累积导致的。如果你用固定高度算位置每个分组的实际高度和估算高度有偏差越往后偏差越大。解决办法就是动态测量每个分组的真实top都测出来不要用累加计算。另外测量时记得做坐标系转换减去容器top。5.3 快速滑动时高亮闪烁快速滑动时scroll事件触发非常密集如果每次都setData会造成大量渲染高亮就会闪。解决办法是节流并且只在index真正变化时才setData。我一开始没加index ! activeIndex判断每次滚动都setData不仅闪还卡。5.4 某些机型上 scroll-into-view 不生效scroll-into-view的目标 id 不能以数字开头必须是字母开头。我一开始用id{{index}}在部分机型上不生效改成idgroup-{{index}}就好了。另外scroll-into-view的值变化才会触发滚动如果连续点同一个分类值没变不会重新滚这个符合预期不用处理。5.5 问题速查表问题现象可能原因排查方法解决方式点击后高亮跳回滚动事件反向触发打印 lockScroll加锁并清理定时器越滚越偏固定高度累积误差对比测量值和实际值改动态测量并转换坐标系高亮闪烁setData 过于频繁统计 setData 次数节流并加变化判断scroll-into-view 无效id 以数字开头检查 id 命名改为字母开头右边滚不动容器高度未设置检查 scroll-view 高度动态设置 windowHeight左右滚动冲突页面本身可滚动检查页面配置禁用页面滚动提示调试这类联动问题时最有效的手段是在关键回调里打日志把scrollTop、activeIndex、lockScroll三个值一起打出来一眼就能看出是哪个环节出了问题。5.6 几个我踩过的坑第一个坑是测量时机。我一开始在onShow里测量结果从其他页面返回时数据没变但测量值可能因为布局变化而失效导致点击滚动位置不对。后来改成只在数据首次加载和窗口尺寸变化时测量。第二个坑是长列表性能。二级分类特别多的时候右边一次性渲染几百个节点首次加载会卡。我的优化是给商品项加lazy-load图片懒加载同时用wx:key确保复用。如果分类实在太多可以考虑分段渲染但一般商城分类页几十个分组够用了不至于要上虚拟列表。第三个坑是iOS 和安卓的滚动差异。iOS 上scroll-view的滚动惯性更强scroll事件触发频率也不同。同样的节流参数iOS 上感觉更跟手安卓上稍微滞后一点。这个没有完美方案只能取一个折中值我最后用的 16ms 在两端都还能接受。6. 性能优化与体验打磨的几个细节6.1 减少 setData 的数据量setData是小程序性能的大头。分类页里左边高亮变化只需要改activeIndex一个字段不要每次把整个categories重新 set 一遍。我见过有人为了图省事滚动时把整个数据对象重新赋值结果卡得没法用。记住只 set 变化的那一个字段。6.2 图片懒加载与占位商品项如果有图片一定要开lazy-load并且给图片容器设固定宽高避免图片加载完成后布局跳动导致测量值失效。我一开始没设固定高度图片加载后分组高度变了之前测量的位置全废了点击滚动就偏。后来给每个商品项设了固定高度问题解决。6.3 滚动条隐藏与视觉细节scroll-view默认会显示滚动条在分类页里不太好看。可以用::-webkit-scrollbar { display: none; }隐藏但要注意这在小程序里支持有限更稳妥的做法是给scroll-view加show-scrollbar{{false}}属性。左边选中态我加了一个左侧的竖条和背景色变化视觉上更明显用户一眼就知道当前在哪个分类。6.4 空状态与加载状态分类数据没回来之前右边是空白的体验不好。我加了一个骨架屏用灰色块占位数据回来后再替换。左边如果某个分类下没有二级分类右边对应位置显示“暂无商品”不要让用户以为页面坏了。7. 后续可以怎么扩展这套左右联动的结构稍微改改就能用在很多场景。比如外卖点餐左边是菜品分类右边是菜品列表逻辑完全一样。再比如课程目录左边是章节右边是课时也是同样的联动。甚至设置页面左边是设置项分组右边是具体选项也能套这个模式。如果要做得更细可以加滚动到顶部的悬浮按钮用户滑到很下面时点一下回到顶部。还可以加搜索定位用户搜某个商品直接跳到对应分类并高亮。这些都是在现有联动基础上加一层逻辑核心的测量、滚动、高亮同步机制不用动。我在实际项目里还遇到过一个需求右边滚动时如果某个分组特别长左边高亮会一直停在那个分组上用户会觉得“怎么不动了”。后来我加了一个判断如果当前分组高度超过一屏滚动到该分组一半位置时就提前高亮下一个让用户感觉高亮是跟着内容走的。这个阈值我设的是分组高度的 60%具体值可以根据实际内容调整。最后分享一个小技巧测量位置的时候不要只测一次。如果页面支持横竖屏切换或者用户调整了字体大小布局会变测量值就失效了。可以在onResize里重新测量保证联动始终准确。这个点很多人会忽略但在平板或者折叠屏设备上挺重要的。

相关新闻

图神经网络科研实战:动态图表示学习与推荐系统研究指南

图神经网络科研实战:动态图表示学习与推荐系统研究指南

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

2026/10/14 1:29:08 阅读更多 →
12 种 Prompt 注入实测:零宽字符和 Base64 怎么绕过关键词过滤

12 种 Prompt 注入实测:零宽字符和 Base64 怎么绕过关键词过滤

36 条注入样例,只做原文关键词匹配能抓到 22 条,前面加一层归一化能抓到 27 条。 多抓到的那 5 条,全是在关键词中间动了手脚:塞零宽字符、把拉丁字母换成西里尔同形字、或者整句写成全角。 两条管线在 40 条良性样例上都是 0 误报…

2026/10/14 1:29:08 阅读更多 →
Java并发编程实战:从JMM、CAS到AQS与线程池调优

Java并发编程实战:从JMM、CAS到AQS与线程池调优

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

2026/10/14 1:29:08 阅读更多 →

最新新闻

ISO 15118-20-2022充电协议栈实践:从TLS到EXI的互操作指南

ISO 15118-20-2022充电协议栈实践:从TLS到EXI的互操作指南

简介:ISO 15118-20-2022是国际标准化组织正式发布的电动汽车与电网通信接口标准,聚焦第二代网络层和应用层技术规范,目标人群覆盖充电桩制造商、整车企业、通信协议开发与测试工程师,用于解决车辆与充电设施之间数据互联、身份认证…

2026/10/14 2:08:19 阅读更多 →
智能除冰机器人毕业设计全攻略:从系统架构到代码实现

智能除冰机器人毕业设计全攻略:从系统架构到代码实现

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

2026/10/14 2:08:19 阅读更多 →
Windows批处理脚本语法全解:从变量延迟到避坑实战

Windows批处理脚本语法全解:从变量延迟到避坑实战

简介:这份《Windows命令行(批处理)语法全解》面向需要编写批处理脚本的运维人员、开发者和IT自动化初学者,系统梳理Command shell与PowerShell两大shell的语法体系,解决批处理任务书写时反复翻查资料、命令记不全的痛点。资源为单个PDF文档&a…

2026/10/14 2:08:19 阅读更多 →
Vue移动端个人中心头像上传实战:Vant预览、FormData与FileReader踩坑指南

Vue移动端个人中心头像上传实战:Vant预览、FormData与FileReader踩坑指南

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

2026/10/14 2:08:19 阅读更多 →
Linux命令手册PDF高效速查:从排版逻辑到终端闭环

Linux命令手册PDF高效速查:从排版逻辑到终端闭环

简介:这是一份Linux命令手册PDF,主要面向Linux系统用户、运维人员以及希望系统学习命令行操作的初学者,用于解决日常操作中命令记不住、参数不清楚、排错无依据等问题。资源为1个PDF文件,整体大小1.46MB,内容按系统管理…

2026/10/14 2:08:19 阅读更多 →
node.bcrypt.js 版本演进全解析:从 CHANGELOG 看 bcrypt 密码哈希库的关键修复与架构变迁

node.bcrypt.js 版本演进全解析:从 CHANGELOG 看 bcrypt 密码哈希库的关键修复与架构变迁

密码学 【免费下载链接】node.bcrypt.js bcrypt for NodeJs 项目地址: https://gitcode.com/gh_mirrors/no/node.bcrypt.js 点击查看 免费下载 node.bcrypt.js(npm 包名 bcrypt)是 Node.js 生态中最常用的 bcrypt 密码哈希实现,本…

2026/10/14 2:07:19 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

2026/10/13 16:22:04 阅读更多 →
影刀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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →