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


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 相关文章推荐
Firebug 字幕文件JSON地址获取代码
Oct 28 Javascript
jQuery 表格插件整理
Apr 27 Javascript
一个分享按钮的插件使用介绍(可扩展,内附开发制作流程)
Sep 19 Javascript
分享一个自定义的console类 让你不再纠结JS中的调试代码的兼容
Apr 20 Javascript
js函数模拟显示桌面.scf程序示例
Apr 20 Javascript
网页右侧悬浮滚动在线qq客服代码示例
Apr 28 Javascript
js加减乘除丢失精度问题解决方法
May 16 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
Feb 26 Javascript
JavaScript的Backbone.js框架入门学习指引
May 07 Javascript
vue中的watch监听数据变化及watch中各属性的详解
Sep 11 Javascript
如何通过shell脚本自动生成vue文件详解
Sep 10 Javascript
Element-UI 使用el-row 分栏布局的教程
Oct 26 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
非洲第一个咖啡超凡杯大赛承办国—卢旺达的咖啡怎么样
2021/03/03 咖啡文化
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
pw的一个放后门的方法分析
2007/10/08 PHP
php Sql Server连接失败问题及解决办法
2009/08/07 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
php将从数据库中获得的数据转换成json格式并输出的方法
2018/08/21 PHP
javascript实现的listview效果
2007/04/28 Javascript
Prototype String对象 学习
2009/07/19 Javascript
jQuery 实现侧边浮动导航菜单效果
2014/12/26 Javascript
JS获取iframe中marginHeight和marginWidth属性的方法
2015/04/01 Javascript
js钢琴按钮波浪式图片排列效果代码分享
2015/08/26 Javascript
jQuery实现HTML表格单元格的合并功能
2016/04/06 Javascript
jQuery+ajax读取并解析XML文件的方法
2016/09/09 Javascript
js实现滑动到页面底部自动加载更多功能
2017/02/15 Javascript
微信小程序动态显示项目倒计时效果
2017/06/13 Javascript
bootstrap Table的一些小操作
2017/11/01 Javascript
使用async、enterproxy控制并发数量的方法详解
2018/01/02 Javascript
react native 仿微信聊天室实例代码
2019/09/17 Javascript
pyqt4教程之实现windows窗口小示例分享
2014/03/07 Python
在Python中使用mechanize模块模拟浏览器功能
2015/05/05 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python计算两个地址之间的距离方法
2018/06/09 Python
pyqt 实现QlineEdit 输入密码显示成圆点的方法
2019/06/24 Python
从列表或字典创建Pandas的DataFrame对象的方法
2019/07/06 Python
django框架使用方法详解
2019/07/18 Python
centos7之Python3.74安装教程
2019/08/15 Python
python实现操作文件(文件夹)
2019/10/31 Python
Python实现搜索算法的实例代码
2020/01/02 Python
社区版pycharm创建django项目的方法(pycharm的newproject左侧没有项目选项)
2020/09/23 Python
一篇文章带你搞定Ubuntu中打开Pycharm总是卡顿崩溃
2020/11/02 Python
HTML5 Canvas绘制文本及图片的基础教程
2016/03/14 HTML / CSS
JD Sports意大利:英国篮球和运动时尚的领导者
2017/10/29 全球购物
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
医学专业应届生的自我评价
2014/02/28 职场文书
内衣营销方案
2014/03/15 职场文书
2015年秘书个人工作总结
2015/04/25 职场文书