自定义轮播图指示器选中颜色可配置化:从Props到渐变过渡全攻略
大部分做前端或移动端的同学几乎都绕不过自定义轮播图指示器这个组件。需求方要的轮播图十有八九不只要求能翻页还会要求自定义指示器样式——尤其是选中颜色的定制。这个需求听起来很小真做起来会发现一堆细节颜色设置不生效、切换没有过渡、指示器状态和数据不同步……我开始做这个改进就是因为模拟项目X里被这个小需求折腾了一个下午。某大佬那版自定义轮播图指示器已经有了很好的框架思路但选中颜色写死在主题色里产品要求换成品牌色渐变还没有外部传参接口。这篇文章我把自己实现选中颜色改进的完整过程讲清楚底层原理是什么、有哪几种改法、每种改法分别踩过什么坑。适合正在手写轮播图组件、或者在做自定义指示器的前端开发同学参考看完可以直接抄作业。1. 需求拆解不只是换个颜色这么简单1.1 原始方案的痛点某大佬那版自定义指示器核心思路是把默认的小圆点替换成完全可控的自定义DOM思路本身没问题。但它在颜色这块处理得比较硬——选中色直接写在样式表里例如写死的#1677ff某个主题蓝。想换颜色就得改组件源码改完可能影响其他使用该组件的页面。更麻烦的是产品提出的需求往往有两种一种是换一个固定颜色另一种是不同页面用不同颜色甚至跟随轮播图每张图片的主题色自动变化。如果你只是改一下CSS变量第一种能应付第二种就无能为力。真正的改进方向应该是颜色作为组件的对外配置项而不是组件的内部常量同时支持选中指示器和未选中指示器的状态区分最好还能带过渡动画。这个认知很关键决定了后面所有代码结构的走向。1.2 为什么这个需求值得单独做一版轮播图指示器的用户体验价值比很多人想象中高。它承担两个任务告诉用户当前在第几页以及暗示你可以点击这里跳转。如果选中颜色不明显用户容易失去位置感如果颜色和整体UI风格不统一又会显得廉价。也就是说这不仅是视觉问题还是交互反馈和数据状态的可读性问题。从工程角度讲选中颜色的可配置化意味着把状态样式从组件内部提升到组件接口这是组件复用性提升的关键一步。改完之后不仅颜色能传还能顺带扩展出尺寸、圆角、间距、动画时长等自定义维度。后续任何页面接入轮播图只需要传入一组配置就能得到风格一致的指示器不需要再复制粘贴改样式。1.3 明确改进边界与验收标准动手前先约定验收标准避免改一半发现方向错了。我的标准是四条选中颜色能从外部传入且不修改组件内部源码未选中颜色独立配置默认半透明白即可切换时有平滑过渡不能闪变点击指示器能正确跳转且颜色状态紧随页面变化这个验收清单在后面每个步骤中都会用到。凡是能同时满足这四点的方案基本就是合格的。如果有一个不满足说明方案选型有问题需要回到设计阶段重新思考。2. 指示器选中状态的底层逻辑2.1 指示器归根结底是什么数据上一组指示器就是当前页码的一个函数。假设轮播图有N张图指示器就有N个小圆点第index页被激活第index个圆点就处于激活态。所谓选中颜色改进本质是修改激活态圆点的样式。搞清楚这个数据流就不会在样式上瞎折腾。这里有个隐含前提你的轮播图必须有一个可靠的当前页码状态。这个状态可以来自组件内部维护的currentIndex也可以来自第三方库比如原生的swiper实例暴露的realIndex。状态来源决定了你要在哪个层面做颜色绑定。如果用的是第三方库的默认指示器那颜色往往只能通过库提供的配置项修改如果用自定义指示器颜色就完全由你掌控。2.2 状态驱动样式类名切换怎么做到无延迟在 Vue 和 React 这类框架下最推荐的做法是状态驱动类名。定义一个currentIndex通过 class 绑定给激活的指示器加一个active类CSS 里写死active类的颜色和过渡属性。这种方案的好处是框架本身的响应式系统会保证状态和DOM同步不会出现数据变了颜色没跟上之类的时序问题。但这里有一个容易被忽略的细节过渡动画的触发条件。CSS 的transition只在样式属性发生变化时触发。如果你的active类切换在同一帧内发生并且两个状态的background-color都定义了那过渡是能正常发生的。反过来如果你的active类切换的同时指示器还被重新渲染了比如用v-if/v-else替换 DOM 节点那过渡就丢了。我见过不少同学因为用v-if控制激活和未激活两种 DOM 节点导致颜色变化永远没有过渡动画就是这个原因。2.3 动画与渲染为什么 transition 和 DOM 复用缺一不可要让颜色过渡平滑需要满足两个条件第一指示器节点全程复用不能因为状态变化被销毁重建第二颜色属性写在同一个元素上靠类名切换触发transition。这也解释了为什么前面强调要状态驱动类名而不是状态驱动DOM替换。如果用的是原生组件的轮播图比如小程序自带的swiper组件它的默认指示器不一定暴露样式接口。indicator-dots属性只能控制显示和隐藏indicator-color和indicator-active-color在多数场景下是可以设置的但粒度有限——不能做渐变、胶囊、数字角标这类高阶样式。这也是很多人选择自定义指示器的原因只有自己掌控指示器的 DOM 结构才能自由控制类名和样式。2.4 原生指示器 vs 自定义指示器原生指示器能快速开箱即用但默认样式实在有限。自定义指示器把这些限制全部打破代价是你需要自己维护当前页码状态并手动设置轮播容器的current属性让指示器状态和轮播图滚动位置保持双向同步。具体来说轮播图滚动时要监听事件更新currentIndex点击指示器时要反向设置轮播图的滚动位置。这个双向同步是自定义指示器方案里最容易被忽视、也最容易出问题的部分后面实操章节会专门讲。3. 改进方案的三种思路3.1 思路ACSS变量方案——最轻量如果指示器已经支持类名区分选中/未选中最简单的方式是定义 CSS 变量然后在组件根节点覆盖变量。比如.carousel-dot { width: 8px; height: 8px; border-radius: 50%; background-color: var(--dot-color, rgba(255, 255, 255, 0.6)); transition: background-color 0.3s ease; } .carousel-dot.active { background-color: var(--dot-active-color, #1677ff); }使用的时候只需要在轮播图容器上设置.my-carousel { --dot-active-color: #ff6a00; }这个方案几乎不需要改动 JS纯 CSS 层面就完成了。优点是风险极低、对组件侵入性几乎为零缺点是不能做更复杂的逻辑比如不同页面显示不同颜色——CSS 变量只能在固定层级下统一覆盖运行时动态切换需要额外借助内联 style 覆盖。3.2 思路B组件 Props 传参方案——最符合工程习惯第二种做法是把颜色提升为组件的 props 配置。让组件对外暴露indicatorColor和indicatorActiveColor两个属性内部通过内联样式绑定到指示器节点上。这个方案改动也不大但比 CSS 变量更进一步你可以在运行时根据条件动态传入不同颜色。比如某个活动页的轮播指示器用红色另一个品牌页用蓝色调用方只需要传不同的属性值组件内部逻辑完全不用动。Props 方案还带来一个额外好处可以顺带把其他样式维度也参数化比如选中时的缩放比例、圆角大小、指示器间距等。一旦走上这条路组件的复用性会明显提升后续扩展成本很低。3.3 思路C真·自定义渲染方案——适合高阶需求如果你需要的不是换颜色而是彻底重定义指示器形态比如胶囊进度条、数字页码、缩略图列表那就要在 B 方案基础上增加一个插槽slot让调用方完全控制指示器的渲染结构组件只负责提供currentIndex和onChange回调。这个方案灵活性最高但实现成本也最高不适合只改颜色的场景。三种方案对比方案改动成本灵活性适配场景CSS变量最低中团队统一换色、全局主题Props传参中较高不同页面不同颜色、需要动态变化自定义渲染高最高彻底重定义指示器形态我的建议很明确90% 的场景用 B 方案就够了。CSS 变量适合做团队级统一换色自定义渲染适合做产品级创新交互而 Props 传参是性价比最高的中间路线。4. 实操在模拟项目X中完成选中颜色改进4.1 先用 Props 方案重写组件接口结合某大佬原方案和上面的对比我最终选了Props 传参 可选插槽的组合路线。这样既解决了选中颜色外部传入的核心需求又保留了未来扩展形态的空间。组件的核心逻辑用 Vue 3 写出来是这样的script setup import { ref } from vue const props defineProps({ items: { type: Array, required: true }, // 指示器未选中颜色 indicatorColor: { type: String, default: rgba(255, 255, 255, 0.6) }, // 指示器选中颜色 indicatorActiveColor: { type: String, default: #1677ff }, // 选中时放大比例 indicatorActiveScale: { type: Number, default: 1.3 } }) const currentIndex ref(0) const dotStyle (index) { if (index currentIndex.value) { return { backgroundColor: props.indicatorActiveColor, transform: scale(${props.indicatorActiveScale}) } } return { backgroundColor: props.indicatorColor } } const jumpTo (index) { currentIndex.value index } /script模板部分注意同一个节点、类名切换的原则template div classcarousel div classcarousel-track reftrackRef scrollonScroll slot nameslides :itemsprops.items :currentcurrentIndex img v-foritem in props.items :keyitem.id :srcitem.image classcarousel-slide / /slot /div div classcarousel-dots span v-for(item, index) in props.items :keyitem.id classcarousel-dot :class{ active: index currentIndex } :styledotStyle(index) clickjumpTo(index) /span /div /div /template这里有一个关键点指示器的样式用了内联 style 绑定但切换动画不能只靠内联 style。内联样式改变时CSS 的transition同样会触发但前提是内联 style 绑定的属性值在连续渲染间发生了数值变化。比如你在active时把backgroundColor从白色变成红色transition是生效的。但如果你的active类本身带着一个background-color而内联 style 也设置了一个background-color内联样式的优先级更高会覆盖类名里的颜色设置。所以我推荐二选一要么全部用类名CSS变量控制要么全部用内联 style 控制不要混用。4.2 渐变与多色场景的扩展产品后续提了一个需求选中颜色要做成渐变。如果只是纯色上面的写法就够了渐变需要利用background: linear-gradient。但这里有个坑transition对渐变不支持平滑过渡。从纯色渐变到另一个渐变背景是直接跳变的没有中间帧。解决思路有两个。第一用background-color作为过渡层配合一个渐变遮罩。比如指示器形状是小圆点圆点内部的渐变可以通过伪元素实现选中的颜色切换用box-shadow或者缩放动画来掩盖背景跳变。第二放弃背景渐变过渡改成透明度淡入淡出 缩放的组合动画。视觉上用户感知到的是大小和透明度的变化即使渐变本身是瞬变的整体看起来依然平滑。我实际选了第二个方案因为实现简单、稳定性高。核心改动是给active指示器增加一个渐变的背景声明同时用opacity和transform模拟过渡。.carousel-dot { opacity: 0.6; transform: scale(1); transition: opacity 0.3s ease, transform 0.3s ease; } .carousel-dot.active { opacity: 1; transform: scale(1.3); background: linear-gradient(135deg, #ff9a56, #ff6a00); }这个改动虽然简单但效果实测挺好。颜色变的瞬间没有明显的跳变感因为渐变本来就在那里只是从半透明变不透明。用户感知上会认为颜色是慢慢出现的实际上只是透明度在过渡。4.3 双向同步轮播滚动与指示器状态联动自定义指示器的另一个核心点是当用户滑动轮播图时指示器的选中颜色要跟着动。这个联动如果做不好会出现颜色停在第1个点页面已经滑到第3张的尴尬。在 Vue 里我们要监听轮播容器的滚动位置来计算当前页码const trackRef ref(null) const onScroll () { const track trackRef.value if (!track) return const scrollLeft track.scrollLeft const width track.clientWidth // 关键用 Math.round 而不是 Math.floor const index Math.round(scrollLeft / width) if (index ! currentIndex.value) { currentIndex.value index } }然后传给轮播容器的事件div classcarousel-track reftrackRef scrollonScroll 这里要留意一个边界快速滑动时scroll事件会高频触发用Math.round的结果可能出现抖动因为滚动位置在页面宽度的一半附近徘徊时四舍五入的结果会来回切换。更好的做法是节流或者用scrollend事件。现代浏览器里scrollend已经支持得比较好了可以写成const onScrollEnd () { const track trackRef.value if (!track) return currentIndex.value Math.round(track.scrollLeft / track.clientWidth) }如果兼容性要求高再配合setTimeout做防抖滚动停止后 100ms 再计算一次最终页码。这里还涉及一个点击跳转的问题当用户点击指示器时需要让轮播容器的滚动位置也同步过去。在原生滚动容器里可以这样const jumpTo (index) { const track trackRef.value if (!track) return currentIndex.value index track.scrollTo({ left: index * track.clientWidth, behavior: smooth }) }4.4 完整组件示例与调用方式到这里把前面内容整理成一个可跑通的完整示例。为了让调用方真正能不用改组件源码就换色我把轮播图封装成独立组件调用方式如下template CustomCarousel :itemsbannerList indicator-colorrgba(255, 255, 255, 0.5) indicator-active-color#ff6a00 :indicator-active-scale1.4 / /template script setup const bannerList [ { id: 1, image: /images/banner1.jpg, title: 活动一 }, { id: 2, image: /images/banner2.jpg, title: 活动二 }, { id: 3, image: /images/banner3.jpg, title: 活动三 } ] /script这样就实现了某大佬方案里写死的选中颜色到外部可配置的改进。组件内部无论怎么升级样式都不会影响调用方的颜色定制。我在模拟项目X中实际接入后发现后面所有页面都不需要动组件源码只改两行属性就能适配不同视觉风格维护成本下降得很明显。5. 踩坑实录与排查建议5.1 高频问题速查表现象可能原因解决办法颜色传了但不变内联 style 优先于 CSS 类统一用内联 style 或 CSS 变量不要混用切换没有过渡动画指示器被 v-if/v-else 重建改为类名切换同一节点选中态和滚动位置不一致scroll 计算不准或未绑定事件监听 scroll/scrollend 并节流防抖点击指示器不跳转轮播容器没有 scroll-behavior加 smooth 滚动或手动设置 scrollLeft颜色闪烁图片加载完成后轮播尺寸变化固定容器宽高或监听 resize 后重置位置渐变色没有过渡效果transition 不支持渐变插值用透明度缩放组合动画掩盖瞬变5.2 独家避坑关于 active 类名的优先级在写类名时要注意 CSS 的优先级计算。我第一次调试时把active类的颜色写在.carousel-dot.active里未选中状态的颜色写在.carousel-dot里结果active颜色一直不生效。原因是后面加载的公共样式里有个更高优先级的选择器比如.carousel .dots .dot.active把颜色覆盖了。排查方式很简单浏览器开发者工具里看样式计算找到是谁覆盖了你的颜色声明然后针对性提升优先级或者把颜色相关属性全部收敛到内联 style 里。如果你想写.carousel-dot.active记得前面带上父级选择器提高权重比如.carousel-dots .carousel-dot.active。5.3 独家避坑渐变色的变色方案如果你也遇到渐变不支持过渡的需求可以试试这个组合指示器常态下的背景是透明或半透明激活时的背景是渐变同时过渡属性只写在opacity和transform上。这样颜色虽然是从无到有直接出现但用户的注意力被大小和透明度变化吸引不会注意到颜色瞬变。如果你的场景对视觉要求极高可以用一个额外的渐变层做opacity过渡但成本偏高大部分项目不划算。我实测下来透明度缩放组合在移动端和桌面端的表现都很稳定不需要额外处理兼容性。5.4 避坑轮播容器宽度变化导致指示器错位轮播图容器在图片加载完成前高度可能是 0导致滚动宽度计算不准确指示器差距很大。解决办法是给轮播容器设置固定的宽高或者监听图片加载完成后重新计算scrollWidth / clientWidth。另外如果项目用了懒加载还要考虑图片加载后容器宽度变化对当前页码的影响必要时需要重置滚动位置。最后聊一点我的体会。轮播图指示器的选中颜色听起来只是一行 CSS 的事但真正把它做成可配置、可扩展的组件接口后省下的时间是长期的。我在模拟项目X里一开始直接在原来的组件上改颜色结果产品需求一变又得改回源码。重构为 Props 传参后后续所有页面接入轮播图只需要传不同的色值就行组件本身再也没有动过。如果你也想做类似的改进我建议从Props 类名切换起步不要一上来就上插槽和自定义渲染。先把基础状态流转和样式配置理清楚再考虑高阶形态。后面即使要支持渐变、胶囊、缩略图也只是在这个框架上做加法。这个组件我已经用了两个项目踩过的坑基本都沉淀在前面几个小节里希望对你有用。

