小程序自定义导航栏兼容适配所有机型(附完整案例)


Posted in Javascript onApril 26, 2020

前言

大部分情况下我们都是使用微信官方自带的 navigationBar 配置 ,但有时候我们需要在导航栏集成搜索框、自定义背景图、返回首页按钮等。

思路

  • 隐藏官方导航栏
  • 获取胶囊按钮、状态栏相关数据以供后续计算
  • 根据不同机型计算导航栏高度
  • 编写新的导航栏
  • 页面引用自定义导航

正文

隐藏官方导航栏

隐藏导航栏可以全局配置,也可以单独页面配置,具体根据业务需求来。

小程序自定义导航栏兼容适配所有机型(附完整案例)

全局隐藏

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

页面隐藏

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

获取胶囊按钮、状态栏相关数据以供后续计算

公式:导航栏高度 = 状态栏到胶囊的间距(胶囊距上边界距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度。 由公式得知,我们需要获取 状态栏高度 胶囊高度 胶囊距上距离

注:状态栏到胶囊的间距 = 胶囊到下边界距离。所以这里需要*2

小程序自定义导航栏兼容适配所有机型(附完整案例)

状态栏高度

wx.getSystemInfoSync() 官方API 可以获取系统相关信息, statusBarHeight 属性可以获取到状态栏高度

const statusBarHeight = wx.getSystemInfoSync().statusBarHeight;

胶囊高度和胶囊距上边界距离

wx.getMenuButtonBoundingClientRect() 官方API 可以获取菜单按钮胶囊按钮的布局位置信息。

小程序自定义导航栏兼容适配所有机型(附完整案例)

const menuButtonInfo = wx.getMenuButtonBoundingClientRect();//胶囊相关信息
const menuButtonHeight = menuButtonInfo.height //胶囊高度
const menuButtonTop = menuButtonInfo.top//胶囊距上边界距离

实例

一般情况下,我们需要在运用启动的初始化生命周期钩子进行计算相关的数据,也就是入口文件 app.jsonLaunch 生命周期钩子

//app.js
App({
 onLaunch: function () {
 this.setNavBarInfo()
 },
 
 globalData: {
 //全局数据管理
 navBarHeight: 0, // 导航栏高度
 menuBotton: 0, // 胶囊距底部间距(保持底部间距一致)
 menuRight: 0, // 胶囊距右方间距(方保持左、右间距一致)
 menuHeight: 0, // 胶囊高度(自定义内容可与胶囊高度保证一致)
 },

 /**
 * @description 设置导航栏信息
 */
 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.height;
 }
})

页面引用自定义导航

//page.wxml
<view class="nav" style="height:{{navBarHeight}}px;">
 <!-- 胶囊区域 -->
 <view class="capsule-box" style="height:{{menuHeight}}px; min-height:{{menuHeight}}px; line-height:{{menuHeight}}px; bottom:{{menuBotton}}px;">
 <view class="nav-handle">
  <image class="nav-back-icon" src="/images/nav_back.png" bind:tap="navToBackLastPage"></image>
  <image class="nav-home-icon" src="/images/nav_home.png" bind:tap="navToHomePage"></image>
 </view>
 <view class="nav-title">导航标题</view>
 </view>
