微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)


Posted in Javascript onApril 26, 2020

前言

navigationBar相信大家都不陌生把?今天我们就来说说自定义navigationBar,把它改变成我们想要的样子(搜索框+胶囊、搜索框+返回按钮+胶囊等)。

思路

  • 隐藏原生样式
  • 获取胶囊按钮、状态栏相关数据以供后续计算
  • 根据不同机型计算出该机型的导航栏高度,进行适配
  • 编写新的导航栏
  • 引用到页面

正文

一、隐藏原生的navigationBar

window全局配置里有个参数:navigationStyle(导航栏样式),default=默认样式,custom=自定义样式。

"window": {
	"navigationStyle": "custom"
}

让我们看看隐藏后的效果:

微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)

可以看到原生的navigationBar已经消失了,剩下孤零零的胶囊按钮,胶囊按钮是无法隐藏的。

二、准备工作

1.获取胶囊按钮的布局位置信息

我们用wx.getMenuButtonBoundingClientRect() 【官方文档】 获取胶囊按钮的布局位置信息,坐标信息以屏幕左上角为原点:

const menuButtonInfo = wx.getMenuButtonBoundingClientRect();

width height top right bottom left
宽度 高度 上边界坐标 右边界坐标 下边界坐标 左边界坐标

下面是官方给的示意图,方便大家理解几个坐标。

微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)

2.获取系统信息

用wx.getSystemInfoSync() 【官方文档】 获取系统信息,里面有个参数:statusBarHeight(状态栏高度),是我们后面计算整个导航栏的高度需要用到的。

const systemInfo = wx.getSystemInfoSync();

三、计算公式

我们先要知道导航栏高度是怎么组成的, 计算公式: 导航栏高度 = 状态栏到胶囊的间距(胶囊距上距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度 。

实例 【源码下载】

自定义导航栏会应用到多个、甚至全部页面,所以封装成组件,方便调用;下面是我写的一个简单例子:

app.js

App({
 onLaunch: function(options) {
  const that = this;
  // 获取系统信息
  const systemInfo = wx.getSystemInfoSync();
  // 胶囊按钮位置信息
  const menuButtonInfo = wx.getMenuButtonBoundingClientRect();
  // 导航栏高度 = 状态栏到胶囊的间距(胶囊距上距离-状态栏高度) * 2 + 胶囊高度 + 状态栏高度
  that.globalData.navBarHeight = (menuButtonInfo.top - systemInfo.statusBarHeight) * 2 + menuButtonInfo.height + systemInfo.statusBarHeight;
  that.globalData.menuRight = systemInfo.screenWidth - menuButtonInfo.right;
  that.globalData.menuBotton = menuButtonInfo.top - systemInfo.statusBarHeight;
  that.globalData.menuHeight = menuButtonInfo.height;
 },
 // 数据都是根据当前机型进行计算,这样的方式兼容大部分机器
 globalData: {
  navBarHeight: 0, // 导航栏高度
  menuRight: 0, // 胶囊距右方间距(方保持左、右间距一致)
  menuBotton: 0, // 胶囊距底部间距(保持底部间距一致)
  menuHeight: 0, // 胶囊高度(自定义内容可与胶囊高度保证一致)
 }
})

app.json

{
 "pages": [
  "pages/index/index"
 ],
 "window": {
  "navigationStyle": "custom"
 },
 "sitemapLocation": "sitemap.json"
}

下面为组件代码: /components/navigation-bar/navigation-bar.wxml

<!-- 自定义顶部栏 -->
<view class="nav-bar" style="height:{{navBarHeight}}px;">
 <input class="search" placeholder="输入关键词!" style="height:{{menuHeight}}px; min-height:{{menuHeight}}px; line-height:{menuHeight}}px; left:{{menuRight}}px; bottom:{{menuBotton}}px;"></input>
</view>

<!-- 
 内容区域:
 自定义顶部栏用的fixed定位,会遮盖到下面内容,注意设置好间距
-->
<view class="content" style="margin-top:{{navBarHeight}}px;"></view>

/components/navigation-bar/navigation-bar.json

{
 "component": true
}

/components/navigation-bar/navigation-bar.js

const app = getApp()
Component({
 properties: {
  // defaultData(父页面传递的数据-就是引用组件的页面)
  defaultData: {
   type: Object,
   value: {
    title: "我是默认标题"
   },
   observer: function(newVal, oldVal) {}
  }
 },
 data: {
  navBarHeight: app.globalData.navBarHeight,
  menuRight: app.globalData.menuRight,
  menuBotton: app.globalData.menuBotton,
  menuHeight: app.globalData.menuHeight,
 },
 attached: function() {},
 methods: {}
})

/components/navigation-bar/navigation-bar.wxss

.nav-bar{ position: fixed; width: 100%; top: 0; color: #fff; background: #000;}
.nav-bar .search{ width: 60%; color: #333; font-size: 14px; background: #fff; position: absolute; border-radius: 50px; background: #ddd; padding-left: 14px;}

以下是调用页面的代码,也就是引用组件的页面: /pages/index/index.wxml

navigation-bar default-data="{{defaultData}}"></navigation-bar>

/pages/index/index.json

{
 "usingComponents": {
  "navigation-bar": "/components/navigation-bar/navigation-bar"
 }
}

/pages/index/index.js

const app = getApp();
Page({
 data: {
  // 组件参数设置,传递到组件
  defaultData: {
   title: "我的主页", // 导航栏标题
  }
 },
 onLoad() {
  console.log(this.data.height)
 }
})

效果图:

微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)

好了,以上就是全部代码了,大家可以文中复制代码,也可以 【下载源码】

,直接到开发者工具里运行,记得appid用自己的或者测试哦!

下面附几张其它小程序的效果图,大家也可以尝试照着做:

微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)

总结

本文写了自定义navigationBar的一些基础性东西,里面涉及组件用法、参数传递、导航栏相关。

由于测试环境有限,大家在使用时如果发现有什么问题,希望及时反馈,以供及时更新帮助更多的人!

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

Javascript 相关文章推荐
为开发者准备的10款最好的jQuery日历插件
Feb 04 Javascript
js实现的复制兼容chrome和IE
Apr 03 Javascript
最短的IE判断var ie=!-[1,]分析
May 28 Javascript
JavaScript中操作Mysql数据库实例
Apr 02 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
May 30 Javascript
浅谈Javascript数据属性与访问器属性
Jul 26 Javascript
深入浅析jQuery对象$.html
Aug 22 Javascript
vue的事件绑定与方法详解
Aug 16 Javascript
详解基于vue-cli3.0如何构建功能完善的前端架子
Oct 09 Javascript
详解在vue-test-utils中mock全局对象
Nov 07 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
Vue-Cli项目优化操作的实现
Oct 27 Javascript
javascript 使用sleep函数的常见方法详解
Apr 26 #Javascript
基于JavaScript实现十五拼图代码实例
Apr 26 #Javascript
小程序自定义导航栏兼容适配所有机型(附完整案例)
Apr 26 #Javascript
vue 使用 vue-pdf 实现pdf在线预览的示例代码
Apr 26 #Javascript
javascript设计模式 ? 访问者模式原理与用法实例分析
Apr 26 #Javascript
详解关于Vue单元测试的几个坑
Apr 26 #Javascript
es6函数之箭头函数用法实例详解
Apr 25 #Javascript
You might like
如何使用PHP中的字符串函数
2006/11/24 PHP
用PHP实现的随机广告显示代码
2007/06/14 PHP
CI框架装载器Loader.php源码分析
2014/11/04 PHP
yii2带搜索功能的下拉框实例详解
2016/05/12 PHP
PHP实现更改hosts文件的方法示例
2017/08/08 PHP
编程语言JavaScript简介
2014/10/16 Javascript
30个经典的jQuery代码开发技巧
2014/12/15 Javascript
js实现背景图片感应鼠标变化的方法
2015/02/28 Javascript
jQuery监控文本框事件并作相应处理的方法
2015/04/16 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
BootStrap的alert提示框的关闭后再显示怎么解决
2016/05/17 Javascript
angularjs实现多张图片上传并预览功能
2017/02/24 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
详解angular路由高亮之RouterLinkActive
2018/04/28 Javascript
jQuery中each遍历的三种方法实例分析
2018/09/07 jQuery
vue.js 打包时出现空白页和路径错误问题及解决方法
2019/06/26 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
Python爬取数据保存为Json格式的代码示例
2019/04/09 Python
python用for循环求和的方法总结
2019/07/08 Python
Python文件操作基础流程解析
2020/03/19 Python
解决启动django,浏览器显示“服务器拒绝访问”的问题
2020/05/13 Python
Python爬虫入门有哪些基础知识点
2020/06/02 Python
keras 模型参数,模型保存,中间结果输出操作
2020/07/06 Python
让IE支持HTML5的方法
2012/12/11 HTML / CSS
销售所有的狗狗产品:Dog.com
2016/10/13 全球购物
澳大利亚儿童精品仓库:Goo & Co.
2019/06/20 全球购物
波兰品牌鞋履在线商店:Eastend.pl
2020/01/11 全球购物
工作证明格式及范本
2014/09/12 职场文书
常务副县长“三严三实”对照检查材料思想汇报
2014/10/05 职场文书
党的群众路线教育实践活动实施方案
2014/10/31 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年社区中秋节活动总结
2015/03/23 职场文书
重温经典:乔布斯在斯坦福大学的毕业演讲(双语)
2019/08/26 职场文书
读《推着妈妈去旅行》有感1500字
2019/10/15 职场文书
nginx 反向代理之 proxy_pass的实现
2021/03/31 Servers
设置IIS Express并发数
2022/07/07 Servers