小工具知识网

当前位置: 首页 > 行业知识 > 微信小程序如何实现自定义导航栏、导航栏手机适配(获取导航栏、状态栏高度和胶囊位置)以及踩过的坑

行业知识

微信小程序如何实现自定义导航栏、导航栏手机适配(获取导航栏、状态栏高度和胶囊位置)以及踩过的坑

2026-11-14 17:35:43 来源:互联网转载

背���:不用官方默认的导航栏,想用自己自定义的

实现效果:

关键词:顶部状态栏、顶部导航栏、顶部状态导航栏、胶囊

原理:

自定义导航栏无非就是求得导航栏高度,并让内容容器垂直方向居中于导航栏高度

1.获取手机系统状态栏高度

2.获取胶囊位置(包括高度)

3.求得导航栏高度(导航栏高度实际上就是胶囊高度+高度差*2)

高度差 = 胶囊位置到屏幕顶部距离(menu.top,menu为胶囊位置对象)-状态栏高度(直接获取res.statusBarHeight)

(所有单位长度默认px)

     // 获取手机系统信息     wx.getSystemInfo({      success: res => {             // 手机系统状态栏高度        wx.setStorageSync('statusBarHeight', res.statusBarHeight)        const platform = res.platform        const menu =  wx.getMenuButtonBoundingClientRect()        //menu为胶囊,判断是否能读到胶囊位置,读不到则用具体一般数值表示        if (menu) {          wx.setStorageSync('menu', menu)          // 导航栏高度          wx.setStorageSync('navBarHeight', menu.height+(menu.top-res.statusBarHeight) *2 )          // 状态栏加导航栏          wx.setStorageSync('navStatusBarHeight', res.statusBarHeight+ menu.height+(menu.top-res.statusBarHeight) *2 )        }else{          wx.setStorageSync('menu', null)          // 导航栏高度          wx.setStorageSync('navBarHeight', platform === 'android' ? 48 : 44)           // 状态栏加导航栏           wx.setStorageSync('navStatusBarHeight', res.statusBarHeight+ (platform === 'android' ? 48 : 44) )        }      }, fail(err) {        console.log(err);      }    })

那么如何保持胶囊位置左边的搜索图标呢?

获取到胶囊到屏幕左侧的值,意思是menu.left,让容器等于这个menu.left值,然后让图标水平靠右即可

示例代码:

wxml

                          翡翠世界        交易走淘宝 | 48H鉴赏期                          

js

  data: {    // 状态栏高度    statusBarHeight: wx.getStorageSync('statusBarHeight'),    // 导航栏高度    navBarHeight: wx.getStorageSync('navBarHeight'),    // 导航栏和状态栏高度    navStatusBarHeight: wx.getStorageSync('navStatusBarHeight'),    // 胶囊    menu:wx.getStorageSync('menu')  },

wxss

/* 自定义导航栏 */.navigation-container {  position: fixed;  width: 100%;  z-index: 99;  background-color: rgb(28, 190, 96);}.navigation-bar {  position: relative;  width: 100%;  display: flex;  flex-direction: row;  color: #333333;}.nav-title {  display: flex;    margin-left: 20rpx;  box-sizing: border-box;}.nav-search {  position: absolute;  display: flex;  justify-content: flex-end;  align-items: center;}.bg-logo {  width: 300rpx;  display: flex;  flex-direction: column;  color: #f7f7f7;  position: absolute;  top: 0;  left:20rpx;}

踩过的坑

1.误用rpx,因为想着适配一下手机设备高度,就将设备获取到的高度×2,再把单位换成rpx,这会导致“不可预料的事情发生”,后面导航栏那块高度就统一用px了,字体当然也用px了,其实在计算导航栏的时候以及根据设备来计算出px值了,实际上已经适配过一次高度,字体大小另说。

2.系统获取到的胶囊位置,距离右屏幕的值是个未解之谜,理论上是很小的,但是获取到的right大到有几百,本来我是想通过这个属性来计算搜索图标的位置的,right比left还要大就很奇怪。

上一篇:Ubuntu版本深度解析,最新特性与优势探索

下一篇:传奇服务器在哪里开发?