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

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

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


image.png

添加描述

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

全局配置

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

单页面配置

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

效果对比

image.png

添加描述

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

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

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

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

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

image.png

添加描述

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

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;}

最终效果

image.png

添加描述

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

相关文章
|
1月前
|
消息中间件 编解码 开发者
深入解析 Flutter兼容鸿蒙next全体生态的横竖屏适配与多屏协作兼容架构
本文深入探讨了 Flutter 在屏幕适配、横竖屏切换及多屏协作方面的兼容架构。介绍了 Flutter 的响应式布局、逻辑像素、方向感知、LayoutBuilder 等工具,以及如何通过 StreamBuilder 和 Provider 实现多屏数据同步。结合实际应用场景,如移动办公和教育应用,展示了 Flutter 的强大功能和灵活性。
130 6
|
4月前
|
前端开发
移动端适配问题
【8月更文挑战第6天】
57 4
|
4月前
|
前端开发 JavaScript
移动端适配
【8月更文挑战第4天】
45 4
|
4月前
|
Web App开发 前端开发
什么是移动端适配
【8月更文挑战第2天】
|
前端开发 Android开发
前端项目实战壹-安卓4.4/6.0无法安装非原生项目无法渲染样式
前端项目实战壹-安卓4.4/6.0无法安装非原生项目无法渲染样式
65 0
|
小程序 JavaScript 数据安全/隐私保护
适配最新微信小程序隐私协议开发指南,兼容uniapp版本
前一阵微信小程序官方发布了一个用户隐私保护指引填写说明,说是为了规范开发者的用户个人信息处理行为,保障用户合法权益,小程序、插件中涉及处理用户个人信息的开发者,均需补充相应用户隐私保护指引
193 0
|
iOS开发
移动端iPhone系列适配问题的一些坑
移动端iPhone系列适配问题的一些坑
106 0
uniapp实现微信小程序横屏适配问题demo效果(整理)
uniapp实现微信小程序横屏适配问题demo效果(整理)
|
小程序
原生微信小程序的一些注意点
原生微信小程序的一些注意点
90 0
|
编解码 前端开发
基本的移动端适配
一个项目一般拥有移动端和pc端的产品图 我们为了减少工作量会在开发pc端时同时使它适配移动端
115 2
下一篇
DataWorks