微信小程序自定义导航栏机型适配--底部Tabbar--view高度--底部按钮适配

本文介绍了微信小程序中自定义头部导航栏的两种方法,包括全局沉浸式导航栏和使用 vant 组件。同时,针对不同机型的适配问题,提供了根据胶囊高度和小程序头部高度计算内容顶部距离的解决方案。此外,还讲解了动态获取 view 宽高、底部 Tabbar 高度以及底部按钮的适配策略,特别是如何处理 iPhoneX 系列设备的安全区域问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义微信小程序头部导航栏

在这里插入图片描述
自定义微信小程序头部导航栏,有几种方式

方式一
{
  "navigationStyle": "custom" // 将navigationStyle从默认default改为custom
}

定义此方法后,头部的导航栏会去掉,导航栏下的元素会直接向上移动到原导航栏的位置,可以再app.json配置成全局沉浸式导航栏,以及在单页面配置沉浸式导航栏。

方式二

使用组件
这里使用vant组件作为演示
在这里插入图片描述
在这里插入图片描述
组件配置的NavBar,样式在官方文档上有说明,根据文档说明修改样式即可。
官方文档:https://vant-contrib.gitee.io/vant-weapp/#/nav-bar

机型适配

由于自定义navBar了,导航栏下面的元素会直接向上偏移,需要离顶部的距离才可以恢复到正常的位置,此时设置的距离根据不同的机型,位置也会不同,所以这里就需要做到机型适配。
方式一:
根据微信小程序胶囊到顶部以及胶囊的高度,算出navBar下的内容到顶部的距离

// js
let pillHeight = wx.getMenuButtonBoundingClientRect().top  // 胶囊到顶部的高度
let pill = wx.getMenuButtonBoundingClientRect().height  // 胶囊的高度
this.setData({topHeight : pillHeight +pill })

// 页面   动态设置margin-top高度
 <view class="content_bg" style="margin-top: {{capsuleHeight}}px;">内容</view>

方式二:
根据小程序头部的高度加导航高度的距离动态计算内容到顶部的距离

