HarmonyOS 6 HDS 新能力实战:悬浮页签与沉浸光感适配指南
-
- 为什么值得关注:从"工具栏"到"系统化界面表达"
- 悬浮页签与沉浸光感适配指南
- 实操总结
-
- [1. 先改布局结构,再谈视觉材质](#1. 先改布局结构,再谈视觉材质)
- [2. 再引入沉浸光感](#2. 再引入沉浸光感)
- [3. 做好能力探测和降级](#3. 做好能力探测和降级)
- [4. 一定要检查覆盖层是否透传事件](#4. 一定要检查覆盖层是否透传事件)
- 踩坑点整理
-
- [1. 模拟器里效果不明显,不代表接入失败](#1. 模拟器里效果不明显,不代表接入失败)
- [2. 不支持 IMMERSIVE 时,需要准备降级策略](#2. 不支持 IMMERSIVE 时,需要准备降级策略)
- [3. 自定义展示层最容易挡住原生 HDS 页签点击](#3. 自定义展示层最容易挡住原生 HDS 页签点击)
- [4. 自定义仿玻璃效果](#4. 自定义仿玻璃效果)
- 结语
- 参考文档
摘要:HarmonyOS 6(API 23)为 HDS 组件带来了悬浮页签与沉浸光感两项新能力。本文结合官方能力说明与一次真实适配过程,系统讲解接入思路、适用场景、关键代码、兼容策略,以及实战中最容易踩到的交互与层级问题。

在 HarmonyOS 6(API 23)中,HDS(HarmonyOS Design System)围绕导航与材质表达新增了两项很值得开发者关注的能力:
- 悬浮页签
- 沉浸光感材质
如果你的应用正在做首页改版、内容页升级,或者希望界面更贴近 HarmonyOS 6 的系统风格,这两项能力都很有参考价值。
这类能力的意义并不只是"更好看",而是系统级设计语言开始进一步开放给开发者:
- 导航不再只是贴边工具栏,而是可以成为内容层次的一部分
- 标题栏、底部页签、按钮等组件拥有更统一的材质语言
- 开发者可以减少手工实现阴影、模糊、高光的成本
本文会从设计价值、接入方式、适配策略、踩坑经验四个维度展开,尽量把这次实操中真正有价值的部分讲清楚。
为什么值得关注:从"工具栏"到"系统化界面表达"

传统移动应用中的顶部标题栏和底部页签栏,本质上更像功能入口容器:
- 标题栏负责返回、标题、菜单
- 页签栏负责核心导航切换
这套方案稳定,但也有比较明显的局限:
- 导航与内容区边界感很强,界面层级略显生硬
- 想做沉浸式内容页时,开发者往往要自己叠透明层、阴影和模糊
- 自定义实现风格不统一,维护成本也高
HarmonyOS 6 的 HDS 新能力,本质上是在把"导航组件"升级成"系统化界面表达能力"。
可以简单理解为:
悬浮页签解决的是导航和内容之间的空间关系沉浸光感解决的是导航和内容之间的材质关系
这两者配合起来,才更接近 HarmonyOS 6 的整体设计语言。
悬浮页签:更适合内容型页面的导航表达

悬浮页签的核心变化在于:页签栏不再死板贴边,而是以悬浮卡片的形式覆盖在页面内容之上。
相比传统底栏,它更适合以下场景:
- 内容浏览型首页
- 推荐流、资讯流、视频流等沉浸式页面
- 希望弱化导航边界感的页面
- 正在做 HarmonyOS 6 风格适配的业务首页
它带来的价值主要有三点:
- 导航与内容之间的层级关系更自然
- 不明显压缩内容区的前提下,仍然保持入口可见
- 页面整体更轻、更灵动,不像传统底栏那样"压住内容"
当然,悬浮页签并不是所有页面都适合。如果页面本身信息密度非常高,或者底部导航承担了较多操作行为,就要评估是否会影响可读性和交互效率。
沉浸光感:不只是"特效",而是系统级材质能力

和悬浮布局搭配出现的,是 HDS 的沉浸光感材质能力。
在相关组件启用材质效果后,标题栏按钮、悬浮页签等元素会呈现更明显的层次变化,让用户更容易识别:
- 当前可操作区域
- 页面视觉焦点
- 标题栏、内容区、导航区之间的分层关系
从开发视角看,这项能力真正的价值在于:
- 组件反馈更清晰
- 页面视觉统一性更强
- 自定义光影和毛玻璃实现成本明显下降
如果应用本身已经采用较强的沉浸式设计,这项能力会比简单透明背景更有完成度。
悬浮页签与沉浸光感适配指南
这是这次实操中最容易误判的地方。
我们一开始按文档接入后,发现模拟器中的沉浸光感效果并不明显,第一反应很容易是:
- 是不是代码写错了
- 是不是系统材质参数无效
- 是不是 HDS 组件没有正确生效
但实际情况是,沉浸光感的呈现效果与系统版本、设备能力和运行环境都有关系。
官方说明里提到:
悬浮页签和沉浸光感效果在系统版本 6.0.0.328 sp52 及以上生效。
这意味着:
- 模拟器不一定能完整体现真实材质效果
- 最终效果需要以实机为准
- 代码正确并不代表模拟器里一定"看起来明显"
所以开发阶段一定要注意:这类能力不要只在模拟器里做结论,最好实机验证。
悬浮页签的基础接入方式

悬浮页签的核心是几个属性组合:
barOverlap(true):页签栏悬浮在内容上方vertical(false):横向底部页签barPosition(BarPosition.End):底部位置barFloatingStyle(...):配置悬浮样式
基础示例如下:
ts
import { hdsMaterial } from '@hms.hds.hdsMaterial'
import { HdsTabs, HdsTabsController } from '@kit.UIDesignKit';
@Entry
@Component
struct Index {
private controller: HdsTabsController = new HdsTabsController();
build() {
Column() {
HdsTabs({ controller: this.controller }) {
TabContent() {
Text('Tab 1')
}
.tabBar(new BottomTabBarStyle($r('sys.media.ohos_ic_public_clock'), '首页'))
TabContent() {
Text('Tab 2')
}
.tabBar(new BottomTabBarStyle($r('sys.media.wifi_router_fill'), '我的'))
}
.barOverlap(true)
.barPosition(BarPosition.End)
.vertical(false)
.barFloatingStyle({
barWidth: { smallWidth: 220, mediumWidth: 280, largeWidth: 340 },
barBottomMargin: 28,
gradientMask: { maskColor: '#66F1F3F5', maskHeight: 92 },
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.IMMERSIVE,
materialLevel: hdsMaterial.MaterialLevel.ADAPTIVE
}
})
}
}
}
这套配置完成后,底部页签会从传统样式切换为悬浮表现。
迷你栏:悬浮页签之外的新扩展区域


HarmonyOS 6 的 HDS 页签栏除了支持悬浮样式,还支持 miniBar。
它可以理解为一个与页签栏同高度、同水平对齐的自定义区域,支持展开和折叠两种状态。适合承载:
- 当前 Tab 摘要
- 轻量级快捷操作
- 播放控制
- 状态提示信息
示例结构如下:

ts
.barFloatingStyle({
barWidth: { smallWidth: 220, mediumWidth: 280, largeWidth: 340 },
barBottomMargin: 28,
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: this.materialLevel
},
miniBar: {
miniBarBuilder: () => this.miniBarBuilder(),
miniBarWidth: { smallWidth: 132, mediumWidth: 168, largeWidth: 216 },
miniBarStyle: HdsBarStyle.COLLAPSE,
enableMiniBarBackground: true,
enableMiniBarClip: true,
onBarStyleChange: (miniBarStyle, _tabBarStyle, miniBarWidth, tabBarWidth) => {
this.miniBarStyle = miniBarStyle;
this.miniBarWidth = miniBarWidth;
this.tabBarWidth = tabBarWidth;
}
}
})
我们在实操中也做了一个 miniBar,用于显示当前页签状态,并支持展开/折叠切换。
这个能力本身比较灵活,但建议控制好内容密度。miniBar 更适合做"轻信息区",不要把它做成第二个操作栏。
沉浸光感正确姿势:先判断设备支持能力

如果使用自定义沉浸光感的视觉效果,官方建议先调用 getSystemMaterialTypes() 查询当前设备支持的材质能力,再决定采用哪种材质等级。
推荐规则如下:
- 如果设备支持
IMMERSIVE- 可使用
EXQUISITE或GENTLE
- 可使用
- 如果设备不支持
IMMERSIVE- 建议降级为
SMOOTH
- 建议降级为
示例代码:
ts
import { hdsMaterial } from '@kit.UIDesignKit';
@Entry
@Component
struct Index {
@State customMaterialLevel: hdsMaterial.MaterialLevel = hdsMaterial.MaterialLevel.EXQUISITE;
aboutToAppear(): void {
let materialTypes: Array<hdsMaterial.MaterialType> = hdsMaterial.getSystemMaterialTypes();
if (materialTypes.indexOf(hdsMaterial.MaterialType.IMMERSIVE) < 0) {
this.customMaterialLevel = hdsMaterial.MaterialLevel.SMOOTH;
}
}
}
然后在标题栏、页签栏中这样使用:
ts
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: this.customMaterialLevel
}
这里 ADAPTIVE + 动态 materialLevel 是比较稳妥的接入方案。
标题栏与页签栏一起启用,才能体现整体设计语言
沉浸光感并不只适用于底部悬浮页签,标题栏按钮同样支持。
示例:
ts
.titleBar({
style: {
systemMaterialEffect: {
materialType: hdsMaterial.MaterialType.ADAPTIVE,
materialLevel: this.customMaterialLevel
}
},
content: {
title: {
mainTitle: 'MainTitle',
}
}
})
这类配置的实际价值是:
- 顶部和底部组件拥有统一材质语言
- 页面上下结构更完整
- 整体风格更接近 HarmonyOS 6 的系统设计体验
如果只改底部而不处理顶部,页面往往会有"底部升级了,顶部还是旧时代"的割裂感。
实操总结
如果你要做一个 HarmonyOS 6 风格首页,可以参考下面这类页面结构:
- 顶部使用 HDS Navigation,按钮启用沉浸光感
- 中间内容区以滚动浏览为主
- 底部使用 HDS 悬浮页签
- 在不支持
IMMERSIVE的场景下降级到SMOOTH - 如果模拟器效果不明显,优先用实机确认
- 所有覆盖在
HdsTabs上方的展示层都设置事件透传
这个结构既能体现 HarmonyOS 6 的设计语言,也能把风险控制在比较合理的范围内。
如果要在已有项目中接入这两项能力,我更建议按下面的顺序推进:
1. 先改布局结构,再谈视觉材质
先确认页面是否适合悬浮页签,不要一上来就沉迷材质效果。因为页签是否悬浮,决定的是页面结构。
2. 再引入沉浸光感
在悬浮结构稳定后,再逐步引入材质效果,这样更容易判断问题到底出在布局还是材质。
3. 做好能力探测和降级
通过 getSystemMaterialTypes() 判断是否支持 IMMERSIVE,不支持则降级到 SMOOTH,必要时辅以背景模糊。
4. 一定要检查覆盖层是否透传事件
只要页面中有这些东西,就一定要重点验证:
- 卡片展示层
- 自定义比较组
- 中间全屏覆盖容器
- 浮层式视觉组件
尤其是底部原生 HDS 页签是否还能正常点击切换。
结合这次接入体验,我认为以下场景最适合优先尝试:
- 内容浏览型首页
- 推荐页、资讯页、视频页
- 需要弱化导航边界感的页面
- 正在做 HarmonyOS 6 风格升级的应用
- 希望减少自定义材质实现成本的团队
以下场景建议谨慎评估:
- 信息密度极高的工具型页面
- 底部导航承担复杂操作的页面
- 页面中已经有大量浮层与卡片的布局
原因很简单:悬浮式设计强调的是轻层级和沉浸感,如果界面本身过于拥挤,反而可能降低清晰度。
踩坑点整理
这部分可能是最有参考价值的。
因为真正耗时间的往往不是"API 怎么写",而是"为什么写了没效果"或者"为什么布局对了但交互坏了"。
1. 模拟器里效果不明显,不代表接入失败

前面提到过,沉浸光感在模拟器中可能表现不稳定或者不明显。
这一点非常容易导致错误判断。建议:
- 优先看是否已正确设置
systemMaterialEffect - 再确认设备能力和系统版本
- 最后用实机确认视觉效果
2. 不支持 IMMERSIVE 时,需要准备降级策略
我们在实践中尝试过两种思路:
- 使用
SMOOTH作为系统材质降级 - 用自定义"仿液态玻璃"或毛玻璃做视觉兼容
最终经验是:
- 系统能力优先,优先使用
SMOOTH - 如果还需要进一步增强视觉,再加轻量级兜底效果
- 不建议一开始就做过重的自定义材质层
3. 自定义展示层最容易挡住原生 HDS 页签点击
这是我们这次踩得最深的坑。
在页面里做中间展示卡片、对比区、自定义浮层时,布局通常会写成:
ts
Stack() {
HdsTabs(...)
Column() {
this.materialDemoCard()
}
.width('100%')
.height('100%')
.justifyContent(FlexAlign.Center)
}
这段代码看起来没问题,但如果这个 Column 是覆盖在 HdsTabs 上方的,它即使没有显式点击事件,也可能吞掉底部点击区域,导致页签无法切换。
我们最后定位问题时,根因其实很清晰:
- 页面根节点是
Stack - 中间展示层占满全屏
- 展示层位于
HdsTabs上方 - 没有设置事件透传
解决方式也很直接:
ts
.enabled(false)
.hitTestBehavior(HitTestMode.None)
也就是说,凡是纯展示用途的覆盖层,都建议明确设置为不响应点击。
这是 ArkUI 层级开发里非常典型、也非常容易被忽略的问题。
4. 自定义仿玻璃效果

我们后来还尝试过做一个自定义液态玻璃比较组,希望作为向下兼容的对照展示。
但实践下来会发现两个问题:
- 自定义层如果颜色和透明度没拉开,会和原生 HDS 底栏混在一起
- 一旦它覆盖在 HDS 之上,又容易重新引入点击遮挡问题
最终结论很明确:
- 真正上线场景里,优先用原生 HDS 能力
- 自定义视觉层只适合作为实验或过渡方案
- 如果不是强需求,不建议在正式界面里叠太多"比较组"
如果目标不是"完全模拟沉浸光感",而是在不支持相关材质能力时保留一定的玻璃感,那么 TabBar 背景模糊 是一个更轻量的兜底方案。
官方给出的思路很简单:
ts
Tabs() {
// 页签内容
}
.barOverlap(true)
.barBackgroundBlurStyle(BlurStyle.Thin);
这个方案的优点是:
- 接入成本低
- 风险小
- 视觉效果比纯透明背景更自然
- 适合低能力设备或兼容环境
可以把它理解为:
沉浸光感是系统级材质表达背景模糊是轻量级视觉兜底
在实际项目中,两者并不是非此即彼,而是可以组合成一套兼容策略。
结语
HarmonyOS 6 的 HDS 悬浮页签与沉浸光感,本质上不是单个组件升级,而是导航与材质表达能力的一次系统化增强。
对开发者来说,它们最值得关注的地方不是"炫",而是:
- 更容易做出 HarmonyOS 6 风格界面
- 减少手工实现毛玻璃、阴影、高光的成本
- 提高导航与内容之间的层次统一性
但要真正落地好,仍然有几个关键点不能忽略:
- 先判断设备材质能力
- 关注系统版本生效范围
- 做好不支持场景的降级策略
- 重点排查展示层是否遮挡原生交互
如果这些点都处理好,悬浮页签与沉浸光感确实是一次非常值得尝试的 HarmonyOS 6 UI 升级方向。
参考文档
-
悬浮页签开发参考
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ui-design-hds-tabs-bar-floating
-
沉浸光感开发参考
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ui-design-hds-component-material
-
TabBar 背景模糊效果参考
可通过
barBackgroundBlurStyle(BlurStyle.Thin)实现毛玻璃兜底方案