微信小程序自定义导航栏胶囊菜单按钮高度适配问题

在自定义小程序导航栏时,右上角的胶囊(MenuButton)在不同机型测试,会发现很难适配。

实测中 不同的手机,胶囊高度不一样、状态栏高度不一样。与模拟器显示的情况是不一样的。

扫码演示:
在这里插入图片描述

为解决这个问题就要搞清楚原理在这里插入图片描述
这是在没有设置自定义时的原生导航栏,我们发现整体的高度就是 (状态栏高度 + 导航栏高度)

而状态栏高度可以通过 wx.getSystemInfo()获取,现在就只用解决导航栏高度了
观察发现,胶囊顶部高度距导航栏顶部高度的高度差 和 胶囊底部高度距导航栏底部高度的高度差,是一样的
也就是说 导航栏高度 = 胶囊高度 +(高度差)x 2
而胶囊信息可以通过 wx.getMenuButtonBoundingClientRect() 获取,现在就只用解决高度差了
wx.getMenuButtonBoundingClientRect() 中也返回了胶囊顶部距屏幕顶部距离的信息(top)
所以知 高度差 = 胶囊顶部距屏幕顶部距离 - 状态栏高度

输出wx.getMenuButtonBoundingClientRect和wx.getSystemInfo()
在这里插入图片描述

先看一些小程序顶部导航栏适配的情况
在这里插入图片描述
app.js

//app.js
App({
  globalData: {},
  onLaunch: function() {
    //获取系统信息
    wx.getSystemInfo({
      success: res => {
        this.system = res
      }
    })
    //获取胶囊信息
    this.menu = wx.getMenuButtonBoundingClientRect()
    //打印数据
    console.log('系统信息', this.system)
    console.log('胶囊信息', this.menu)
  }
})

组件.js

//获取应用实例
const app = getApp()
 
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    //导航栏颜色
    navColor: {
      type: String,
      value: '#fff'
    }
  },
 
  /**
   * 组件的初始数据
   */
  data: {
    s: app.system.statusBarHeight, //状态栏高度
    n: (app.menu.top - app.system.statusBarHeight) * 2 + app.menu.height, //导航栏高度
    h: app.menu.height //胶囊高度
  }
})

组件.wxml

<cover-view class='nav_box' style='background:{{navColor}}'>
  <cover-view style='height:{{s}}px' />
  <cover-view class='navBar' style='height:{{n}}px'>
    <cover-view class='content' style='height:{{h}}px'>
 
      <!-- 导航自定义内容 -->
      <!-- 1. 插槽 可在使用页面插入所需内容 -->
      <slot></slot>
 
      <!-- 2. 选择渲染 可在js页面 设置渲染type属性 不同场景传不同值 -->
      <block wx:if='{{type == 0}}'>
        导航一
      </block>
      <block wx:if='{{type == 1}}'>
        导航二
      </block>
      <block  wx:else>
        导航三
      </block>
 
    </cover-view>
  </cover-view>
</cover-view>
<view style='height:{{s+n}}px' /> <!-- 注:占位用 -->

组件. wxss

.nav_box {
  position: fixed;
  width: 100%;
  font-size: 15px;
  z-index: 999;
}
 
.navBar {
  display: flex;
  align-items: center;
  padding: 0 10px;
}
 
.content {
  width: 100%;
  display: flex;
  align-items: center;
  background: green;
}

组件使用页面.json

{
  "navigationStyle": "custom", //设置自定义导航
  "usingComponents": {
    "navBar": "../../组件/navBar/navBar" //自己的路径
  }
}
  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值