// js
 wx.getSystemInfo({
        success: res => {
          let navWindowHeight = res.statusBarHeight + 46; // 小程序头部的高度 + 导航高度
          this.setData({capsuleHeight : navWindowHeight })  // 赋值高度
        }, fail(err) {
      console.log(err);
    }
// 页面
<view class="content_bg" style="margin-top: {{capsuleHeight }}px;">内容</view>

由于机型的不同,动态计算的高度也不同,不同机型对胶囊到顶部的高度都有差异,而且获取到的胶囊到顶部或者小程序头部的高度的值单位是 px ,所以直接将获取到的值赋值给距离顶部的距离即可,否则在动态计算高度的时候,px不会动态适配屏幕的大小变化,目前来说用方式二适配率高一些,在开发的时候需要根据实际情况,做不同的调整。


动态获取view的宽高

根据viewclassid名动态获取view的宽高信息

<view class="box"></view>

// 获取宽高信息
getNavInfo(){
   let that = this
   const query = wx.createSelectorQuery();
   query.select('.box').boundingClientRect(function (res) {
     console.log(res);
   }).exec()
},

在这里插入图片描述


动态获取底部Tabbar的高度

screenHeight :屏幕高度,单位px
safeArea.bottom:安全区域右下角纵坐标

官方文档已有说明:https://developers.weixin.qq.com/miniprogram/dev/api/base/system/wx.getSystemInfo.html

    wx.getSystemInfo({
      success: (res) => {
        this.setData({
          tabBarHeight : res.screenHeight - res.safeArea.bottom + 50
        })
      }
    })

将计算出来的tabBatHeight直接写在页面的行内样式中即可


底部按钮的适配

由于用户的机型不同,微信小程序底部的高度计算规则也不同,现在的机型分为两种,一种是安卓机,一种是ios机型,安卓机的适配在开发者工具上的预览机型相当于iphone5,而ios机型在开发者工具上的预览相当与iphone12或以上,这其实只是一个预估值,可以将它统称为iphoneX,导致机型不适配的原因是因为苹果 iPhoneX 、iPhone XR等设备上,物理Home键被取消,改为底部小黑条替代home键功能。
在这里插入图片描述
在安卓机型上是直接忽略掉该小黑条的,而iPhoneX及以上设备则会计算该小黑条的高度,这就导致一套css方案在不同的机型上会有适配问题,解决适配问题的方案可以使用苹果官方提供的css样式:

padding-bottom: constant(safe-area-inset-bottom); /*兼容 IOS<11.2*/
padding-bottom: env(safe-area-inset-bottom); /*兼容 IOS>11.2*/

该样式可以兼容iPhone设备的底部高度,但是安卓机型并不兼容,所以需要在给底部的高度再加一个padding-bottom:10rpx;让底部的按钮撑起一个安全距离。下面是完整的代码示例:

<view class="baseBottom">
   <view class="bottomCase">提交</view>
   <view class="isIPhoneXRegexBottom"></view>
</view>
.outStore{
  position: fixed;  /* 固定在底部 */
  bottom: 0;
  left: 0;
  width: 100vw;
  background-color: white;
  .bottomCase{
    width: calc(100% - 52rpx);
    height: 76rpx;
    margin: 0 auto;
    margin-top: 12rpx;
    text-align: center;
    line-height:76rpx
    margin-bottom: 10rpx; /* 10px适配安卓机型 */
  }
}
/* 安全距离-全局的style文件,在页面直接调用即可 */
.isIPhoneXRegexBottom {
  padding-bottom: constant(safe-area-inset-bottom) !important;   /*兼容 IOS<11.2*/
  padding-bottom: env(safe-area-inset-bottom) !important;  /*兼容 IOS>11.2*/
  background-color: transparent;  /* 透明色 */
}

原理就是在底部按钮下方设置一个view块,该块会自动适配iPhone机型,将按钮上方顶住,以保持安全距离。由于苹果官方提供的方法安卓机型不适配,所以需要只用marginpadding来将底部按钮撑起一个安全高度。
在不同机型下的效果:
iPhone机型
在这里插入图片描述
安卓机型:
在这里插入图片描述

### 实现中间凸起 Tabbar 导航栏 在 uni-app 开发的微信小程序中实现带有中间凸起按钮底部导航栏,可以通过自定义 `tabBar` 并结合 CSS 和 JavaScript 来完成。以下是具体方法: #### HTML 结构 创建页面结构并引入必要的组件。 ```html <template> <view class="container"> <!-- 自定义 tabBar --> <view class="custom-tab-bar" :style="{ bottom: isTabFixed ? '0' : '-50px' }"> <navigator url="/pages/index/index" open-type="switchTab" hover-class="none" class="tab-item" :class="[currentPage === '/pages/index/index' ? 'active' : '']"> <image src="/static/tabbar/home.png"></image> <text>首页</text> </navigator> <navigator url="/pages/cart/cart" open-type="switchTab" hover-class="none" class="tab-item raised-button" @click="handleRaisedButtonClick()"> <image src="/static/tabbar/add.png"></image> </navigator> <navigator url="/pages/user/user" open-type="switchTab" hover-class="none" class="tab-item" :class="[currentPage === '/pages/user/user' ? 'active' : '']"> <image src="/static/tabbar/user.png"></image> <text>我的</text> </navigator> </view> <!-- 页面主体内容 --> <view class="page-content"> <!-- 这里放置页面的主要内容 --> </view> </view> </template> ``` #### 样式设计 通过 CSS 定义样式来使中间按钮呈现为圆形且突出显示。 ```css <style scoped> .custom-tab-bar { position: fixed; width: 100%; height: 50px; background-color: white; display: flex; justify-content: space-around; align-items: center; box-shadow: 0 -2px 8px rgba(0, 0, 0, .1); } .tab-item { text-align: center; font-size: 12px; } .raised-button { position: absolute; left: 50%; transform: translateX(-50%) translateY(-50%); border-radius: 50%; padding: 10px; background-color: #ff6f61; /* 颜色可根据需求调整 */ color: white; } </style> ``` #### JS逻辑处理 编写脚本控制当前选中的页面以及响应点击事件。 ```javascript <script> export default { data() { return { currentPage: getCurrentPages().pop().route, isTabFixed: true // 控制 tabBar 是否固定到底部 }; }, methods: { handleRaisedButtonClick() { console.log('Middle button clicked'); // 可在此处添加更多交互逻辑 } }, onLoad(options) { this.currentPage = options.page || '/'; } }; </script> ``` #### pages.json配置 确保在项目的 `pages.json` 文件内正确设置 tabBar 的路径和其他属性。 ```json { "path": "pages/index/index", "style": { "navigationBarTitleText": "首页", ... }, "tabBar": { "list": [ { ... }, // 对应于各个选项卡的信息对象数组 { "pagePath": "pages/middleButtonPage/middleButtonPage", // 中间按钮关联的页面路径 "iconPath": "/static/tabbar/add.png", "selectedIconPath": "/static/tabbar/add-active.png", "text": "" }, { ... } ], "color": "#9B9B9B", "selectedColor": "#3cc51f", "borderStyle": "black", "backgroundColor": "#ffffff" } } ``` 上述代码片段展示了如何构建一个具有独特视觉效果的 tab bar,在其中央位置有一个特别设计过的按钮[^1]。此方案不仅适用于微信小程序环境下的应用开发,同时也能够很好地适配其他平台的需求[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值