相关新闻

神经网络基础:MSE、MAE与交叉熵三种损失函数详解

神经网络基础:MSE、MAE与交叉熵三种损失函数详解

神经网络基础知识及三种损失函数计算方法我见过太多刚入门的朋友,GPU还没跑热乎就急着上大模型,结果连损失函数打印出来的数字在说什么都搞不清楚。模型训不出来,第一反应是换网络结构、调学习率,很少有人会回头想一个问题&#x…

2026/10/18 11:46:10 阅读更多 →
基于知识图谱的豆瓣书籍推荐可视化与问答系统实战

基于知识图谱的豆瓣书籍推荐可视化与问答系统实战

简介:面向大二课程设计的完整项目,基于知识图谱实现豆瓣书籍推荐可视化与智能问答,适合计算机、人工智能、通信工程等专业学生用于课程设计、毕业设计或知识图谱入门进阶。项目覆盖数据爬取、知识三元组构建、图数据库存储、前端可视化与问答…

2026/10/18 11:46:10 阅读更多 →
GooseFS元数据发现:让缓存服务主动感知底层存储

GooseFS元数据发现:让缓存服务主动感知底层存储

最近 GooseFS 社区发布了元数据发现功能,这个动作看着不大,但实际意义可能比大多数人想的要深。它把缓存服务从「被动等请求」往前推了一大步,开始主动感知底层存储里的数据长什么样。对于跑过分布式训练、做过大数据平台加速、被海量小文件拖…

