【鸿蒙心迹】沉浸光感全链路——窗口、页面、浮层三层叠加(HarmonyOS 7.x)

第 14 篇把浮层的systemMaterial调顺之后,我以为沉浸光感这事儿就算完了。结果 UI 验收时又提了一句:"浮层是通透了,但页面本身、整个窗口还是实色,内容像贴在一张纯色纸上。"这篇就接这一句话——把窗口、页面、浮层三层一起打通,让整屏通透。过程中踩了 5 个坑,都记在第五节。

适用版本: HarmonyOS 7.x(API 26)/ DevEco Studio 6.x。窗口背景模糊(setWindowBackgroundBlur)自 API 9+ 提供;systemMaterial/ImmersiveMaterial自 API 26.0.0 起提供,低版本需降级处理(方案见第 14 篇)。

从一句验收意见说起

2026 年 8 月,接着第 14 篇的进度继续。浮层的毛玻璃效果上线后,UI 同学在真机上滑了一圈,给出新的验收意见:

“浮层通透了,但页面本身、整个窗口的背景还是实色,没有那种’内容浮在桌面之上’的感觉。”

这话点醒了我。第 14 篇只做了浮层层,而沉浸光感要三层一起做才算完整:

  1. 窗口层:窗口背景模糊(setWindowBackgroundBlur),让内容透过模糊层显示。适合"浮在桌面之上"的桌面工具类应用。
  2. 页面层:页面根容器挂systemMaterial,让整页有材质通透感。
  3. 浮层层:Popup/Menu/Sheet 挂systemMaterial,第 14 篇已覆盖。

我的第一反应是把三层全开、档位全拉满,结果正文糊得没法看,滚动还掉帧——最后落地方案其实和第一版差别很大。本文把窗口层和页面层补齐,讲清楚每一层的适用边界,最后给一份按应用形态选档的选型表和避坑清单。如果你只想要浮层效果,看第 14 篇就够了;要整屏通透,往下读。

一、三层架构:各管一段

沉浸光感全链路

窗口层
window.setWindowBackgroundBlur

页面层
组件 systemMaterial

浮层层
Popup/Menu/Sheet systemMaterial

深色模式自动联动
引擎按深浅色调参数

三层职责分开看:

层级接口作用域适合谁
窗口层window.setWindowBackgroundBlur整个窗口背景桌面工具、悬浮面板
页面层组件.systemMaterial(...)页面/容器普通应用主页面
浮层层浮层systemMaterial(第 14 篇)Popup/Menu/Sheet交互浮层

动手前先分清一个容易混淆的点:窗口背景模糊是窗口级能力,作用于"内容背后的窗口背景";组件级backgroundBlurStyle只模糊单个组件背后的内容。前者改的是整个应用的"底",后者只改局部。窗口层用的是前者,别拿组件级模糊去凑窗口效果——我一开始就试过,只在根容器上挂backgroundBlurStyle,结果壁纸透出来了,但窗口管理器层面的背景还是实色,两端对不齐。

另外窗口层不是所有应用都该开,它是个双刃剑,坑 1 会展开讲。


二、窗口层:setWindowBackgroundBlur

窗口模糊通过@kit.ArkUI的window模块设置,在 UIAbility 的onWindowStageCreate里拿到窗口后调用。模糊强度用窗口版BlurStyle,只有四档——注意和组件版BlurStyle不是一套枚举,别混用。

