uni-app 中如何正确适配不同平台的导航栏高度?
我在用 uni-app 开发一个多端项目,发现 iOS、Android 和 H5 的导航栏高度都不一样。尝试用 uni.getSystemInfoSync() 获取状态栏高度,但组合起来还是对不齐。比如在 H5 上多出一截空白,在小程序里又盖住内容了。
目前我是这样写的:
const sys = uni.getSystemInfoSync();
const navHeight = sys.statusBarHeight + 44; // 假设导航栏是44px
this.navTop = navHeight + 'px';
但实际效果很不稳定,有没有统一的方案或者官方推荐的适配方式?是不是应该用 uni.getMenuButtonBoundingClientRect() 来计算?
第一步,先获取基础信息:
第二步,处理小程序特有的胶囊按钮位置(这里需要注意,只有微信和百度小程序需要这个):
第三步,计算最终的导航栏高度(核心逻辑在这):
解释下为什么这样处理:
1. 小程序必须用getMenuButtonBoundingClientRect获取胶囊按钮位置,因为这是微信的固定设计规范
2. H5和App用标准值44/48,这是各平台UI规范推荐的尺寸
3. 那个8px的底部间距是为了防止内容太贴近胶囊按钮
实际使用时建议封装成工具函数:
最后吐槽一句,uni-app的导航栏适配真是每个平台一个样,微信小程序最变态。我们项目最后还加了环境判断才彻底搞定,如果你发现还有问题,可能是少了特定平台的判断。
正确的姿势是要区分处理:
1. 小程序用
uni.getMenuButtonBoundingClientRect()获取胶囊按钮信息2. H5直接用
uni.getSystemInfoSync().statusBarHeight加个固定值3. App端要考虑状态栏和标题栏两部分
我最后用的方案是这样的:
血泪教训:千万不要在H5用小程序那套计算方式,否则会出现诡异的空白。还有记得用条件编译区分平台,这玩意跨平台不统一就是坑爹。
实际用的时候把这个高度赋给页面容器的padding-top就行,别用margin,我遇到过滚动穿透的问题。