2026/10/18 11:46:10 阅读更多 →

最新新闻

用户友好提示词设计指南:从原理到实战的完整方法论

用户友好提示词设计指南:从原理到实战的完整方法论

我做了两年多的提示词设计工作,中间帮不少团队搭建过面向终端用户的大模型应用,也和很多工程师争论过“提示词到底算不算代码”。我个人的结论是:提示词确实不算传统意义上的代码,但它一定是需要结构化设计的工程产物。一个用户友…

2026/10/18 12:47:36 阅读更多 →
用Inception-V3迁移学习实战CIFAR-10图像分类

用Inception-V3迁移学习实战CIFAR-10图像分类

1. 项目概述与方案选型1.1 核心需求解析:CIFAR-10 分类到底难在哪CIFAR-10 数据集在计算机视觉领域的分量不用多提,搞过图像分类的朋友基本都会跟它打过照面。这个数据集包含 60000 张 3232 的彩色图像,分为 10 个类别:飞机、汽车…

2026/10/18 12:47:36 阅读更多 →
OpenCode 中立开源:把 Claude Code 的 settings 改到 TaoToken 的实践大纲

OpenCode 中立开源:把 Claude Code 的 settings 改到 TaoToken 的实践大纲

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

2026/10/18 12:47:36 阅读更多 →
论文AI率过高?从检测原理到降AI率实战全攻略

论文AI率过高?从检测原理到降AI率实战全攻略

上周还有个读者跑来问我:用DeepSeek把论文大纲一搭,豆包再帮忙补几段正文,两小时凑出五千字初稿,兴冲冲上检测平台一查,AI率直接飙到70%。他当场就慌了,问我还有没有办法在交稿前把数字压下来。这个场景我见…

2026/10/18 12:47:36 阅读更多 →
AI代码过载自救指南:用TaoToken统一通道给Cursor与Cline MCP做一次可维护性体检

AI代码过载自救指南:用TaoToken统一通道给Cursor与Cline MCP做一次可维护性体检

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

2026/10/18 12:47:36 阅读更多 →
YOLOv5单目测距原理:从像素高度到实际距离的几何推导

YOLOv5单目测距原理:从像素高度到实际距离的几何推导

简介:本资源是一套基于PyTorch实现YOLOv5目标检测与单目测距融合的完整Python工程,面向计算机视觉初学者及有一定深度学习基础的开发者,解决单摄像头场景下实时目标检测与距离估算的实际问题,适用于智能监控、辅助驾驶、机器人避障…

2026/10/18 12:46:36 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →