微信小程序自定义导航栏实例代码
作者:快狗打车前端团队 发布时间:2024-07-23 08:49:15
背景
在做快狗打车小程序时,关于默认导航栏,我们遇到了以下的问题:
Android、IOS手机对于页面title的展示不一致,安卓title的显示不居中
页面的title只支持纯文本级别的样式控制,不能够做更丰富的title效果
左上角的事件无法监听、定制
路由导航单一,只能够返回上一页,深层级页面的返回不够友好
我们希望的是:在各个机型页面上title一致性 & 个性化展示、取得左上角点击事件控制权及深层级页面的一键返回
实现
step1 自定义
第一步 取得导航栏的控制权
小程序支持自定义导航栏,只需要在app.json文件中,window项中配置
"navigationStyle": "custom"
这样微信就放开了导航栏的控制权,只保留右上角的胶囊。
页面会从视窗的顶部开始渲染,如图
接下来,我们要做的就是实现一个导航栏组件,把它放置在页面原来的默认导航栏的位置,内容什么的完全由开发者自己定制。
step2 功能点
第二步 梳理导航栏的功能点
导航栏高度(各个机型动态适配)
导航栏内容定制
所有机型title居中显示(自己布局实现)
首页导航栏左上角显示个人中心、中部title使用个性图标
嵌套页面左上角显示返回上一页 + 回到首页按钮
非常规首页左上角显示回到首页按钮
导航栏高度 包含两个部分:工具栏和title栏, 工具栏的高度一般是固定的20px,title栏的高度需要计算
导航栏内容的定制,需要识别当前页面的性质,根据不同的页面展示不同的内容,可以通过获取当前的页面路由栈来判定当前的页面性质
step3 导航栏组件基本结构
目前快狗打车小程序的基本结构
// navBar.wxml
<cover-view class='place-holder'></cover-view>
<cover-view class='nav-bar'>
<cover-view class='tool-bar' style='height: 20px'></cover-view>
<cover-view class='title-bar'>
<cover-view class='left-cell'>
// scene0 常规首页 个人中心按钮
// scene1 非常规首页 回首页按钮
// scene2 嵌套页 返回上一页按钮 + 回首页按钮
</cover-view>
<cover-view class='center-cell'>
// scene0 常规首页 个性化title
// scene1 其他页 正常title
</cover-view>
<cover-view class='right-cell'>
// 占位用的
</cover-view>
</cover-view>
</cover-view>
Tips:
组件内多了一个占位的place-holder块,是因为某些页面有类似滚动列表的需求,要保证导航栏始终在视窗的顶部的话,需要使用定位,定位之后脱离文档流,在最初的时候需要占位块保证后续的页面内容不会被导航栏遮挡
使用cover-view布局是因为快狗的业务中有类似map的原生组件,使用view的话有被遮挡的风险
step4 高度计算
需要计算title-bar的高度
在 默认导航栏 & 无底部tab栏 的情况下,使用wx.getSystemInfoSync获取手机信息,可以看到两项信息:
screenHeight 屏幕高度,单位px
windowHeight 可使用窗口高度,单位px
这种情况下,二者的差值就是默认的导航栏的高度, 但是在设置了"navigationStyle": "custom"之后,二者的值是一样的了,因此导航栏的高度我们需要使用统计的经验值。
根据统计,得到如下的结果:
{
'iPhone': 64,
'iPhoneX': 88,
'Android': 68,
'samsung': 72
}
工具栏的高度可根据wx.getSystemInfoSync返回值中的statusBarHeight获取。
至此,我们得到了导航栏的相关的高度值
// 导航栏总高度 & 占位块高度
placeHoder = totalBar = {
'iPhone': 64,
'iPhoneX': 88,
'Android': 68,
'samsung': 72
}
// 时间、信号等工具栏的高度
toolBar = systermInfo.statusBarHeight
// 页面title栏的高度
titleBar = totalBar - toolBar
step5 内容定制
在组件的生命周期函数attached中,我们可以获取当前的页面路由栈
let pages = getCurrentPages()
let current_page = pages[pages.length - 1].route
const NORMAL_ENTRY = '常规的入口页路径'
// scene 0 常规入口页 个性化title、个人中心
pages.length === 1 && current_page === NORMAL_ENTRY
// scene 1 非常规入口页 回首页
pages.length === 1 && current_page !== NORMAL_ENTRY
// scene 2 嵌套页面 返回 + 回首页
pages.length > 1
根据不同的条件,展示不同的内容
最终效果
scene 0 常规首页
scene 1 非常规首页
scene 2 嵌套页
目前在生产环境99%的机型中,都可以完美的运行。
写在最后
自定义导航栏是全局生效的,一旦设置,各个原生小程序页面都需要引入
目前微信版本7+支持了针对特定页面的自定义导航栏,可以根据需要个性化定制
自定义导航栏在web-view页面不会起效
有尝试把导航栏做成插件,但是遇到在插件组件中无法获取页面路由栈的问题,因此没有成功
来源:https://juejin.im/post/5ca563f8f265da307a16133b


