blurEffect 仅对 pages.json 中 tabBar 生效,需配置 blurEffect 值、safearea 底部偏移为 none,并用透明色背景;顶部模糊需用 backdrop-filter(条件编译降级)或视觉模拟方案。

blurEffect 配置必须在 pages.json 的 tabBar 节点下,不是 navigationStyle: custom 页面用的
很多人一上来就在 navigationStyle: "custom" 的页面里折腾高斯模糊,结果发现完全没效果——因为 blurEffect 是原生 tabBar 的专属能力,只对 pages.json 中配置的 tabBar 生效,和自定义导航栏无关。它本质是让 tabBar 区域叠加一层系统级毛玻璃效果,不是 CSS filter。
所以如果你要的是「顶部状态栏+导航栏」区域的模糊(比如首页顶部吸顶搜索栏带虚化背景),blurEffect 不适用;但如果你要的是「底部 tabBar」带模糊(例如首页 tab 切换时底部半透毛玻璃),那必须确保:
-
pages.json中已声明tabBar,且包含"blurEffect": "extralight"或"light"或"dark" -
manifest.json的app-plus节点下配置了"safearea": {"bottom": {"offset": "none"}},否则全面屏机型 tabBar 会被遮挡 - 不要同时设置
tabBar.backgroundColor为不透明色(如"#ffffff"),否则模糊不可见;若需底色,必须用rgba(255,255,255,0.7)这类带透明度的值
自定义顶部导航栏实现“伪模糊”背景的可行路径
真机上无法对 view 层直接加系统级 blur(iOS 仅允许 UIVisualEffectView,Android 无统一 API),所以常见做法是“视觉模拟”:用半透色 + 毛玻璃质感图片/渐变 + 内容错位营造层次感。关键不是追求像素级模糊,而是让用户感知“通透、沉浸、不割裂”。
实操建议:
- 背景不用纯色,改用
background: linear-gradient(135deg, rgba(255,255,255,0.8), rgba(255,255,255,0.6)), url('/static/bg-blur-fallback.png'),fallback 图是预渲染的模糊图(尺寸 2x,适配 retina) - 导航栏容器设
backdrop-filter: blur(10px),但注意:app-plus和微信小程序不支持该 CSS 属性,必须用#ifdef APP-PLUS/#ifdef MP-WEIXIN条件编译降级为纯色或渐变 - 内容区域(如标题、图标)需要加
z-index: 2,否则在 backdrop-filter 下会变灰发虚;iOS 上尤其要注意文字阴影(text-shadow)会导致边缘糊成一团,慎用
滚动时动态控制模糊强度,别靠 scrollTop 算 opacity
想实现“下拉时导航栏从透明渐变为半透模糊”,很多人直接用 onPageScroll 监听 scrollTop 然后插值算 opacity,这会导致 iOS 上文字闪烁、安卓键盘弹起后位置错乱。根本问题是 opacity 作用于整个 view,而模糊是背景层的事。
更稳的做法是分层控制:
- 固定一个
<view class="nav-bg">作为模糊背景层,用transform: translateY()控制其进入视口的时机(不改变文档流) - 另起一个
<view class="nav-content">放标题、按钮等,始终 fixed 定位,只控制其opacity和color - 模糊强度用 class 切换:
blur-sm/blur-md/blur-lg,每个 class 对应不同backdrop-filter值或 fallback 背景图,避免 runtime 动态拼字符串 - 临界值别用固定 100px,改用
uni.getSystemInfoSync().statusBarHeight + 44(44 是常规导航栏高度),适配不同机型
iOS 状态栏文字颜色与模糊背景联动容易失效
uni.setNavigationBarColor 在 navigationStyle: "custom" 下完全无效,iOS 状态栏字体颜色只能靠 uni.setStatusBarStyle('light') 或 'dark' 控制。但问题在于:模糊背景亮度是动态的,你不能只在 onLoad 设一次。
必须和导航栏视觉状态强绑定:
- 监听
onPageScroll或使用watch观察模糊强度变量(如blurLevel) - 当
blurLevel > 0.5且背景主色偏亮(可用getComputedStyle抽样中心点 RGB 判断)时,调用uni.setStatusBarStyle('dark') - 务必包一层
if (uni.getSystemInfoSync().platform === 'ios'),Android 调用该 API 会静默失败,还可能触发白屏 - 首次进入页面时,也要在
onReady补一次判断,否则冷启动时状态栏颜色滞后
最易被忽略的是:模糊背景在深色模式下可能整体提亮,但状态栏文字仍为 light,导致看不见。这不是代码 bug,是设计未覆盖暗色场景——得在主题切换时重算模糊层的 base color。


















