在作小程序時,關於默認導航欄,咱們遇到了如下的問題: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 | 經過 |