CSS结构伪类选择器:精准定位元素的核心技巧与实战指南
1. 项目概述从“选择困难”到精准定位在CSS的世界里我们每天都在和选择器打交道但真正能让你从“差不多能选中”到“指哪打哪”的往往是那些结构伪类选择器。last-child、:first-child、:nth-child()、:nth-of-type()这四个家伙可以说是前端开发者手头最常用也最容易混淆的“精密手术刀”。乍一看它们都是基于元素在父容器中的位置来筛选但细微的差别就能导致完全不同的渲染结果。我见过太多项目里因为一个:nth-child和:nth-of-type的误用导致列表样式错乱、斑马条纹对不上或者想选中最后一个元素却意外选中了别的东西调试起来费时费力。掌握它们绝不仅仅是记住语法那么简单。核心价值在于你能在不改动HTML结构的前提下仅通过CSS就实现复杂的视觉逻辑。比如给一个动态生成的商品列表的最后一项去掉下边框为表格的奇数行添加背景色或者在一个混合了标题、段落和图片的容器里精准地只对某一类元素比如所有段落的特定位置进行样式修饰。这直接提升了代码的维护性和灵活性尤其是在配合现代框架进行组件化开发时你总不希望为了一个样式就去动组件的结构吧这篇内容就是帮你彻底理清这四把“手术刀”的刀法区别、适用场景以及那些官方文档里不会写的实战避坑指南无论你是刚入门CSS的新手还是想巩固细节的资深开发者都能找到直接的参考价值。2. 核心概念拆解理解“孩子”与“类型”的维度差异要玩转这四个选择器首先得建立两个核心认知维度“子序”和“类型”。这是理解它们所有行为差异的基石。“子序”维度关注的是元素在其父元素所有子节点中的绝对位置序号。这个“所有子节点”包括元素节点、文本节点、注释节点等。CSS选择器在计算位置时通常只计算元素节点Element Node。:first-child和:last-child是这个维度的两个极端分别匹配作为父元素下第一个和最后一个子元素的元素。而:nth-child(anb)则是一个强大的公式计算器它基于这个绝对子序来匹配。“类型”维度则是在“子序”的基础上加了一个元素标签名的过滤器。:nth-of-type(anb)和它的特例:first-of-type、:last-of-type虽然标题未提及但必须关联理解首先会筛选出所有符合指定类型的子元素然后在这个“同类型子元素列表”中按照公式计算位置进行匹配。一个经典的比喻是父元素就像一个班级子元素就是学生。:nth-child()是班主任按照全班学生的学号入班顺序来点名不管你是男生还是女生。而:nth-of-type()则是体育老师他先让所有男生出列排成一队然后按照男生队伍里的顺序来点名。理解了这个根本区别大部分疑惑就迎刃而解了。注意这里说的“类型”严格指HTML标签名。div和section是不同的类型即使它们都是块级元素同理一个带有.active类的p和一个普通的p对于:nth-of-type来说是同一种类型都是p选择器不关心CSS类。3. 选择器深度解析与对比实战接下来我们把这四个选择器两两分组通过具体的代码场景来剖析它们的行为这是理解其细微差别的关键。3.1 :first-child 与 :last-child首尾的精准捕捉这两个选择器概念上最简单但陷阱也最多。它们匹配的是作为父元素第一个或最后一个子元素的元素。div classcontainer p第一个段落/p p第二个段落/p span一个span/span p第三个段落/p /div/* 尝试一匹配第一个子元素 */ .container :first-child { color: red; } /* 效果p第一个段落/p 会变红因为它是container的第一个子元素。 */ /* 尝试二匹配最后一个子元素 */ .container :last-child { font-weight: bold; } /* 效果p第三个段落/p 会加粗因为它是container的最后一个子元素。 */常见误区与避坑对“子元素”的误解:first-child并非“选择父元素下的第一个某类型元素”而是“选择作为第一个子元素的那个元素并且这个元素恰好是某类型”。如果第一个子元素不是你想要的类型规则将不匹配任何元素。在上例中p:first-child可以选中第一个段落但如果你写span:first-child则不会选中任何东西因为第一个子元素是p不是span。空白文本节点的干扰在某些浏览器或HTML格式化情况下标签间的换行和缩进可能会产生文本节点。虽然主流浏览器在CSS匹配时通常会忽略这些非元素文本节点但为了绝对安全尤其是在处理:first-child和:last-child时保持HTML的紧凑格式或使用注释包裹空白是好的实践。3.2 :nth-child() 与 :nth-of-type()公式化选择的艺术这是功能最强大也最容易用混的一对。它们的参数都是一个模式an b。a是周期整数。n是从0开始的计数器0, 1, 2, ...。b是偏移量整数。 浏览器会计算所有满足an b结果为正整数的n对应的元素位置就会被选中。核心区别再现:nth-child()从所有子元素中计数:nth-of-type()先过滤出指定类型的子元素再在这个过滤后的列表中计数。让我们用一个混合元素的例子彻底看清区别div classmixed-box h3标题一/h3 p段落A/p p段落B/p div一个div/div p段落C/p p段落D/p /div/* 场景一使用 :nth-child */ .mixed-box p:nth-child(2) { background-color: lightblue; } /* 解析 1. 找到 .mixed-box 的所有子元素[h3, p(A), p(B), div, p(C), p(D)] 2. 数出第2个子元素是 p段落A/p 3. 检查这个元素是否是 p 类型是。 4. 匹配成功段落A背景变蓝。 */ /* 场景二使用 :nth-of-type */ .mixed-box p:nth-of-type(2) { background-color: lightcoral; } /* 解析 1. 在 .mixed-box 的所有子元素中先过滤出所有 p 类型[p(A), p(B), p(C), p(D)] 2. 在这个过滤后的列表中数出第2个 p是 p段落B/p 3. 匹配成功段落B背景变珊瑚色。 */关键参数详解与常用公式公式:nth-child含义:nth-of-type含义常见应用场景nth-child(odd)或nth-child(2n1)所有子元素中的奇数位元素同类型子元素中的奇数位元素表格/列表斑马纹奇数行nth-child(even)或nth-child(2n)所有子元素中的偶数位元素同类型子元素中的偶数位元素表格/列表斑马纹偶数行nth-child(3)所有子元素中的第3个同类型子元素中的第3个选中特定位置元素nth-child(3n)所有子元素中第3、6、9...个同类型子元素中第3、6、9...个每第3个元素特殊样式nth-child(3n1)所有子元素中第1、4、7...个同类型子元素中第1、4、7...个周期循环样式从1开始nth-child(-n3)所有子元素中的前3个同类型子元素中的前3个仅对前几个元素生效nth-child(n4)所有子元素中从第4个开始的所有元素同类型子元素中从第4个开始的所有元素跳过前几个元素实操心得当你需要的选择逻辑是“不考虑类型只看整体位置”时用:nth-child。当你的逻辑是“我只关心某一类元素并在这类元素内部找位置”时用:nth-of-type。在写样式前先在脑子里把父容器里的子元素按顺序列出来分别用两种规则推演一遍能有效避免错误。4. 高级应用场景与组合技巧理解了基础原理后我们可以将这些选择器组合使用解决更复杂的UI需求。4.1 实现智能列表与表格样式这是最经典的应用。假设我们有一个动态生成的评论列表希望最后一条评论没有底边框并且每三条评论为一组每组有一个视觉区分。ul classcomment-list li classcomment评论1/li li classcomment评论2/li li classcomment评论3/li li classcomment评论4/li li classcomment评论5/li li classcomment评论6/li /ul.comment-list .comment { border-bottom: 1px solid #eee; padding: 10px 0; } /* 移除最后一条评论的底边框 */ .comment-list .comment:last-child { border-bottom: none; } /* 每3条评论为一组给每组的第一条加点特殊样式例如上边距更大 */ .comment-list .comment:nth-child(3n1) { margin-top: 20px; /* 第一、四条评论上方有额外间距 */ } /* 或者更常见的给每组最后一条一个不同的背景色 */ .comment-list .comment:nth-child(3n) { background-color: #f9f9f9; }4.2 处理混合内容布局在文章内容区域经常是h2,p,img,blockquote等标签混合。我们可能想对第一个段落进行首字下沉或者对图片之后的段落调整间距。article classpost-content h2章节标题/h2 p这是第一个段落我们希望它首字下沉。/p img srcexample.jpg alt示例图 p这是图片后的第一个段落。/p p这是另一个段落。/p blockquote一段引用。/blockquote p引用后面的段落。/p /article/* 首字下沉选中作为第一个子元素的段落 */ .post-content p:first-of-type::first-letter { font-size: 3em; float: left; line-height: 1; margin-right: 5px; } /* 调整紧跟在图片后面的段落的顶部间距 */ .post-content img p { margin-top: 15px; } /* 注意这里用了相邻兄弟选择器 它和结构伪类经常搭配使用。 */ /* 如果想选中所有段落中的第偶数个 */ .post-content p:nth-of-type(even) { color: #555; /* 给偶数段落一个稍浅的颜色 */ }4.3 与属性选择器、状态类的结合结构伪类可以和其他选择器自由组合实现极其精准的选择。div classtoolbar button classbtn按钮1/button button classbtn primary主要按钮/button button classbtn disabled禁用按钮/button a href# classbtn link链接按钮/a button classbtn按钮5/button /div/* 选中工具栏中最后一个类型为 button 的元素 */ .toolbar button:last-of-type { border-radius: 0 10px 10px 0; } /* 选中所有按钮中倒数第二个 */ .toolbar .btn:nth-last-child(2) { /* :nth-last-child 从后往前数语法同 :nth-child */ background-color: #f0f0f0; } /* 组合选中第一个且是主要按钮的元素 */ .toolbar .btn.primary:first-child { /* 只有当第一个 .btn 同时有 .primary 类时才生效 */ font-weight: bold; } /* 如果第一个按钮没有 .primary 类则上条规则不匹配 */5. 常见问题、浏览器差异与性能考量在实际开发中除了概念清晰还得应对现实环境的挑战。5.1 高频问题排查清单现象可能原因解决方案:first-child没生效目标元素并非其父元素的第一个子元素。检查其前面是否有其他元素包括注释、文本节点。检查DOM结构确保目标元素是第一个子元素节点。或改用:first-of-type。:nth-child(2)选中了意外元素混淆了:nth-child和:nth-of-type。计数是基于所有子元素而非同类元素。确认需求如果要在同类元素中选应使用:nth-of-type(2)。动态增删元素后样式错乱结构伪类是基于DOM实时结构计算的。元素位置变了匹配的元素自然改变。这是预期行为。如果希望样式不随位置改变应使用类名如.last-item进行标记而非结构伪类。在display: contents的父元素上使用失效display: contents会使元素自身的盒子消失其子元素提升为祖父元素的子元素。结构伪类将基于新的父元素祖父元素进行计算。需要重新评估选择器路径。想选中“倒数第几个”不熟悉:nth-last-child()和:nth-last-of-type()。使用:nth-last-child(n)或:nth-last-of-type(n)它们从最后一个子元素开始向前计数。5.2 浏览器支持与降级策略这四个选择器在现代浏览器包括IE9中都有非常好的支持。主要注意点在于IE8及以下完全不支持。如果项目需要兼容IE8必须避免使用或者使用JavaScript如jQuery进行功能降级。动态DOM操作在所有浏览器中结构伪类的匹配都是即时的。这意味着通过JavaScript插入、删除或移动元素后样式会立即根据新的DOM结构重新应用通常无需额外处理。降级思路对于必须兼容老旧浏览器的场景最稳妥的方法是使用“类名标记”。例如在服务器端渲染或前端框架如React、Vue中在生成列表时直接为第一个、最后一个或特定位置的元素添加像.first-item、.last-item、.even这样的辅助类然后在CSS中针对这些类编写样式。这样完全绕开了选择器兼容性问题。5.3 性能考量与最佳实践CSS选择器的匹配是从右向左进行的。对于ul li:nth-child(odd)浏览器会先找到所有:nth-child(odd)的元素。再过滤出这些元素中是li的。最后检查这些li是否在一个ul内。虽然现代浏览器引擎已高度优化但过于复杂或深层嵌套的结构伪类选择器仍可能带来轻微性能开销。最佳实践是保持简洁尽量让选择器直接、简短。避免像.container div:nth-of-type(3) p:first-child span这样的超长链。范围限定在已知的父容器内使用避免全局匹配。例如使用.product-list .item:nth-child(3n)而非直接使用:nth-child(3n)。合理使用如果某个元素需要固定的、不随DOM结构变化的样式为其添加一个具体的类名是比使用结构伪类更高效、更可读的选择。结构伪类更适用于那些真正与文档结构强相关的样式逻辑。6. 在现代化布局方案中的实践随着CSS Grid和Flexbox的普及结构伪类选择器找到了新的用武之地它们能很好地辅助这些布局模型进行精细化控制。6.1 配合 Flexbox 布局在Flex容器中项目的视觉顺序可能通过order属性改变但DOM顺序不变。结构伪类依然基于DOM顺序而非视觉顺序。div classflex-container div classitem styleorder: 3;Item 1 (order:3)/div div classitem styleorder: 1;Item 2 (order:1)/div div classitem styleorder: 2;Item 3 (order:2)/div /div.flex-container { display: flex; } /* 这个选择器仍然基于DOM顺序选中第一个 .item即“Item 1” */ .flex-container .item:first-child { border: 2px solid red; } /* 尽管“Item 1”视觉上在最后但它仍有红色边框。 */6.2 配合 CSS Grid 布局在Grid布局中你可以用结构伪类来为特定行或列中的项目添加样式尤其是当项目通过grid-auto-flow: dense进行密集填充导致视觉位置与DOM顺序不一致时。.grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; } /* 选中网格中每一行的第一个项目基于DOM顺序 */ .grid-container *:nth-child(3n1) { background-color: lightgreen; } /* 注意这依赖于项目按顺序填充网格。如果网格有明确的行列定义且项目被放置到特定位置此规则可能不会产生直观的“每行第一个”效果。 */6.3 处理动态内容与组件在现代前端框架如React、Vue中列表是动态渲染的。使用结构伪类可以保持样式逻辑与组件结构解耦。// React 组件示例 function TodoList({ items }) { return ( ul classNametodo-list {items.map((item, index) ( li key{item.id} classNametodo-item {item.text} /li ))} /ul ); }/* CSS - 无需在JSX中添加任何类名即可实现样式 */ .todo-list .todo-item { padding: 10px; border-bottom: 1px solid #ddd; } /* 移除最后一项的边框 */ .todo-list .todo-item:last-child { border-bottom: none; } /* 斑马条纹 */ .todo-list .todo-item:nth-child(odd) { background-color: #f8f9fa; }这种方式的优点是CSS负责样式JS负责数据和结构职责清晰。当列表项增删时样式会自动、正确地应用。7. 调试技巧与工具使用当结构伪类选择器不按预期工作时系统性的调试能快速定位问题。第一步使用浏览器开发者工具检查在元素上右键点击选择“检查”。在“样式”面板中查看应用到该元素的所有CSS规则。如果预期的规则被划掉通常是因为特异性Specificity不够或被后面的规则覆盖。如果规则根本没出现说明选择器未匹配到该元素。第二步验证DOM结构在“元素”面板中仔细查看目标元素的父容器。确认目标元素在兄弟节点中的确切位置。注意所有元素节点包括你可能忽略的script、template或注释!-- --。展开文本节点如果浏览器工具允许查看是否有空白字符节点影响了“第一个”或“最后一个”的判断。第三步简化与隔离测试如果选择器很复杂尝试在控制台Console中用document.querySelector(‘你的选择器’)来测试。如果返回null则证明选择器不匹配。将疑似有问题的CSS规则提取到一个最简单的测试HTML文件中排除项目中其他CSS的干扰。对于:nth-child公式可以手动计算。列出所有子元素从1开始编号代入公式anb看哪些序号能产生正整数。一个真实案例我曾遇到一个:last-child失效的问题。检查后发现在目标li之后模板引擎自动插入了一个!-- --注释节点。这个注释节点成为了真正的“最后一个子节点”导致li:last-child无法匹配。解决方案是清理模板输出或者改用:last-of-type因为注释不是li类型。

相关新闻

Mac上搭建Python 3与Django开发环境:从环境隔离到项目部署全指南

Mac上搭建Python 3与Django开发环境:从环境隔离到项目部署全指南

1. 项目概述:为什么要在Mac上折腾Django?如果你手头有一台Mac,并且想用它来开发一个网站或者Web应用,那么Django几乎是一个绕不开的名字。作为一个在Python社区里摸爬滚打了十多年的老鸟,我几乎见证了Django从一个小众…

2026/10/15 12:13:32 阅读更多 →
基于ComfyUI API与MiniMax-H3构建多模态AI内容生成流水线

基于ComfyUI API与MiniMax-H3构建多模态AI内容生成流水线

最近在尝试将多模态大模型能力集成到自动化内容生成流水线时,发现市面上很多方案要么过于复杂,要么灵活性不足。特别是当需要结合文生视频、音频生成等多种模态时,流程的编排和调试往往成为瓶颈。ComfyUI 以其强大的节点式工作流和开放的 API…

2026/10/14 23:43:36 阅读更多 →
SQL注入深度解析:从MyBatis的#{}与${}差异看安全编码实践

SQL注入深度解析:从MyBatis的#{}与${}差异看安全编码实践

1. 项目概述:一次关于SQL注入的深度复盘几年前,我在一次内部安全审计中,遇到了一个非常典型的案例,我习惯性地称之为“Twice SQL Injection”。这个名字听起来有点绕,但它精准地概括了这次漏洞的本质:一个看…

2026/10/15 7:17:28 阅读更多 →

最新新闻

ROS2+Isaac Sim+LeRobot具身智能闭环实战:零拷贝数据流与GPU推理部署

ROS2+Isaac Sim+LeRobot具身智能闭环实战:零拷贝数据流与GPU推理部署

1. 这不是“跑个Demo”,而是具身智能闭环落地的第一步:为什么必须同时打通ROS2、LeRobot和Isaac Sim三座孤岛?你可能已经看过几十个ROS2小乌龟教程、十几篇Isaac Sim安装踩坑帖、还有LeRobot官方文档里那些看似完美的训练日志截图。但真正动手…

2026/10/15 22:17:52 阅读更多 →
Natron 中的 G‘MIC Smooth Median 节点:原理、参数详解与中值滤波实战指南

Natron 中的 G‘MIC Smooth Median 节点:原理、参数详解与中值滤波实战指南

音视频视频处理图形学桌面应用 【免费下载链接】Natron Open-source video compositing software. Node-graph based. Similar in functionalities to Adobe After Effects and Nuke by The Foundry. 项目地址: https://gitcode.com/gh_mirrors/na/Natron 点击查看 …

2026/10/15 22:17:52 阅读更多 →
微软商店安装Codex失败排查:错误码0x80070005与0x80073CF9解决指南

微软商店安装Codex失败排查:错误码0x80070005与0x80073CF9解决指南

1. 微软商店装 Codex 卡住这件事,到底卡在哪一层Codex 桌面版在 Windows 上的分发路径比较特殊,官方主推的是微软商店(Microsoft Store)渠道,这就导致一个很现实的问题:只要商店这一环出问题,整…

2026/10/15 22:17:52 阅读更多 →
OpenRig:面向CLI工具链开发的开源基础设施范式

OpenRig:面向CLI工具链开发的开源基础设施范式

1. OpenRig 是什么:一个被严重误读的开源工具链起点OpenRig 这个名字最近在开发者社区里频繁出现,但绝大多数人点进去第一眼看到的都是满屏报错、找不到二进制、CLI 启动失败、cc switch local proxy failed while handling codex endpoint /responses这…

2026/10/15 22:17:52 阅读更多 →
Aras Innovator PLM系统管理全攻略:从权限配置到日常运维避坑指南

Aras Innovator PLM系统管理全攻略:从权限配置到日常运维避坑指南

简介:一份面向 ARAS PLM 系统管理员与实施顾问的中文操作手册,系统介绍 Aras Framework 后台管理功能。全册 146 页,围绕用户管理(包括创建用户、登录用户、参与者与特殊参与者)、权限体系(权限创建、发现权…

2026/10/15 22:17:52 阅读更多 →
UniEdit电子病历编辑器:结构化XML锚点与ActiveX临床集成方案

UniEdit电子病历编辑器:结构化XML锚点与ActiveX临床集成方案

简介:UniEdit电子病历编辑器是一款面向医疗信息系统开发者的技术组件,专为快速集成电子病历编辑功能而设计,适用于C/S或B/S架构的HIS、EMR等系统开发,解决病历富文本编辑、模板复用、ICD编码嵌入及多页结构化管理等核心需求。资源…

2026/10/15 22:16:51 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 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/15 0:14:36 阅读更多 →
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/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练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/15 9:49:14 阅读更多 →