import{window}from'@kit.ArkUI';asyncfunctionsetupImmersiveWindow(win:window.Window):Promise<void>{try{// 窗口背景模糊:OFF / THIN / REGULAR / THICKawaitwin.setWindowBackgroundBlur(window.BlurStyle.REGULAR);// 背景色必须带 alpha,让模糊层透出来awaitwin.setWindowBackgroundColor('#80FFFFFF');}catch(e){console.error('setWindowBackgroundBlur failed: '+JSON.stringify(e));}}// 在 UIAbility 的 onWindowStageCreate 里调用:// windowStage.getMainWindow().then((win) => { setupImmersiveWindow(win); });

四档说明:

枚举强度说明
OFF关闭默认值,不模糊
THIN较薄轻微通透
REGULAR适中常规通透
THICK较厚明显通透,整窗采样开销最大

有两个细节值得单独说:

背景色必须带 alpha。setWindowBackgroundColor如果给了不透明色,模糊层直接被盖住,表现就是"调了半天没效果"。我用#80FFFFFF(50% 白),桌面壁纸能隐约透出来,"浮在桌面之上"的感觉主要就来自这里。

THICK 别轻易用。整窗模糊的采样面积是全屏,THICK 档 GPU 开销最大。桌面工具场景REGULAR就够通透了,性能账在坑 5 算。


三、页面层:根容器挂材质

窗口层打开后,页面本身还要有材质,整屏才真正通透。页面层复用第 14 篇的systemMaterial,给页面根容器挂一个ImmersiveMaterial:

import{uiMaterial}from'@kit.ArkUI';@Entry@Componentstruct ImmersivePage{@StatepageMaterial:uiMaterial.Material|undefined=newuiMaterial.ImmersiveMaterial({style:uiMaterial.ImmersiveStyle.REGULAR// 页面常用常规档});build(){Column({space:16}){Text('沉浸光感页面').fontSize(24).fontWeight(FontWeight.Bold)// 内容}.width('100%').height('100%').systemMaterial(this.pageMaterial)// 页面级材质}}

这里会再次踩到第 14 篇 Sheet 那个坑,只是换到了页面层:我在根容器上顺手设了不透明的backgroundColor,材质直接被盖住,页面还是纯色。排查了半天才想起来——挂了systemMaterial的容器,背景必须透明或半透明,这条原则在页面层同样成立。

滚动列表:材质延迟开启

一进页面就全页挂材质,列表正文会被压在材质后面,可读性受影响。我的做法是滚动超过一定距离再开材质:顶部内容先看清楚,滚下去之后整页再通透:

@Entry@Componentstruct DynamicMaterialPage{@StatescrollY:number=0;@StateisMaterialOn:boolean=false;@StatepageMaterial:uiMaterial.Material|undefined=newuiMaterial.ImmersiveMaterial({style:uiMaterial.ImmersiveStyle.REGULAR});build(){List(){// 内容}.onScroll((offset)=>{this.scrollY+=offset;// 双阈值防抖:滚过 100 开、回落到 50 才关,中间区间保持现状if(this.scrollY>100&&!this.isMaterialOn){this.isMaterialOn=true;}elseif(this.scrollY<50&&this.isMaterialOn){this.isMaterialOn=false;}}).systemMaterial(this.isMaterialOn?this.pageMaterial:undefined)}}

这段代码的重点不在"滚动开材质",而在防抖设计。onScroll是高频回调,不能每帧都改材质开关——我在阈值附近试过单阈值方案,用户来回滚动时材质反复横跳,肉眼可见地闪(坑 3)。改成双阈值之后,材质只在跨过阈值时切换一次,滚动过程稳定。


四、深色模式:引擎管材质,你管背景

这是三层方案里省心最多的一块。systemMaterial和窗口模糊的深浅色适配都由系统引擎处理——引擎按当前深浅色模式自动调整材质的折射、吸收参数,开发者不用监听切换去改参数。第 14 篇对比表里"深浅色适配:引擎自动调"那条,在页面层和窗口层同样成立。

但引擎只管材质本身。叠加在材质上的自定义半透明背景色,引擎管不到,深浅色要靠资源目录分别定义:

resources/ base/ # 浅色模式 element/ color.json dark/ # 深色模式 element/ color.json
// resources/base/element/color.json(浅色){"immersive_bg":"#80FFFFFF"}// resources/dark/element/color.json(深色){"immersive_bg":"#801A1A1A"}
// 用资源引用,系统按深浅色自动选值Column(){// 内容}.systemMaterial(this.pageMaterial).backgroundColor($r('app.color.immersive_bg'))

我踩的情况是:只定义了base/,浅色模式看着挺好,切到深色模式,那层 50% 白的背景压在深色材质上,整个页面发灰发脏。补上dark/资源后立刻正常。经验是:凡是自定义背景色,base 和 dark 必须成对出现。

如果还有按深浅色做额外逻辑的需求(比如换图),可以在 Ability 里监听配置变更,但材质参数本身不用动:

import{AbilityConstant}from'@kit.AbilityKit';exportdefaultclassEntryAbilityextendsUIAbility{onConfigurationUpdate(config:AbilityConstant.Configuration):void{if(config.colorMode===AbilityConstant.ColorMode.COLOR_MODE_DARK){// 材质已由引擎自适应,这里只处理自定义资源(换图等)}}}

五、5 个踩坑记录

还是第 14 篇的老规矩,不按固定格式硬凑,每个坑把现象、根因和解法说清楚。排查路径先放一张图:

否

是

否

是

否

是

是

否

是

整屏不通透

窗口层开了?

开 setWindowBackgroundBlur

页面有材质?

根容器挂 systemMaterial

背景是否透明?

backgroundColor 设透明/半透明

滚动闪烁?

双阈值防抖 + 布尔开关

深色发灰?

base/dark 资源分别定义

1. 开了窗口模糊,正文也糊了

现象:setWindowBackgroundBlur(THICK)全开之后,整屏确实通透了,但页面正文字符发虚,长时间看很费眼。

根因:窗口模糊作用于整个窗口背景,内容密集的普通应用等于把正文也压在了模糊层下面。这不是 bug,是窗口层的设计定位——它就是给"浮在桌面之上"的稀疏内容准备的。

解决:普通应用不开窗口层,只做页面层 + 浮层层;只有桌面工具形态(内容稀疏、浮在桌面之上)才开窗口层,且最多用到REGULAR。我最终给项目定的方案就是窗口OFF+ 页面REGULAR+ 浮层THIN。

预防:开窗口模糊前先问一句——这个应用的内容密度撑得起整窗模糊吗?内容密集型一律不开。

2. 页面挂了材质,背景还是纯色

现象:根容器配了systemMaterial,页面依然是纯色,通透感出不来。

根因:根容器上同时设了不透明backgroundColor,把材质层盖住了。和第 14 篇 Sheet 那个坑同源,只是这次踩在页面层上。

解决:挂材质的容器背景设Color.Transparent或半透明资源色(用$r引用,深浅色成对定义)。

预防:把"配了systemMaterial就同步检查背景透明"写进代码审查检查项——这个坑我在浮层、页面两层各踩过一次,不值得踩第三次。

3. 滚动时页面材质闪烁

现象:滚动过程中页面材质反复开关,画面一闪一闪。

根因:最初在onScroll里用单阈值直接改材质开关,用户在阈值附近来回滚动时,材质每跨一次线就切换一次,高频切换肉眼可见地闪。

解决:双阈值 + 布尔开关。scrollY > 100才开、回落到scrollY < 50才关,中间 50 的滞回区间内保持现状。第三节代码就是最终版。

预防:动态材质一律走阈值开关,滞回区间按滚动速度调——列表滚动越快,区间可以给得越大。

4. 深色模式下背景色和材质打架

现象:浅色模式效果正常,切深色后页面发灰发脏,材质和背景色不搭。

根因:自定义半透明背景色只定义了base/一套,深色模式沿用浅色值——50% 白压在深色材质上就是一层灰。

解决:base/和dark/两套color.json分别定义,代码里用$r('app.color.xxx')引用,系统按模式自动选值。材质本身不用管,引擎自适应。

预防:自定义背景色必须 base/dark 成对定义,落一条团队约定。

5. 三层全开,掉帧明显

现象:窗口模糊 + 页面材质 + 浮层材质全开厚档,滚动和页面切换动画掉帧明显。

根因:背景模糊和材质采样都是 GPU 密集操作,三层同时计算,开销直接叠加。这也是我把开篇第一版方案(三层全开厚档)推翻重来的原因。

解决:① 同屏材质层数控制在 2 层以内;② 半模态开enableBlurSnapshot;③ 窗口层用薄档(THIN/REGULAR),不上THICK;④ 静态场景用静态模糊替代实时模糊。

预防:定一条性能基线——窗口、页面、浮层三层不同时用厚档;滚动列表项的浮层直接NONE。

以上踩坑基于systemMaterial/ 窗口模糊的官方 API 文档边界和我的调试经验整理,帧率、可读性都是定性判断,具体数值请在真机(中/高算力设备)上用 DevEco Profiler 实测。


六、选型建议:按应用形态定三层档位

三层都能调档,组合起来选择就多了。我的原则是先定应用形态,再定三层的档位:

密集
普通应用

稀疏
桌面工具

展示
全屏沉浸

应用形态

内容密度?

窗口 OFF + 页面 REGULAR + 浮层 THIN

窗口 REGULAR + 页面 THIN + 浮层 REGULAR

窗口 OFF + 页面 NONE + 浮层 REGULAR

应用形态窗口层页面层浮层层依据
普通应用(内容密集)OFFREGULARTHIN/REGULAR正文可读性优先,坑 1
桌面工具(浮在桌面之上)REGULARTHINREGULAR内容稀疏撑得起整窗模糊
全屏沉浸(展示类)OFFNONE(内容直出)REGULAR内容即背景,无需材质

落地时再守三条性能底线:

  1. 同屏材质层数 ≤ 2:窗口 + 页面 + 浮层,别全开厚档(坑 5)。
  2. 窗口层最多REGULAR:整窗采样开销大,THICK只在内容极稀疏时考虑。
  3. 快照优先:半模态开enableBlurSnapshot,静态场景用静态模糊替代实时模糊。

回到开头的问题

最后回到 UI 同学那句验收意见:“页面本身、整个窗口还是实色。”

最终交付的方案是:窗口OFF+ 页面根容器REGULAR+ 浮层THIN(半模态另开enableBlurSnapshot),背景色走 base/dark 成对资源。再上真机验收,浮层、页面、整屏的通透感一致了,正文可读性没受影响,滚动也没有掉帧。三层全开厚档的第一版方案被推翻的那次掉帧,反而是这篇里最值钱的教训——沉浸光感不是档位拉满,是按内容密度分配模糊预算。

如果你的应用也是内容密集型,直接抄第三节和第六节的组合就行;桌面工具形态再考虑开窗口层。


避坑要点

  1. 窗口模糊慎开:普通内容密集应用不开窗口层,只开页面 + 浮层
  2. 配了材质就设背景透明:不透明背景盖住材质层(浮层、页面两层通用)
  3. 滚动材质用双阈值:滞回区间防抖,避免每帧切换闪烁
  4. 背景色 base/dark 成对定义:材质引擎自适应,自定义背景不自适应
  5. 同屏材质层数 ≤ 2:半模态开 enableBlurSnapshot,窗口层最多 REGULAR

边界与已知限制

限制项具体表现规避方式
层级重复窗口层/页面层/浮层都设置沉浸会互相覆盖明确每层职责,只在必要层设置
性能开销沉浸效果叠加材质模糊,开销明显控制层数与覆盖面积
安全区冲突全屏沉浸与安全区同时要求时矛盾用安全区 API 精准控制留白
状态栏字色沉浸式背景上字色对比度不足按背景明暗切换状态栏字色
版本依赖部分沉浸能力依赖 API 版本低版本回退标准导航栏
键盘遮挡沉浸模式下输入框易被键盘遮挡监听键盘高度做避让

小结

沉浸光感的难点是三层不要重复设置:窗口层做全屏、页面层做内容延展、浮层做视觉材质,各管一段。三层一起上同一套参数,结果就是互相覆盖、谁都不生效。

排查顺序固定为:先看窗口是否真的全屏 → 再看页面延展是否被安全区顶回 → 最后看浮层材质参数。按这个顺序,沉浸效果的问题基本都能一次定位。

评论区交流: 你的应用是哪种形态?窗口层模糊开了吗?整屏通透效果怎么样?评论区留言交流。

相关新闻

WorkBuddy Claw 远程控制:架构原理与实战代码详解

WorkBuddy Claw 远程控制:架构原理与实战代码详解

1. 引言WorkBuddy Claw 是一款面向开发者和运维团队的远程控制工具&#xff0c;它把「远程桌面」「命令行执行」「文件传输」和「自动化脚本」整合到同一套 API 体系中。与传统的 VNC 或 RDP 方案相比&#xff0c;WorkBuddy Claw 更强调「可编程」和「可编排」&#xff0c;让远…

2026/10/20 2:07:16 阅读更多 →
多路转接Epoll

多路转接Epoll

一、什么是Epollepoll 是 Linux 内核提供的 IO 多路复用技术&#xff0c;用来解决 select 和 poll 存在的性能短板。 select 和 poll 每次调用都要把全部监听 fd 拷贝到内核&#xff0c;并且内核需要遍历所有 fd 检查就绪状态&#xff0c;返回之后用户态同样要遍历全部集合寻找…

2026/10/20 2:07:16 阅读更多 →
小白程序员必看:轻松入门AI Agent,揭秘比聊天机器人更强大的执行系统

小白程序员必看:轻松入门AI Agent,揭秘比聊天机器人更强大的执行系统

本文深入浅出地解释了AI Agent的核心概念与运作机制&#xff0c;指出Agent不仅是回答问题的工具&#xff0c;更是一个能理解目标、拆解任务、执行并持续优化的完整系统。文章以“大脑工作流程工具接口执行能力结果检查机制”比喻Agent&#xff0c;并详细解析了Agent、LLM、Skil…

2026/10/20 2:07:16 阅读更多 →

最新新闻

Spring Boot公益服务平台开发实战:从数据库建模到答辩全流程指南

Spring Boot公益服务平台开发实战:从数据库建模到答辩全流程指南

最近帮几个学弟学妹把基于Spring Boot的公益服务平台从零到一完整搭了一遍&#xff0c;整个过程走了不少弯路&#xff0c;也沉淀了不少可以直接复用的经验。这类系统在课程设计和毕业设计里出现频率很高&#xff0c;一是业务场景贴近生活&#xff0c;二是功能边界清晰——用户注…

2026/10/20 2:52:44 阅读更多 →
VS2019下编译FLTK 1.4.4 64位静态库完整指南

VS2019下编译FLTK 1.4.4 64位静态库完整指南

如果有人问我Windows下最省心的C界面库是什么&#xff0c;我的答案一直是FLTK。不是因为它功能最全&#xff0c;而是因为它是少数能把二进制体积控制在几百KB、链接完不带一堆运行库依赖的轻量级选择。最近我用VS2019把一个内部工具做成64位程序&#xff0c;决定把FLTK-1.4.4从…

2026/10/20 2:52:44 阅读更多 →
NSGA2多目标优化MATLAB实现:从原理到代码全解析

NSGA2多目标优化MATLAB实现:从原理到代码全解析

简介&#xff1a;一份MATLAB环境下的NSGA-II算法实现资料包&#xff0c;围绕非支配排序遗传算法第二代展开&#xff0c;面向需要在科研或工程场景中处理多目标优化问题的开发者与学习者。资源共20个文件&#xff0c;以MATLAB的m脚本为主&#xff08;含初始化、非支配排序、锦标…

2026/10/20 2:52:44 阅读更多 →
前端大数据表格渲染卡顿?主线程调度、Worker 与虚拟滚动的优化实践

前端大数据表格渲染卡顿?主线程调度、Worker 与虚拟滚动的优化实践

1. 一次真实的卡顿现场&#xff1a;loading 转着转着就“冻住”了1.1 现象表现与复现路径先还原一下我当时遇到的问题。项目是一个典型的管理后台报表页&#xff0c;接口返回一张大列表&#xff0c;大概 8000 到 15000 行&#xff0c;每行有七八个字段&#xff0c;还要带状态标…

2026/10/20 2:52:44 阅读更多 →
C++ eVTOL仿真工程:六自由度动力学与控制分配实战

C++ eVTOL仿真工程:六自由度动力学与控制分配实战

简介&#xff1a;eVTOL_Simulation 是一份面向 C 学习者与仿真爱好者的轻量级项目源码&#xff0c;围绕电动垂直起降飞行器的调度场景展开。程序设定 5 家公司共 20 架飞机同时起飞&#xff0c;每架飞机拥有巡航速度、电池容量、充电时间、巡航能耗及每小时故障概率等参数&…

2026/10/20 2:52:44 阅读更多 →
STM32双串口DMA互透传:零CPU干预的硬件级直通方案

STM32双串口DMA互透传:零CPU干预的硬件级直通方案

简介&#xff1a;本资源是基于STM32CubeMX与HAL库实现的双串口DMA互透传完整工程&#xff0c;面向嵌入式初学者及STM32进阶开发者&#xff0c;解决多串口高吞吐、低CPU占用场景下的实时数据转发难题&#xff0c;适用于工业通信网关、协议转换器、传感器汇聚等典型应用。压缩包共…

2026/10/20 2:51:44 阅读更多 →

日新闻

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/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

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

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

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

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

如果你的信息流最近也天天刷到“机器人大脑”这个词&#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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →