多行文本溢出省略:从CSS原理到工程实践的完整指南

1. 文本截断这件事,远比想象中复杂

做前端这些年,被问得最多的问题里,“怎么让文字只显示两行,多了就点点点”绝对排得进前十。看起来是个小需求,但真动手写的时候,你会发现坑一个接一个:单行截断一行 CSS 就搞定,多行截断却要考虑浏览器兼容、中英文混排、响应式布局、动态内容高度抖动,甚至还要处理用户缩放字体后的表现。我见过不少项目在这上面翻车——要么省略号位置不对,要么第二行文字被裁掉一半,要么在某个浏览器上直接不生效。

这篇文章就是把这个需求彻底讲透。不管你是刚入行的新手,还是写了几年 CSS 想查漏补缺的老手,看完都能直接抄作业。我会从最基础的属性讲起,把每种方案的适用场景、参数含义、踩坑记录都摊开说,最后给出一套我实际项目里用了很久的稳定方案。

核心关键词就一个:多行文本溢出省略。说白了就是让一段文字在固定行数内显示,超出部分用省略号收尾。听起来简单,但要做到“所有浏览器表现一致、内容动态变化时不崩、性能不拖后腿”,需要理解几个关键 CSS 属性的配合逻辑。

2. 先搞清楚浏览器是怎么处理文本溢出的

2.1 单行截断为什么那么简单

单行文本溢出省略的写法大家应该都熟:

.single-line { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

这三行代码各司其职。white-space: nowrap强制文本不换行,把所有内容挤到一行里;overflow: hidden把超出容器宽度的部分裁掉;text-overflow: ellipsis告诉浏览器,被裁掉的地方用省略号表示。浏览器渲染引擎在处理这个组合时,会先计算文本总宽度,超出容器就触发裁剪,然后在裁剪边界处画三个点。

这套机制之所以简单,是因为单行场景下文本的布局方向是线性的,浏览器只需要在水平方向做一次判断。但多行就不一样了,文本会折行,每一行的高度、每行能放多少字符都是动态计算的,浏览器需要知道“第几行是最后一行”才能决定在哪里放省略号。

2.2 多行截断的核心难点在哪里

多行文本溢出省略的难点可以归结为三个问题。

第一个问题是行数判定。浏览器必须准确知道容器能容纳几行文本,以及当前内容实际占了几行。这涉及到行高(line-height)和容器高度(height或max-height)的精确配合。如果行高是1.5,字体大小是16px,那么每行实际占24px,容器高度设为48px就能正好显示两行。但这里有个隐患:如果字体大小被用户调整,或者用了相对单位,计算就会偏移。

第二个问题是省略号定位。单行截断时省略号固定在行尾,多行截断时省略号要出现在最后一行的末尾。浏览器需要先确定最后一行的内容范围,再在末尾插入省略号。这个过程在不同浏览器里的实现细节不一样,导致了一些兼容性差异。

第三个问题是内容动态性。实际项目里文本内容往往是从接口获取的,长度不固定。如果容器高度写死,短文本会留白,长文本截断位置可能不理想。更麻烦的是,如果容器宽度随屏幕变化,行数也会变,固定高度的方案就会失效。

理解了这三个难点,再看各种实现方案,就能明白它们各自在解决什么问题、又引入了什么新问题。

3. 主流方案逐一拆解与参数详解

3.1 方案一:-webkit-line-clamp 标准写法

这是目前最常用的方案,代码量最少:

.multi-line-ellipsis { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; }

逐行解释一下。display: -webkit-box把元素变成弹性盒子的一种旧式变体,这是-webkit-line-clamp生效的前提。-webkit-box-orient: vertical指定子元素垂直排列,也就是文本从上往下排。-webkit-line-clamp: 2是核心,告诉浏览器最多显示两行,超出部分截断。overflow: hidden负责把截断后的内容藏起来。

这套写法的优点是简洁、性能好、浏览器原生支持。缺点是依赖-webkit-前缀,虽然现在主流浏览器都支持了,但在一些老版本或非主流内核上可能不生效。另外,它要求容器必须有确定的宽度,否则行数计算会出问题。

实际使用时有几个细节要注意。第一,-webkit-line-clamp的值必须是整数,写2.5是无效的。第二,如果容器同时设置了padding,截断位置可能会把 padding 也算进去,导致实际显示行数比预期少。第三,这个方案对display的值有要求,如果元素本身是inline或inline-block,需要先改成block或flex之类的块级显示。

提示:-webkit-line-clamp虽然带前缀,但现在已经进入标准草案,可以放心用在生产环境。如果项目需要支持非常老的浏览器,可以配合降级方案使用。

3.2 方案二:max-height 配合伪元素模拟

这个方案不依赖-webkit-line-clamp,兼容性更好,但代码量多一些:

.fallback-ellipsis { position: relative; max-height: 48px; line-height: 24px; overflow: hidden; } .fallback-ellipsis::after { content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 8px; background: linear-gradient(to right, transparent, #fff 40%); }

思路是用max-height限制容器最大高度,line-height乘以行数就是max-height的值。超出部分被overflow: hidden裁掉,然后用::after伪元素在右下角画一个省略号。伪元素的背景用渐变从透明过渡到白色,盖住最后几个字符,视觉上看起来像是文字自然截断。

这个方案的优点是兼容性极好,几乎所有浏览器都能跑。缺点是省略号是“贴”上去的,不是浏览器原生渲染的,所以位置可能不够精准。如果最后一行文字刚好在省略号位置有内容,会被渐变背景遮住,看起来有点突兀。另外,如果容器背景不是白色,渐变颜色需要跟着调整。

我一般把这个方案作为降级方案,在-webkit-line-clamp不生效时启用。可以通过@supports查询来判断:

@supports (-webkit-line-clamp: 2) { .ellipsis { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; } }

这样支持-webkit-line-clamp的浏览器用原生方案,不支持的用伪元素方案,各取所长。

3.3 方案三:JavaScript 动态计算截断

有些场景下 CSS 方案搞不定,比如需要精确控制省略号位置、或者容器高度是动态计算的。这时候可以用 JavaScript 来算:

function truncateText(element, maxLines) { const lineHeight = parseFloat(getComputedStyle(element).lineHeight); const maxHeight = lineHeight * maxLines; const text = element.textContent; if (element.scrollHeight <= maxHeight) return; let low = 0; let high = text.length; while (low < high) { const mid = Math.floor((low + high + 1) / 2); element.textContent = text.slice(0, mid) + '...'; if (element.scrollHeight > maxHeight) { high = mid - 1; } else { low = mid; } } element.textContent = text.slice(0, low) + '...'; }

这段代码用二分查找来确定截断位置。先算出最大高度,然后不断尝试不同长度的文本,看哪个长度刚好不超过最大高度。二分查找的效率是 O(log n),对于一般长度的文本来说性能可以接受。

这个方案的优点是控制精度高,可以实现一些 CSS 做不到的效果,比如在省略号前保留特定字符、或者根据内容类型调整截断策略。缺点是代码复杂、需要处理窗口 resize 事件、而且在服务端渲染场景下会有闪烁问题。

注意:用 JavaScript 截断时,一定要在文本内容变化后重新计算。如果用了前端框架,可以在updated或useEffect里调用截断函数。另外,记得用requestAnimationFrame节流 resize 事件,避免频繁重排。

4. 实际项目中的完整实现与参数计算

4.1 行高与容器高度的精确配合

不管用哪种方案,行高和容器高度的配合都是基础。假设设计稿要求显示两行,字体大小14px,行高1.5,那么:

  • 每行高度 = 14 × 1.5 = 21px
  • 两行总高度 = 21 × 2 = 42px

容器高度可以设为42px,或者用max-height: 42px配合line-height: 21px。这里建议用max-height而不是height,因为短文本时容器可以自适应收缩,不会留出空白。

如果用了-webkit-line-clamp,其实不需要显式设置高度,浏览器会根据行数自动计算。但为了布局稳定,建议还是给一个max-height作为兜底,防止某些浏览器计算偏差导致容器被撑开。

实际写的时候可以这样:

.card-title { font-size: 14px; line-height: 1.5; max-height: 42px; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; word-break: break-all; }

word-break: break-all是为了处理长英文单词或连续数字的情况。默认情况下,浏览器不会在单词中间断行,如果一个单词特别长,可能会把容器撑破。加上这个属性后,长单词会在任意字符处断行,保证截断效果。

4.2 中英文混排的坑与处理

中文和英文的断行规则不一样。中文可以在任意字符处断行,英文通常以单词为单位断行。当中英文混在一起时,可能出现英文单词被挤到下一行、导致行数计算不准的情况。

举个例子,容器宽度刚好能放下 10 个中文字符,但第 11 个位置是一个英文单词的开头。浏览器会把整个英文单词移到下一行,导致第一行只显示了 10 个中文字符,第二行开头是英文单词。如果这个英文单词很长,可能第二行也放不下,又移到第三行,最终显示行数超出预期。

处理这个问题有两个思路。一是用word-break: break-word或overflow-wrap: break-word,允许在单词内部断行,但只在必要时才断。二是用hyphens: auto配合lang属性,让浏览器自动加连字符断词。前者更通用,后者更美观但需要语言支持。

我一般用overflow-wrap: break-word,它在大多数场景下表现最好。word-break: break-all虽然更激进,但会把所有单词都拆开,影响可读性,只在极端情况下用。

4.3 响应式场景下的行数适配

移动端和桌面端的容器宽度不同,同样的文本可能在一端显示两行,在另一端显示三行。如果设计稿要求“最多两行”,那在窄屏上可能需要调整字体大小或容器宽度。

一种做法是用媒体查询:

.ellipsis { -webkit-line-clamp: 2; } @media (max-width: 768px) { .ellipsis { -webkit-line-clamp: 3; font-size: 13px; } }

另一种做法是用clamp()函数动态调整字体大小:

.ellipsis { font-size: clamp(12px, 2vw, 16px); -webkit-line-clamp: 2; }

这样字体大小会随视口宽度变化,行数相对稳定。但要注意,clamp()的中间值用vw单位时,在极端窄屏或宽屏上可能超出预期范围,需要配合min和max限制。

实际项目里我倾向于用媒体查询,因为控制更精确,调试也方便。clamp()适合对精度要求不高的场景。

5. 常见问题排查与避坑指南

5.1 省略号不显示或显示位置不对

这是最常见的问题。可能的原因有几种。

第一种是display值不对。-webkit-line-clamp要求元素的display是-webkit-box或-webkit-inline-box。如果元素被其他样式覆盖成了block或flex,截断就会失效。排查方法是打开开发者工具,看计算后的display值是什么。

第二种是overflow被覆盖。有些 CSS 框架或重置样式会把overflow设为visible,导致超出内容没有被裁掉。需要确保overflow: hidden生效。

第三种是容器高度不够。如果max-height设得太小,比如只够显示一行,但-webkit-line-clamp设的是 2,浏览器可能无法正确计算截断位置。这时候需要调整max-height或去掉它,让浏览器自己算。

第四种是padding干扰。如果容器有padding-bottom,截断位置可能会把 padding 算进去,导致省略号被推到容器外面。解决办法是用box-sizing: border-box,或者把 padding 移到外层容器上。

5.2 动态内容更新后截断失效

在单页应用里,文本内容经常是异步加载的。如果内容更新后没有重新触发截断计算,可能会出现截断失效或省略号位置错误的情况。

对于-webkit-line-clamp方案,浏览器会在内容变化后自动重新计算,一般不需要额外处理。但如果用了 JavaScript 截断方案,就需要在内容更新后手动调用截断函数。

还有一个隐藏问题:如果文本内容是从display: none切换到display: block,浏览器可能在元素不可见时无法正确计算行高,导致截断结果不对。解决办法是在元素可见后再执行截断,或者用visibility: hidden代替display: none来保持布局计算。

5.3 性能问题与优化建议

-webkit-line-clamp的性能很好,因为它是浏览器原生实现的,不需要 JavaScript 参与。但如果页面上有大量需要截断的元素,比如一个列表渲染了几百个卡片,每个卡片都有多行截断,可能会触发频繁的重排和重绘。

优化思路有几个。一是用contain: content或contain: layout限制元素的布局影响范围,减少重排开销。二是用虚拟列表,只渲染可视区域内的元素。三是避免在滚动或 resize 事件里频繁读取scrollHeight等布局属性,这些操作会强制浏览器同步计算布局,导致性能下降。

如果用了 JavaScript 截断方案,二分查找的次数可以优化。对于一般长度的文本,二分查找大概需要 10 到 15 次迭代,每次迭代都会修改 DOM 并读取scrollHeight,开销不小。可以先用一个粗略估算缩小范围,再用二分查找精确定位。

5.4 常见问题速查表

问题现象可能原因解决方法
省略号完全不显示display值不是-webkit-box检查并修正display属性
省略号位置偏上或偏下line-height与容器高度不匹配调整line-height或max-height
第二行文字被裁掉一半容器高度不是行高的整数倍确保max-height是line-height的整数倍
长英文单词撑破容器没有设置断词属性加overflow-wrap: break-word
动态内容更新后截断失效没有重新计算内容更新后调用截断函数或触发重排
移动端行数比预期多容器宽度变化导致折行用媒体查询调整行数或字体大小
省略号被 padding 遮挡padding参与了截断计算用box-sizing: border-box或调整 padding 位置

6. 我实际项目里的稳定方案与经验总结

经过多个项目的迭代,我现在用的方案是这样的:

.text-ellipsis-2 { display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2; overflow: hidden; text-overflow: ellipsis; word-break: break-word; overflow-wrap: break-word; max-height: 3em; line-height: 1.5; }

这里max-height: 3em是一个兜底,3em在line-height: 1.5的情况下大约等于两行的高度。text-overflow: ellipsis虽然对多行截断不是必需的,但加上它可以兼容一些特殊场景。word-break和overflow-wrap双保险,确保长单词不会撑破容器。

如果项目需要支持非常老的浏览器,我会加一个@supports降级:

@supports not (-webkit-line-clamp: 2) { .text-ellipsis-2 { position: relative; max-height: 3em; overflow: hidden; } .text-ellipsis-2::after { content: "..."; position: absolute; bottom: 0; right: 0; padding-left: 1em; background: linear-gradient(to right, transparent, #fff 50%); } }

这样新浏览器用原生方案,老浏览器用伪元素方案,覆盖率达到 99% 以上。

最后分享几个我踩过的坑。第一,不要用height代替max-height,除非你确定所有文本都足够长。第二,-webkit-line-clamp的值不要动态改,如果需要在不同断点显示不同行数,用媒体查询覆盖整个样式块,而不是只改行数值。第三,测试的时候一定要用真实数据,不要用“测试文本”这种短字符串,否则看不出截断效果。第四,如果容器有背景色或边框,记得检查省略号区域的视觉效果,伪元素方案的渐变背景可能需要调整颜色。

这个需求看起来小,但细节很多。把上面这些点都考虑到,基本就能覆盖绝大多数场景了。

相关新闻

前端下拉数据缓存策略:从Map到LRU的实战指南

前端下拉数据缓存策略:从Map到LRU的实战指南

做前端时间长了&#xff0c;你会发现下拉框这个东西看起来不起眼&#xff0c;但却是最容易翻车的地方。尤其是带远程搜索的下拉框&#xff0c;用户每敲一个关键词&#xff0c;后端就重新查一遍&#xff0c;下拉列表就重新渲染一遍。看起来没啥&#xff0c;但在低端手机上&#…

2026/10/20 10:37:20 阅读更多 →
Jessibuca 教程:5 分钟跑通无插件 H5 直播播放器,延迟压进 1 秒

Jessibuca 教程:5 分钟跑通无插件 H5 直播播放器,延迟压进 1 秒

Jessibuca 教程&#xff1a;5 分钟跑通无插件 H5 直播播放器&#xff0c;延迟压进 1 秒 【免费下载链接】jessibuca Jessibuca是一款开源的纯H5直播流播放器 项目地址: https://gitcode.com/GitHub_Trending/je/jessibuca Jessibuca 是一款开源的纯 H5 直播流播放器&…

2026/10/20 10:37:20 阅读更多 →
高校就业管理系统:基于状态机的Spring Boot+Vue高分毕设实战

高校就业管理系统:基于状态机的Spring Boot+Vue高分毕设实战

简介&#xff1a;这是一套面向计算机专业本科生的高质量毕业设计项目资源&#xff0c;基于Spring Boot后端与Vue.js前端构建的学生就业管理系统&#xff0c;完整覆盖毕设全流程需求&#xff0c;包括系统开发、论文撰写与答辩展示。资源包含923个文件&#xff0c;涵盖179个Java后…

2026/10/20 10:36:18 阅读更多 →

最新新闻

TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

TensorFlow鞋类识别实战:Fashion MNIST图像分类全流程

前段时间重新整理之前的深度学习实验笔记&#xff0c;翻到鞋类识别&#xff08;Fashion MNIST&#xff09;这个项目时&#xff0c;觉得特别值得拿出来单独写一篇。原因很简单&#xff1a;很多人入门深度学习时&#xff0c;都会被建议先跑通手写数字识别&#xff08;MNIST&#…

2026/10/20 20:57:37 阅读更多 →
用AI辅助Kamailio路由排错:一场人机讨论实录与故障切换实践

用AI辅助Kamailio路由排错:一场人机讨论实录与故障切换实践

最近接手一套老的SIP通信平台&#xff0c;核心信令是Kamailio撑着。业务要新增一个较复杂的路由策略&#xff1a;同一个主叫号码&#xff0c;在不同时间段、针对不同被叫前缀&#xff0c;要分别走不同的网关&#xff1b;而其中一路网关做故障切换时&#xff0c;还要保证已经建立…

2026/10/20 20:57:37 阅读更多 →
LibVLC轻量级视频播放模块:嵌入C/C++工程的硬件解码方案

LibVLC轻量级视频播放模块:嵌入C/C++工程的硬件解码方案

简介&#xff1a;本资源是一份基于C/C与VLC开源库开发Windows视频播放器的完整工程实践包&#xff0c;面向具备基础C编程能力、希望掌握多媒体开发技能的中级开发者及高校课程设计学习者。资源聚焦于在Visual Studio 2022环境下集成libvlc实现视频加载、播放控制、窗口渲染等核…

2026/10/20 20:57:37 阅读更多 →
AI Agent创业团队如何配置一支高效的Harness Engineering团队

AI Agent创业团队如何配置一支高效的Harness Engineering团队

1. 为什么需要一支专门的Harness Engineering团队先从一个很现实的场景说起&#xff1a;你所在的创业团队花三个月做出了一个基于大模型的Agent产品Demo&#xff0c;演示给投资人看时效果炸裂&#xff0c;但真正进入客户试用阶段&#xff0c;问题接踵而来——模型给出正确意图却…

2026/10/20 20:57:37 阅读更多 →
视觉语言模型与RGB-D感知融合:三条进化主线与工程实践

视觉语言模型与RGB-D感知融合:三条进化主线与工程实践

1. 从 Transformer 到多模态感知的演进逻辑视觉语言模型和 RGB-D 感知这两个方向&#xff0c;过去几年基本是各走各的路。做 VLM 的人盯着图文对齐、指令跟随、视觉问答这些任务&#xff0c;做 RGB-D 的人则埋头于点云配准、深度补全、SLAM 建图。但最近一年&#xff0c;这两条…

2026/10/20 20:57:37 阅读更多 →
VTI介质地震波数值模拟:MATLAB实现与各向异性正演避坑指南

VTI介质地震波数值模拟:MATLAB实现与各向异性正演避坑指南

简介&#xff1a;这份资源面向地震勘探与地球物理方向的学习者和研究者&#xff0c;提供一套基于Matlab的VTI介质地震波场数值模拟程序&#xff0c;用于分析各向异性介质中地震波的传播规律。VTI介质在垂直与平行层理方向上纵波速度存在差异&#xff0c;是实际地壳中常见的各向…

2026/10/20 20:56:32 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* 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 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* 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 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* 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 1:01:30 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#xff0c;你会发现一个很有意思的现象&#xff1a;每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型&#xff0c;有人指的是运动控制系统&#xff0c;还有人指的是能理解物理世界的端到端模型。在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 阅读更多 →