在作小程序时,关于默认导航栏,咱们遇到了如下的问题:html
小程序自定义导航栏已开放许久>>了解一下,相信很多小伙伴已使用过这个功能,同时很多小伙伴也会发现一些坑:android
为了搞明白原理,我先去翻了官方文档,>>飞机,点过去是否是很惊喜,很意外,通篇大文尽然只有最下方的一张图片与这个问题有关,而且啥也看不清,汗汗汗...ios
我特地找了一张图片来 git
咱们写一个状态栏,经过wx.getSystemInfoSync().statusBarHeight设置高度github
Android: npm
能够看出,iOS胶囊按钮与状态栏之间距离为:4px, Android为8px,是否是全部手机都是这种状况呢? 答案是:苹果手机确实都是4px,安卓大部分都是7和8 也会有其余的状况(能够本身打印getSystemInfo验证)如何快速便捷算出这个高度,请接着往下看小程序
导航栏分为状态栏和标题栏,只要能算出每台手机的导航栏高度问题就迎刃而解bash
注:因为胶囊按钮是原生组件,为表现一致,其单位在各类手机中都为px,因此咱们自定义导航栏的单位都必需是px(切记不能用rpx),才能完美适配。微信
如今咱们明白了原理,能够利用胶囊按钮的位置信息和statusBarHeight高度动态计算导航栏的高度,贴一个实现此功能最重要的方法app
let systemInfo = wx.getSystemInfoSync();
let rect = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null; //胶囊按钮位置信息
wx.getMenuButtonBoundingClientRect();
let navBarHeight = (function() { //导航栏高度
let gap = rect.top - systemInfo.statusBarHeight; //动态计算每台手机状态栏到胶囊按钮间距
return 2 * gap + rect.height;
})();
复制代码
gap信息就是不一样的手机其状态栏到胶囊按钮间距,具体更多代码实现和使用demo请移步下方代码仓库,代码中还会有输入框文字跳动解决办法,安卓手机输入框文字飞出解决办法,左侧按钮边框太粗解决办法等等
这么重要的问题,官方尽然没有提供解决方案...居然提供了一张看不清的图片???
网上有不少ios设置44,android设置48,还有根据不一样的手机型号设置不一样高度,经过长时间的开发和尝试,本人发现以上方案并不完美,而且bug不少
斗鱼:
虎牙:
微博:
酷狗:
知乎:
知乎是这里边作的最好的,可是我我的认为有几个能够优化的小问题
若是您看到了此篇文章,请赶快修改本身的代码,并运用在实践中吧
扫码体验个人小程序:
手机型号 | 胶囊位置信息 | statusBarHeight | 测试状况 |
---|---|---|---|
iPhoneX | 80 32 281 369 48 88 | 44 | 经过 |
iPhone8 plus | 56 32 320 408 24 88 | 20 | 经过 |
iphone7 | 56 32 281 368 24 87 | 20 | 经过 |
iPhone6 plus | 56 32 320 408 24 88 | 20 | 经过 |
iPhone6 | 56 32 281 368 24 87 | 20 | 经过 |
HUAWEI SLA-AL00 | 64 32 254 350 32 96 | 24 | 经过 |
HUAWEI VTR-AL00 | 64 32 254 350 32 96 | 24 | 经过 |
HUAWEI EVA-AL00 | 64 32 254 350 32 96 | 24 | 经过 |
HUAWEI EML-AL00 | 68 32 254 350 36 96 | 29 | 经过 |
HUAWEI VOG-AL00 | 65 32 254 350 33 96 | 25 | 经过 |
HUAWEI ATU-TL10 | 64 32 254 350 32 96 | 24 | 经过 |
HUAWEI SMARTISAN OS105 | 64 32 326 422 32 96 | 24 | 经过 |
XIAOMI MI6 | 59 28 265 352 31 87 | 23 | 经过 |
XIAOMI MI4LTE | 60 32 254 350 28 96 | 20 | 经过 |
XIAOMI MIX3 | 74 32 287 383 42 96 | 35 | 经过 |
REDMI NOTE3 | 64 32 254 350 32 96 | 24 | 经过 |
REDMI NOTE4 | 64 32 254 350 32 96 | 24 | 经过 |
REDMI NOTE3 | 55 28 255 351 27 96 | 20 | 经过 |
REDMI 5plus | 67 32 287 383 35 96 | 28 | 经过 |
MEIZU M571C | 65 32 254 350 33 96 | 25 | 经过 |
MEIZU M6 NOTE | 62 32 254 350 30 96 | 22 | 经过 |
MEIZU MX4 PRO | 62 32 278 374 30 96 | 22 | 经过 |
OPPO A33 | 65 32 254 350 33 96 | 26 | 经过 |
OPPO R11 | 58 32 254 350 26 96 | 18 | 经过 |
VIVO Y55 | 64 32 254 350 32 96 | 24 | 经过 |
HONOR BLN-AL20 | 64 32 254 350 32 96 | 24 | 经过 |
HONOR NEM-AL10 | 59 28 265 352 31 87 | 24 | 经过 |
HONOR BND-AL10 | 64 32 254 350 32 96 | 24 | 经过 |
HONOR duk-al20 | 64 32 254 350 32 96 | 24 | 经过 |
SAMSUNG SM-G9550 | 64 32 305 401 32 96 | 24 | 经过 |
360 1801-A01 | 64 32 254 350 32 96 | 24 | 经过 |