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


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 传统事件模型构造的事件监听器实现代码
May 31 Javascript
jQuery源码解读之removeAttr()方法分析
Feb 20 Javascript
JS动态修改iframe高度和宽度的方法
Apr 01 Javascript
JS基于Ajax实现的网页Loading效果代码
Oct 27 Javascript
js获取及修改网页背景色和字体色的方法
Dec 29 Javascript
JavaScript编程学习技巧汇总
Feb 21 Javascript
Angualrjs 表单验证的两种方式(失去焦点验证和点击提交验证)
May 09 Javascript
javaScript中的空值和假值
Dec 18 Javascript
Vue-Router2.X多种路由实现方式总结
Feb 09 Javascript
深入学习Vue nextTick的用法及原理
Oct 08 Javascript
Element实现表格嵌套、多个表格共用一个表头的方法
May 09 Javascript
JavaScript高级程序设计之基本引用类型
Nov 17 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
用mysql内存表来代替php session的类
2009/02/01 PHP
Drupal 添加模块出现莫名其妙的错误的解决方法(往往出现在模块较多时)
2011/04/18 PHP
把1316这个数表示成两个数的和,其中一个为13的倍数,另一个是11的倍数,求这两个数。
2011/06/24 PHP
php的$_FILES的临时储存文件与回收机制实测过程
2013/07/12 PHP
ThinkPHP分组下自定义标签库实例
2014/11/01 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
php实现将base64格式图片保存在指定目录的方法
2016/10/13 PHP
PHP使用数组实现矩阵数学运算的方法示例
2017/05/29 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
javascript编程起步(第五课)
2007/02/27 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
探讨js字符串数组拼接的性能问题
2014/10/11 Javascript
jQuery中:input选择器用法实例
2015/01/03 Javascript
JavaScript实现图片轮播组件代码示例
2016/11/22 Javascript
详解nodejs微信公众号开发——5.素材管理接口
2017/04/11 NodeJs
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
解决vue router使用 history 模式刷新后404问题
2017/07/19 Javascript
详解html-webpack-plugin用法全解
2018/01/22 Javascript
用vue快速开发app的脚手架工具
2018/06/11 Javascript
小程序视频或音频自定义可拖拽进度条的示例代码
2018/09/30 Javascript
Node.js系列之发起get/post请求(2)
2019/08/30 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
[00:15]天涯墨客终极技能展示
2018/08/25 DOTA
利用Python演示数型数据结构的教程
2015/04/03 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
python飞机大战 pygame游戏创建快速入门详解
2019/12/17 Python
Python如何使用input函数获取输入
2020/08/06 Python
澳大利亚领先的男装零售连锁店:Lowes
2020/08/07 全球购物
师范生实习自我鉴定
2013/11/01 职场文书
护士在校生自荐信
2014/02/01 职场文书
《美丽的田园》教学反思
2014/03/01 职场文书
室内设计专业自荐信
2014/05/31 职场文书
政工例会汇报材料
2014/08/26 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2014年控辍保学工作总结
2014/12/08 职场文书
自愿离婚协议书范本
2015/01/26 职场文书