小程序自定义顶部导航栏
上篇博客自定义了一个底部导航栏,效果还可以,但是我在开发过程中又遇到了一个棘手的问题。就是在底部导航栏的第一个页面需要将页面沉浸到状态栏去,这就麻烦了,因为中间的容器页面无论第几个都是在外面的主界面里,而主界面需要动态的去隐藏标题栏,设计师这是在为难我胖虎?
当然也不是没有办法,这里就需要用到自定义的导航栏了,下面详细介绍。
先看效果
这个是首页的沉浸状态栏效果
这个是非首页的标题栏效果
看看代码
- WXML
<!--pages/tabbar/index.wxml-->
<cover-view wx:if="{{!isStatusBar}}" style="height:{{topHeight}}rpx;background:white;"><cover-view class="center-both" style="margin-top:{{statusHeight}}rpx;height: {{naviHeight}}rpx"><cover-view>{{title}}</cover-view></cover-view>
</cover-view><view class="page-container" style="height:{{containerHeight}}rpx"><!-- 使用wx:if 不会渲染,每次点击会重走组件生命周期 --><!-- 使用display:none隐藏,仍然会渲染组件,只走一遍生命周期 --><!-- 使用hidden隐藏,和display:none一样,但是受限于块级元素,无法使用 --><!-- 用户 --><block wx:if="{{roleType=='user'}}"><home id="id0" indexpage="{{true}}" style="display: {{currentPageIndex==0?'block':'none'}};" /><user id="id1" show='{{currentPageIndex==1}}' style="display: {{currentPageIndex==1?'block':'none'}};" /></block><!-- 管理员 --><block wx:elif="{{roleType=='manager'}}"><manager id="id0" style="display: {{currentPageIndex==0?'block':'none'}};" /><log id="id1" style="display: {{currentPageIndex==1?'block':'none'}};" /></block>
</view><!-- 底部切换菜单 -->
<view class="row-center tab-container" style="height:{{104 + bottomHeight}}rpx;padding-bottom:{{bottomHeight}}rpx"><view wx:for="{{tabBar}}" wx:key="index" class="flex1 center-both col"style="color:{{index==currentPageIndex?'#0B7BFBFF':'#616161FF'}}" data-index="{{index}}" bindtap="onSelectTap"><view class="{{item.iconClass}} icon"></view><view class="text">{{item.text}}</view></view>
</view>
在昨天的基础上加了自定义的顶部导航栏,适配了一下高度,使用 cover-view 放在了最顶层。
- WXSS
这里没什么变化,导航栏样式直接写在 style 里了,需要的话可以写在 wxss 里。
- JSON
{"navigationStyle": "custom",...
}
配置文件里面加入上面这句话,自定义导航栏,需要微信客户端7.0支持,如果要适配的话可以去全局的 windows 里面设置。
- Page.js
// pages/index/index.js
var app = getApp()Page({data: {//状态栏高度statusHeight: app.globalData.statusHeight,//导航栏高度naviHeight: app.globalData.naviHeight,//顶部高度 = 状态栏高度 + 导航栏高度topHeight: app.globalData.topHeight,//底部高度bottomHeight: app.globalData.bottomHeight,//中间内容容器高度 = 屏幕高度 - 底部安全高度 - 底部导航栏高度containerHeight: app.globalData.screenHeight - app.globalData.bottomHeight - 104,isStatusBar: true,title: '',currentPageIndex: 0,roleType: "",tabBar: [],userTabBar: [{"iconClass": "iconfont home","text": "首页","uptoStatus": true},{"iconClass": "iconfont user","text": "个人中心","uptoStatus": false},],managerTabBar: [{"iconClass": "iconfont manager","text": "管理", "uptoStatus": false},{"iconClass": "iconfont log","text": "日志", "uptoStatus": false},]},onLoad: function (options) {let tabBar = this.data.tabBarif (options.roleType == 'user') {tabBar = this.data.userTabBar} else if (options.roleType == 'manager') {tabBar = this.data.managerTabBar}// 在此加载数据this.setData({tabBar: tabBar,roleType: options.roleType,})},// 下拉加载onPullDownRefresh() {this.selectComponent("#id" + this.data.currentPageIndex).onPullDownRefresh()},onSelectTap(event) {let index = event.currentTarget.dataset.index; let isStatusBar = this.data.tabBar[index].uptoStatus;//中间页面高度 = 屏幕高度 - 底部安全高度 - 底部导航高度 - 顶部高度let containerHeight = app.globalData.screenHeight - bottomHeight - 104if (!isStatusBar) {containerHeight = containerHeight - this.data.topHeight}//选中页面更新this.setData({currentPageIndex: index,title: this.data.tabBar[index].text,currentPageIndex: index,isStatusBar: isStatusBar,containerHeight: containerHeight})},
})
Page中的改动就多了点,一个一个讲吧。
先引入了顶部导航栏适配需要用到的三个变量,状态栏高度、标题栏高度以及两者之和,标题栏使用 margin 在状态栏空出对应高度,再使用居中对齐使标题居中,适配效果不错。
同时引入是否沉浸状态栏和标题两个变量,isStatusBar控制是否显示顶部导航栏,标题就不用说了。
在各个标签信息里面增加了 uptoStatus 字段,确定是否要沉浸状态栏。
最后就是切换页面中,要判断选中页面是否要沉浸状态栏,如果要沉浸状态栏,还得修改中间容器的高度,同时标题也应该对应修改。
适配数据
这里也把高度适配数据贴一份吧,具体解释看前面博客。
globalData: {//系统信息systemInfo: {},//1px像素值 对应 rpxpixelRatio1: 2,//胶囊信息menuInfo: {},//屏幕高度screenHeight: 2000,//顶部高度 = 状态栏高度 + 导航栏高度topHeight: 0,//状态栏高度statusHeight: 0,//导航栏高度naviHeight: 0,//底部安全高度bottomHeight: 0,
},onLaunch: function () {var that = this;//获取设备信息let systemInfo = wx.getSystemInfoSync()that.globalData.systemInfo = systemInfo//1rpx 像素值let pixelRatio1 = 750 / systemInfo.windowWidth;that.globalData.pixelRatio1 = pixelRatio1//胶囊信息let menu = wx.getMenuButtonBoundingClientRect()that.globalData.menuInfo = menu//状态栏高度let statusHeight = systemInfo.statusBarHeightthat.globalData.statusHeight = statusHeight * pixelRatio1//导航栏高度let naviHeight = (menu.top - statusHeight) * 2 + menu.heightthat.globalData.naviHeight = naviHeight * pixelRatio1//顶部高度 = 状态栏高度 + 导航栏高度that.globalData.topHeight = (statusHeight + naviHeight) * pixelRatio1//屏幕高度let screenHeight = systemInfo.screenHeightthat.globalData.screenHeight = screenHeight * pixelRatio1//底部高度 = 屏幕高度 - 安全区域bottomlet bottom = systemInfo.safeArea.bottomthat.globalData.bottomHeight = (screenHeight - bottom) * pixelRatio1
}
结语
顶部导航栏自定义起来还是挺简单的,就是这里也有一些不如意的问题,比如在苹果手机上使用,可以一直上拉,让标题栏都划上去,但是在安卓使没问题的,机型问题就不管了,有机会调。
end
完美撒花
小程序自定义顶部导航栏相关推荐
- 微信小程序 自定义顶部导航栏标题 navigationStyle
微信小程序 自定义顶部导航栏标题 单页面自定义导航栏 修改需要自定义的页面,的页面配置.json文件 全部页面自定义导航 修改公共页面配置app.json 单页面自定义导航栏 修改需要自定义的页面,的 ...
- uniapp开发微信小程序自定义顶部导航栏
自定义导航栏渐变色,先上效果 使用uniapp开发小程序,在不同界面,要去对页面进行修改顶部导航栏. 比如说要去定义导航栏的背景颜色,常规的去定义导航栏背景颜色 全局定义导航栏 "windo ...
- 原声微信小程序自定义顶部导航栏 . 自定义navigationBar。 (单页面设置)
本文实例为大家分享了微信小程序自定义导航栏的具体代码,供大家参考,具体内容如下 实现自定义大致需要以下?步骤: 1.在页面.JSON文件进行相关配置,以便去掉原生 "navigationSt ...
- 微信小程序自定义顶部导航栏navigationBar
自定义navigationBar怎么做? 去掉原生导航栏. 将需要自定义navigationBar页面的page.json的navigationBarTitleText去掉. 加上"navi ...
- 微信小程序之顶部导航栏(选项卡)实例 —— 微信小程序实战系列(1)
需求:顶部导航栏 效果图: wxml: <!--导航条--> <view class="navbar"><text wx:for="{{na ...
- 微信小程序制作顶部导航栏
1问题描述 使用微信小程序开发者工具制作顶部导航栏. 2算法描述 首先就是对微信小程序开发者工具的配置,官网搜索后进入,选择稳定版,Windows64位下载. 然后点开开发者工具,选择小程序,点击图片 ...
- (转载)微信小程序自定义头部导航栏
本文转载自微信小程序自定义头部导航栏 微信小程序自定义头部导航栏 先看下demo的效果: 最终要实现的效果: 在tabbar页面不显示左侧按钮: 分享出去的页面进入后不显示左侧返回按钮: 点击返回按钮 ...
- 微信小程序实现顶部导航栏渐变
在小程序开发的过程中,会遇到一些页面上的要求,要求实现顶部导航栏的渐变如何实现,因为小程序做了一些封装,下面看看页面的布局图: 如图所示,实际上我们能够操作的页面只有中间那一块,那么,如果客户需要使用 ...
- 微信小程序中顶部导航栏全局切换
一.场景 微信小程序和企业微信小程序共用一个,从不同入口进入小程序显示不同的顶部导航栏 二.思路 1.app.json中全局设置只能写死一个,无法实现 2.app.js中直接使用wx.setNavig ...
最新文章
- 初识Mongodb总结
- Hadoop常见异常
- 刚刚注册,打声招呼先
- oralce load的时候使用触发器会导致load慢吗_你真的了解性能压测中的SLA吗?
- 在spring中使用JdbcTemplate进行数据库管理操作
- 【ES6】什么是Promise?解析Promise的基本用法
- simulink快捷键_从EPB模型谈谈Simulink代码生成
- Linux审计sudo
- java为什么要分代回收_浅谈Java堆内存分代回收
- 论计算机应用技术对企业信息化的影响
- mac如何清空Recent Places
- 贝叶斯滤波和粒子滤波
- 最好的科普著作《追寻记忆的痕迹》——神经与精神的历史和未来
- 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
- 广义相对论与狭义相对论的区别
- 分享一下关于滑板的心得
- H3C 通过命令行对无线设备进行激活、安装License的方法
- SWF Decompiler/Parser/Creater Comparison(opensource)
- python测试开发django-122.bootstrap模态框(modal)学习
- 为什么海归金融就业这么难?
热门文章
- model.train()、model.eval()、optimizer.zero_grad()、loss.backward()、optimizer.step作用及原理详解【Pytorch入门手册】
- MATLAB之数据拟合(附实例+代码)
- [HG5143D]电信光猫3.0网关折腾笔记
- 自然地理学考研复试复习 :绪论
- 产品经理面经 及 需要准备的知识
- Java基础篇:什么是平台无关性
- 永磁同步电机MPC电流预测控制
- mysql5.7简要介绍_MySQL 5.7新特性介绍
- Error: error:0308010C:digital envelope routines::unsupported问题的解决方案包括webstorm运行vue项目的解决方案
- [zz]嵌入式Linux系统图形及图形用户界面综述