</view>
// page.js
const app = getApp()
Page({

 /**
 * 页面的初始数据
 */
 data: {
 navBarHeight: app.globalData.navBarHeight,//导航栏高度
 menuBotton: app.globalData.menuBotton,//导航栏距离顶部距离
 menuHeight: app.globalData.menuHeight //导航栏高度
 }

封装成组件

我们可能在各自的页面实现不一样的效果,比如在导航栏添加搜索框,日期等,这个时候我们就可以封装一个自定义组件,大大提高我们的开发效率。

小程序自定义导航栏兼容适配所有机型(附完整案例)

小程序自定义导航栏兼容适配所有机型(附完整案例)

新建component

// components/navigation/index.wxml
<view class="nav" style="height:{{navBarHeight}}px;">
 <view class="nav-main">
 <!-- 胶囊区域 -->
 <view 
  class="capsule-box" 
  style="height:{{menuHeight}}px; min-height:{{menuHeight}}px; line-height:{{menuHeight}}px; bottom:{{menuBotton}}px;left:{{menuRight}}px;"
 >
 <!-- 导航内容区域 -->
  <slot></slot>
 </view>
 </view>
</view>
// components/navigation/index.wxss
.nav {
 position: fixed;
 top: 0;
 left: 0;
 width: 100vw;
}
.nav-main {
 width: 100%;
 height: 100%;
 position: relative;
}
.nav .capsule-box {
 position: absolute;
 box-sizing: border-box;
 width: 100%;
}
// components/navigation/index.js
const app = getApp()
Component({
 /**
 * 组件的初始数据
 */
 data: {
 navBarHeight: app.globalData.navBarHeight, //导航栏高度
 menuRight: app.globalData.menuRight, // 胶囊距右方间距(方保持左、右间距一致)
 menuBotton: app.globalData.menuBotton,
 menuHeight: app.globalData.menuHeight
 }
})

页面引用

页面配置引入该自定义组件

//index.json
{
 "navigationStyle": "custom",
 "navigationBarTextStyle": "white",
 "usingComponents": {
 "navigation": "/components/Navigation/index"
 }
}

页面中使用

<!-- 自定义导航 -->
<navigation>
 <view class="current-date">
  <text>4月24日</text>
 </view>
</navigation>

总结

本文主要是写自定义导航基础的东西,重点在于怎么计算自定义导航的,具体的业务和样式还需要根据自身产品来设定。如有什么问题,欢迎提出一起学习。

到此这篇关于小程序自定义导航栏兼容适配所有机型(附完整案例)的文章就介绍到这了,更多相关小程序自定义导航栏内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
Javascript高级技巧分享
Feb 25 Javascript
常用jQuery代码分享
Jul 14 Javascript
JS实现灵巧的下拉导航效果代码
Aug 25 Javascript
JavaScript常用数组算法小结
Feb 13 Javascript
微信小程序 location API实例详解
Oct 02 Javascript
js初始化验证实例详解
Nov 26 Javascript
angular 动态组件类型详解(四种组件类型)
Feb 22 Javascript
angularjs中回车键触发某一事件的方法
Apr 24 Javascript
基于JavaScript实现多级菜单效果
Jul 25 Javascript
微信小程序自定义toast实现方法详解【附demo源码下载】
Nov 28 Javascript
微信小程序图片选择区域裁剪实现方法
Dec 02 Javascript
JS可断点续传文件上传实现代码解析
Jul 30 Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
Apr 26 #Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 #Javascript
详解关于Vue单元测试的几个坑
Apr 26 #Javascript
es6函数之箭头函数用法实例详解
Apr 25 #Javascript
es6数组之扩展运算符操作实例分析
Apr 25 #Javascript
es6函数之尾调用优化实例分析
Apr 25 #Javascript
es6函数之尾递归用法实例分析
Apr 25 #Javascript
You might like
全国FM电台频率大全 - 24 贵州省
2020/03/11 无线电
用PHP实现浏览器点击下载TXT文档的方法详解
2013/06/02 PHP
PHP的自定义模板引擎
2017/03/24 PHP
2007/12/23更新创意无限,简单实用(javascript log)
2007/12/24 Javascript
location.search在客户端获取Url参数的方法
2010/06/08 Javascript
基于jquery的使ListNav兼容中文首字拼音排序的实现代码
2011/07/10 Javascript
节点的插入之append()和appendTo()的用法介绍
2014/01/13 Javascript
浅析js预加载/延迟加载
2014/09/25 Javascript
实例分析js和C#中使用正则表达式匹配a标签
2014/11/26 Javascript
jQuery实现流动虚线框的方法
2015/01/29 Javascript
AngularJS进行性能调优的7个建议
2015/12/28 Javascript
基于Angular.js实现的触摸滑动动画实例代码
2017/02/19 Javascript
jQuery扇形定时器插件pietimer使用方法详解
2017/07/18 jQuery
vue.js移动端app实战1:初始配置详解
2017/07/24 Javascript
Angularjs使用过滤器完成排序功能
2017/09/20 Javascript
vue实现微信分享功能
2018/11/28 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
解决VueCil代理本地proxytable无效报错404的问题
2020/11/07 Javascript
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
基于Django的乐观锁与悲观锁解决订单并发问题详解
2019/07/31 Python
详解使用django-mama-cas快速搭建CAS服务的实现
2019/10/30 Python
Python实现自动访问网页的例子
2020/02/21 Python
keras用auc做metrics以及早停实例
2020/07/02 Python
python之随机数函数的实现示例
2020/12/30 Python
canvas绘制视频封面的方法
2018/02/05 HTML / CSS
绿色美容,有机护肤品和化妆品:Safe & Chic
2018/10/29 全球购物
电气工程及其自动化学生实习自我鉴定
2013/09/19 职场文书
一份婚庆公司创业计划书
2014/01/11 职场文书
运动会广播稿80字
2014/01/23 职场文书
档案工作个人总结
2015/03/03 职场文书
学校教学管理制度
2015/08/06 职场文书
python爬虫--selenium模块
2021/03/31 Python
JS代码编译器Monaco使用方法
2021/06/11 Javascript
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
Pillow图像处理库安装及使用
2022/04/12 Python
Java使用HttpClient实现文件下载
2022/08/14 Java/Android