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

最终效果

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

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

  1. 微信小程序自定义导航栏完整适配方案

    写这篇博客的背景 临近节日,产品想给小程序首页头部设置图片背景,这个只能自定义导航栏来实现 当然除了自定义背景图,还可以放置其他组件,按钮.搜索框等 实践部分设备状态栏.胶囊.间距的高度(仅供参考)( ...

  2. 微信小程序自定义导航栏(带汉堡包菜单)

    微信小程序自定义导航栏(带汉堡包菜单) 1.在app.json中 window配置navigationStyle (如果单独页面使用,可在页面的json文件配置) 2.计算相关值 整个导航栏的高度: ...

  3. 微信小程序自定义导航栏 navigation bar 返回键 首页

    微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键.首页键,动态设置标题,响应式组件 版本号:2.0.0 作者:chen-yt github: https://g ...

  4. 微信小程序自定义导航栏如何实现(简洁版)~内附代码

    先来张效果图 实现起来也是十分容易的,几行代码. Page({data: {},onLoad() {// 获取设备的信息let menuButtonObject = wx.getMenuButtonB ...

  5. 微信小程序-自定义导航栏

    微信小程序-自定义导航栏 第一步 添加属性 "navigationStyle": "custom" 第二步 自定义导航栏 第二步 自定义组件 第四步 使用组件 ...

  6. 微信小程序自定义导航栏组件

    效果图 首先要先在 json文件里加上 "navigationStyle":"custom", 这句,去掉原生的自定义导航栏 一.子组件-wxml <vi ...

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

    自定义微信小程序头部导航栏 自定义微信小程序头部导航栏,有几种方式 方式一 {"navigationStyle": "custom" // 将navigatio ...

  8. 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...

  9. 微信小程序自定义导航栏组件(完美适配所有手机),可自定义实现任何你想要的功能

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...

最新文章

  1. 脑细胞膜等效神经网路训练代码
  2. 用JS实现人脑和计算机交互,这个厉害了
  3. flex 图片旋转(解决公转和自转问题)
  4. iOS 常用公共方法
  5. 用计算机才能奏乐曲,计算机音乐系统和音乐听觉训练
  6. 腾讯视频客户端导出MP4格式
  7. (十二)nodejs循序渐进-高性能游戏服务器框架pomelo之创建一个游戏聊天服务器
  8. 第1章 Hello MFC
  9. 创建自定义Tabs组件-01
  10. Docker实战部署JavaWeb项目-基于SpringBoot
  11. 【com编程】IE浏览器(右键扩展功能总结版)
  12. Ubuntu 20.04部署minikube配置不上阿里云的minikube镜像
  13. (Ios 实战) 自定义UITableView
  14. 利用C#进行CAD二次开发
  15. 异地灾备,利用华为云就可以实现
  16. 安规电容(X电容,Y电容)的简单对比介绍
  17. 表单设计中标签的布局方式有哪些
  18. java中返回两个参数问题
  19. Idea Rebuild project
  20. Python数据分析——数据基础

热门文章

  1. mysql 修改字段名_常用的Mysql语句你知道多少?
  2. spring @Transactional事务未提交导致的并发问题
  3. 通过计算机培养学生的应用能力,计算机教学如何培养学生的应用能力
  4. 全能虚拟主机是什么?要多少钱?
  5. 手机隐藏的6个功能,你们不能错过
  6. 数字化农业的实战路线图
  7. 科学上网之后再次启动浏览器无法访问网页
  8. 软件开发环境搭建系列之sublime text的相关配置(九)
  9. 自学python的app_自学Python 有这些就够了
  10. 英语语法笔记——补充(八)