猜你喜欢
- 1.python爬虫浏览器伪装#导入urllib.request模块import urllib.request#设置请求头headers=(
- 在进行excel文件读取的时候,我自己设置了部分直接从公式获取单元格的值但是用之前的读取方法进行读取的时候,返回值为空import osim
- 画星星程序2-7-7主要使用turtle.forward前进操作和turtle.left左转操作在屏幕上画星星。#!/usr/bin/env
- Python这些年风头一直很盛,占据了很多领域的位置,Web、大数据、人工智能、运维均有它的身影,甚至图形界面做的也很顺,乃至full-st
- 本文实例为大家分享了js信息滚动效果的具体代码,供大家参考,具体内容如下向上无缝滚动:<html><head><
- 当需要再次安装SQL Server时,如果序列号找不到了,可以试着从已经安装的实例里找回序列号,因为安装完SQL Server后,序列号(P
- 导语"盘子里最后一块肉给你 一 冰激凌的第一口给你 一手机最后的10%电量给你!"哈喽大家好!我是木木子,我要开始给大家
- 1、如何放弃正在输入的命令。 在输入一条比较长的命令时,出现打字错误是在所难免的。在这种情况下,放弃正在输入的命令重头再来往往会是更好的选择
- 完整的示例代码如下: 代码如下:<%@LANGUAGE="JAVASCRIPT" CODEPAGE="6
- 前文学习:python数据类型: python数据结构:数据类型.python的输入输出: python数据结构输入输出及控制和异常.pyt
- 下一步是将新创建的应用程序与项目相关联。为此,您需要编辑 myproj 文件夹中的 settings.py 文件,将字符串“myproj.m
- 写过一篇"正则表达式30分钟入门教程",有读者问:[^abc]表示不包含a、b、c中任意字符, 我想实现不包含字符串ab
- Keras的.h5模型转成tensorflow的.pb格式模型,方便后期的前端部署。直接上代码from keras.models impor
- 前言本文主要给大家介绍了关于SQL Server中bit类型字段增删查改的一些事,话说BIT类型字段之前,先看“诡异”的一幕,执行Updat
- 开发中经常会遇得到需要多种条件组合查询的情况,比如有三个表,年级表Grade(GradeId,GradeName),班级Class(Clas
- 很久没写blog,太忙了。没什么时间写复杂的东西,重新把颜色渐变效果写一遍。关于颜色的效果一般就两个,颜色梯度变化和样式的颜色渐变,前者在i
- 1、PyInstaller简介PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大
- 1.图像直方图基本含义和绘制首先我们先要了解一下python三大剑客之一——matplotlib我们
- eval前言In [1]: eval("2+3")Out[1]: 5In [2]: eval('[x for x
- 今天郭先生说一下用canvas解析图片流,然后制作一个动态二维码的小案例,话不多说先上图,这是郭先生的微信二维码哦!1. 解析图片流canv