小程序组件之自定义顶部导航实例


Posted in Javascript onJune 12, 2019

前言

微信小程序凭借着“不占内存,即用即走”等特点,加上微信的社交的属性,其用户量一路保持快速的增长。对其的应用要求也日渐增高,使用更多样化、个性化。其中,对顶部导航的自定义实现,因交互功能成了一个普遍需要实现的组件,而尤因其不同设备下样式的兼容问题 如何更优雅的实现 使其成为大家讨论的热点。

下面我们从对其的设计、实现、使用上进行详细阐述,让大家更加了解这个组件。原创文章,若有写的不妥之处,欢迎大家指出更正。

自定义导航的设计

界面设计

目前,大多小程序对自定义导航的设计是:标题居中;左侧胶囊包裹返回上一页按钮和到首页按钮,要和右侧系统默认胶囊样式布局一致。效果如下:

小程序组件之自定义顶部导航实例

功能设计

主要功能如下:

  1. 自定义 小程序 顶部导航 :微信版本号 <7 的无此功能
  2. 去首页 功能 :首页没有此功能
  3. 返回 功能:无上一页没有此功能
  4. 模拟系统默认样式:和系统默认右边胶囊样式保持一致
  5. 居中显示标题:字数过多时 省略号代替

详细实现

布局样式实现

这个组件的实现的主要的重点在于不同设备上的样式兼容。由于右侧胶囊在不同设备下的表现是不一样的,所以左侧胶囊的布局样式要随不同设备进行自适应,既左侧胶囊的高度间距等样式数据要先计算出来再赋予其值。故难点就在于如何获得这些值。经过一番针对个别手机的兼容踩坑操作(此处省略一万字...?),最终得到正解(此处感谢小伙伴的雪中送炭?),那就是可以一劳永逸的wx.getMenuButtonBoundingClientRect()

wx.getMenuButtonBoundingClientRect()
获取菜单按钮(右上角胶囊按钮)的布局位置信息。坐标信息以屏幕左上角为原点。
菜单按钮的布局位置信息:
width  宽度(px)
height  高度(px)
top  上边界坐标(px)
right  右边界坐标(px)
bottom  下边界坐标(px)
left  左边界坐标(px)

有了这个关键点,下面带着大家看具体如何一步步优雅地完美地实现这个组件。

首先获取布局信息对象:

let menuRect = wx.getMenuButtonBoundingClientRect()

1、实现左侧胶囊

获取左侧胶囊的高度:

this.height_capsule = menuRect.height

赋值给view :

<view class="nav_capsule" style="height:{{height_capsule}}px">

然后,对胶囊内部采用flex对其进行布局及一些细节处理,胶囊的单独实现就完成了。

2、实现左侧胶囊与右侧胶囊对齐

在其外包一层父级view,即导航条。对导航条进行与右侧一样的上边距和下边距填充。

<view class="navbar" style="padding-top: {{paddingTop}}px; padding-bottom: {{paddingBottom}}px;">

获取边距值:

this.paddingTop = menuRect.top
this.paddingBottom = menuRect.top - wepy.getSystemInfoSync().statusBarHeight

这样,此时对齐效果就实现了。

3、自定义标题垂直水平居中

我们对导航条内部进行flex布局,由于右侧胶囊是系统默认的,要使标题块居中,就需要做一个右侧胶囊占位,同时给导航左右设置那边距。

导航左右设置内边距:

padding-left:20rpx;
padding-right:20rpx;

右侧胶囊占位:

<view class="nav_right" style="height: {{height_capsule}}px; width: {{width_capsule}}px;"></view>
this.width_capsule = menuRect.width

此时,标题块就处于居中的位置了。然后对齐进行垂直水平居中和省略号控制就好了。

4、完善导航条布局样式

上面,一个自定义导航条的样式布局就基本完成。但要达到可以很优雅地被使用还是需要一些完善的。

-设置定位:使其被任意页面调用都处于视窗最顶部固定不变的位置。

position: fixed;top: 0;

设置层级:使其被任意页面调用都处于页面中最高层级视窗的最前面。

z-index: 99999;

增加占位块:使其使其被任意页面调用都不会遮挡其他页面元素。

<view class="placeholder" wx:if="{{navbar.flag}}" style="height:{{height}}px"></view>
this.height = menuRect.bottom + this.paddingBottom;
.placeholder{width: 100%;}

然后,用一个view包裹navbar和placeholder,就是一个完善的自定义导航条了。

功能实现

1、显示自定义小程序顶部导航

自定义导航,需要在单个页面中设置参数:

config = { navigationStyle: "custom" };

,由于在对局部页面进行自定义时,

客户端 7.0.0 以下版本,navigationStyle 只在 app.json 中生效。

所以,我们要对版本进行兼容判断,是否显示自定义导航。

