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


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 相关文章推荐
2007/12/23更新创意无限,简单实用(javascript log)
Dec 24 Javascript
javascript字符串拼接的效率问题
Dec 25 Javascript
深入理解JavaScript系列(29):设计模式之装饰者模式详解
Mar 03 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
JavaScript函数的调用以及参数传递
Oct 21 Javascript
js实现不重复导入的方法
Mar 02 Javascript
手机移动端实现 jquery和HTML5 Canvas的幸运大奖盘特效
Dec 06 Javascript
Angularjs 依赖压缩及自定义过滤器写法
Feb 04 Javascript
jQuery Ajax 实现分页 kkpager插件实例代码
Aug 10 jQuery
史上最全JavaScript数组去重的十种方法(推荐)
Aug 17 Javascript
解决layui弹出层layer的area过大被遮挡的问题
Sep 21 Javascript
JS canvas实现画板和签字板功能
Feb 23 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电台频率大全 - 22 重庆市
2020/03/11 无线电
PHP环境搭建最新方法
2006/09/05 PHP
用文本文件制作留言板提示(下)
2006/10/09 PHP
php ci框架验证码实例分析
2013/06/26 PHP
php 模拟 asp.net webFrom 按钮提交事件的思路及代码
2013/12/02 PHP
PHP中HTML标签过滤技巧
2014/01/07 PHP
php实现base64图片上传方式实例代码
2017/02/22 PHP
10个基于jQuery或JavaScript的WYSIWYG 编辑器整理
2010/05/06 Javascript
原生javascript获取元素样式属性值的方法
2010/12/25 Javascript
js解析与序列化json数据(一)json.stringify()的基本用法
2013/02/01 Javascript
如何使Chrome控制台支持多行js模式——意外发现
2013/06/13 Javascript
用json方式实现在 js 中建立一个map
2014/05/02 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
node.js中的http.request.end方法使用说明
2014/12/10 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
JavaScript交换两个变量值的七种解决方案
2016/12/01 Javascript
VUE实现日历组件功能
2017/03/13 Javascript
单击按钮发送验证码,出现倒计时的简单实例
2017/03/17 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
jQuery 中msgTips 顶部弹窗效果实现代码
2017/08/14 jQuery
解决vue的过渡动画无法正常实现问题
2019/10/31 Javascript
[01:14:10]2014 DOTA2国际邀请赛中国区预选赛 SPD-GAMING VS Orenda
2014/05/22 DOTA
跟老齐学Python之关于循环的小伎俩
2014/10/02 Python
python获取元素在数组中索引号的方法
2015/07/15 Python
Python基于回溯法子集树模板解决选排问题示例
2017/09/07 Python
Python反射的用法实例分析
2018/02/11 Python
Django 迁移、操作数据库的方法
2019/08/02 Python
解决python 文本过滤和清理问题
2019/08/28 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
网络安全方面的面试题
2016/01/07 面试题
恶意软件的定义
2014/11/12 面试题
11月升旗仪式讲话稿
2014/02/15 职场文书
医院2014国庆节活动策划方案
2014/09/21 职场文书
行政助理岗位职责
2015/02/10 职场文书
忠诚与背叛观后感
2015/06/04 职场文书