前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >微信小程序自定义导航栏兼容适配所有机型

微信小程序自定义导航栏兼容适配所有机型

作者头像
青年码农
发布2021-11-12 14:52:44
2.2K0
发布2021-11-12 14:52:44
举报
文章被收录于专栏:青年码农青年码农

目前小程序已在前端占了一席之地,最近公司项目上用的就是小程序开发,由于功能及页面不是很多,所以直接原生开发,毕竟坑可能会少点,在开发过程中,小程序自带导航栏和客户的设计稿导航栏排在一起,感觉很别扭,因此要求去掉微信的自带导航栏,微信提供了这方面的api,接下来我们就实操。

这是小程序官方文档截图,可以看到导航栏样式支持两种,默认是带导航栏,另外一种是自定义导航栏-custom,如果使用自定义导航栏,我们可以

全局配置

//app.json
"window": {
 "navigationStyle": "custom"
}

单页面配置

//page.json
{
 "navigationStyle": "custom"
}

效果对比

能明显的看出来,自定义导航栏页面内容已经顶到屏幕顶端,除了胶囊按钮,其他都是页面可控区域。每个手机的屏幕都不一样,各家系统的状态栏高度也不一样,因此,我们在开发页面时要考虑屏幕的适配,有刘海的,要留出刘海的距离,没有的,要把状态栏高度留出来。

1.获取导航栏高度及按钮位置

微信提供了获取导航栏高度的Api和胶囊按钮位置的Api

// 系统信息
const systemInfo = wx.getSystemInfoSync();
// 胶囊按钮位置信息
const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

在控制台打印出这两个Api返回结果

这里面我们只说几个我们接下来用到的参数。

statusBarHeight     // 状态栏高度
screenWidth         // 胶囊的宽度

top                 // 胶囊到顶部距离
height              // 胶囊的高度
right               // 胶囊距离右边的距离

通过这几个参数,我们可以计算出状态栏的高度,微信胶囊所占的高度(存在padding值,可以使元素和胶囊纵向居中)

首先在app.js中定义全局data-globalData

globalData: {
    navBarHeight: 0,     // 导航栏高度
    menuBotton: 0,       // 胶囊距底部间距(保持底部间距一致)
    menuRight: 0,        // 胶囊距右方间距(方保持左、右间距一致)
    menuHeight: 0,       // 胶囊高度(自定义内容可与胶囊高度保证一致)
},

新建个方法

setNavBarInfo() {
    // 获取系统信息
    const systemInfo = wx.getSystemInfoSync();
    // 胶囊按钮位置信息
    const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
    // 导航栏高度 = 状态栏到胶囊的间距(胶囊距上距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度
    this.globalData.navBarHeight = (menuButtonInfo.top - systemInfo.statusBarHeight) * 2 + menuButtonInfo.height + systemInfo.statusBarHeight;
    this.globalData.menuBotton = menuButtonInfo.top - systemInfo.statusBarHeight;
    this.globalData.menuRight = systemInfo.screenWidth - menuButtonInfo.right;
    this.globalData.menuHeight = menuButtonInfo.right;
 }

在onLaunch中调用,因为我这个项目是所有的导航都不用微信自带的,所以在app.js

中调用及设置data。

 onLaunch() {
    this.setNavBarInfo()
 },

到这里所需要用到的都已经存了起来,页面用法也比较简单,排除状态栏的高度,设置导航栏的高度和胶囊高度保持,用flex布局。

2.页面适配

首先page.js中定义变量

var app = getApp()
Page({
  /**
   * 页面的初始数据
   */
  data: {
    navBarHeight: app.globalData.navBarHeight, //导航栏高度
    menuBotton: app.globalData.menuBotton, //导航栏距离顶部距离
    menuRight: app.globalData.menuRight, //导航栏距离右侧距离
    menuHeight: app.globalData.menuHeight, //导航栏高度
  }
})

页面使用

<view class="nav" style="height:{{navBarHeight}}px;">
 <view class="nav-main">
 <!-- 胶囊区域 -->
 <view 
  class="capsule-box"  style="style="height:{{menuHeight+menuBotton*2}}px; min-height:{{menuHeight}}px; line-height:{{menuHeight}}px; bottom:0px;padding:0 {{menuRight}}px;">
 <!-- 导航内容区域 -->
  <slot></slot>
 </view>
 </view>
</view>

wxss

/* 公共导航 */
.nav {
  position: fixed;
  top: 0;
  left: 0;
  box-sizing: border-box;
  width: 100vw;
  z-index: 1000;
 }
 .nav-main {
  width: 100%;
  height: 100%;
  box-sizing: border-box;
  position: relative;
 }
 .nav .capsule-box {
  position: absolute;
  box-sizing: border-box;
  width: 100%;
  display: flex;
  align-items: center;
 }

最终效果

此种适配方案适应所有手机,应该说是最优的选择。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-11-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 青年码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云开发 CloudBase
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档