this.navbar.flag = wx.getSystemInfoSync().version.split('.')[0] >= 7 ? true : false
<view class="navbar-box" wx:if="{{navbar.flag}}">

2、显示返回上一页按钮

如果没有上一页,就不需要返回上一页功能:

this.showBack = getCurrentPages().length > 1 ? true : false
<button class="nav_back" @tap="navBack" wx:if="{{showBack}}">

如果此按钮不显示,只剩下去首页按钮,分割线也要隐藏掉:

<view class="divide" wx:if="{{showBack}}"></view>

到此,一个自定义导航组件就完整地实现了。还在为兼容或者调用时需要适配很多的问题而一筹莫展的童鞋,看到这儿是不是可以展颜了呀。完整代码呈现如下:

github分享:github.com/linger777/x…

gitee分享:gitee.com/linger777/x…

小程序片段分享:developers.weixin.qq.com/s/AzGaZTmV7…

有需要的童鞋自取。下面给大家介绍下如何使用:

使用说明

定义页面自定义顶部导航

config = { navigationStyle: "custom" };

引入组件

import navbar from '@/components/navbarNew'

注册组件

components = {navbar, }

调用组件

<navbar :navbar.sync="navbar"></navbar>

赋值

data = {
  navbar: {
   flag: true, //是否使用navbar
   title: '顶部导航', // 自定义导航标题
   height: '' // 导航高度
  },
 }

如页面遇到有 sticky \ fixed 定位的view,按需要可以通过加入style进行调整

style="top: {{navbar.flag ? navbar.height : 0}}rpx;"

以上就是对自定义顶部导航的全部分享,如有不解,欢迎留言讨论。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
Nov 15 Javascript
jquery实现的导航固定效果
Apr 28 Javascript
jQuery的remove()方法使用详解
Aug 11 Javascript
深入理解JavaScript中为什么string可以拥有方法
May 24 Javascript
ashx文件获取$.ajax()方法发送的数据
May 26 Javascript
Bootstrap基本插件学习笔记之Popover提示框(19)
Dec 08 Javascript
利用jQuery.Validate异步验证用户名是否存在(推荐)
Dec 09 Javascript
js实现下拉框二级联动
Dec 04 Javascript
vue全局自定义指令-元素拖拽的实现代码
Apr 14 Javascript
小程序数据通信方法大全(推荐)
Apr 15 Javascript
JS数组reduce()方法原理及使用技巧解析
Jul 14 Javascript
微信小程序入门之绘制时钟
Oct 22 Javascript
vue项目中将element-ui table表格写成组件的实现代码
Jun 12 #Javascript
React 全自动数据表格组件——BodeGrid的实现思路
Jun 12 #Javascript
详解如何提升JSON.stringify()的性能
Jun 12 #Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 #Javascript
浅谈webpack 四个核心概念之Entry
Jun 12 #Javascript
vue安装遇到的5个报错及解决方法
Jun 12 #Javascript
深入学习JavaScript 高阶函数
Jun 11 #Javascript
You might like
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
jquery.lazyload  实现图片延迟加载jquery插件
2010/02/06 Javascript
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
深入理解JavaScript系列(16) 闭包(Closures)
2012/04/12 Javascript
JS实现侧悬浮浮动实例代码
2013/11/29 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
JavaScript中this详解
2015/09/01 Javascript
JavaScript获取function所有参数名的方法
2015/10/30 Javascript
深入探讨前端框架react
2015/12/09 Javascript
原生JS实现日历组件的示例代码
2017/09/22 Javascript
浅谈Vue.js 组件中的v-on绑定自定义事件理解
2017/11/17 Javascript
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
基于element-ui的rules中正则表达式
2018/09/04 Javascript
Vue程序调试的方法
2019/06/17 Javascript
解决vue-loader加载不上的问题
2020/10/21 Javascript
[01:50]《我与DAC》之玩家:iG夺冠时的那面红旗
2018/03/29 DOTA
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
Python语言的12个基础知识点小结
2014/07/10 Python
python 时间戳与格式化时间的转化实现代码
2016/03/23 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
2016/07/11 Python
Python 爬虫模拟登陆知乎
2016/09/23 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
Python中支持向量机SVM的使用方法详解
2017/12/26 Python
Python实现PS图像调整颜色梯度效果示例
2018/01/25 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
DES加密解密算法之python实现版(图文并茂)
2018/12/06 Python
django formset实现数据表的批量操作的示例代码
2019/12/06 Python
毕业生自我鉴定范文
2013/11/08 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
2014年销售工作总结
2014/12/01 职场文书
优秀教师单行材料
2014/12/16 职场文书
教师节主持词开场白
2015/05/29 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
python字符串的一些常见实用操作
2022/04/06 Python
Java由浅入深通关抽象类与接口(上篇)
2022/04/26 Java/Android
详解Mysql事务并发(脏读、不可重复读、幻读)
2022/04/29 MySQL