上篇博客自定义了一个底部导航栏,效果还可以,但是我在开发过程中又遇到了一个棘手的问题。就是在底部导航栏的第一个页面需要将页面沉浸到状态栏去,这就麻烦了,因为中间的容器页面无论第几个都是在外面的主界面里,而主界面需要动态的去隐藏标题栏,设计师这是在为难我胖虎?

当然也不是没有办法,这里就需要用到自定义的导航栏了,下面详细介绍。

先看效果

这个是首页的沉浸状态栏效果

这个是非首页的标题栏效果

看看代码

  • 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

完美撒花

小程序自定义顶部导航栏相关推荐

  1. 微信小程序 自定义顶部导航栏标题 navigationStyle

    微信小程序 自定义顶部导航栏标题 单页面自定义导航栏 修改需要自定义的页面,的页面配置.json文件 全部页面自定义导航 修改公共页面配置app.json 单页面自定义导航栏 修改需要自定义的页面,的 ...

  2. uniapp开发微信小程序自定义顶部导航栏

    自定义导航栏渐变色,先上效果 使用uniapp开发小程序,在不同界面,要去对页面进行修改顶部导航栏. 比如说要去定义导航栏的背景颜色,常规的去定义导航栏背景颜色 全局定义导航栏 "windo ...

  3. 原声微信小程序自定义顶部导航栏 . 自定义navigationBar。 (单页面设置)

    本文实例为大家分享了微信小程序自定义导航栏的具体代码,供大家参考,具体内容如下 实现自定义大致需要以下?步骤: 1.在页面.JSON文件进行相关配置,以便去掉原生 "navigationSt ...

  4. 微信小程序自定义顶部导航栏navigationBar

    自定义navigationBar怎么做? 去掉原生导航栏. 将需要自定义navigationBar页面的page.json的navigationBarTitleText去掉. 加上"navi ...

  5. 微信小程序之顶部导航栏(选项卡)实例 —— 微信小程序实战系列(1)

    需求:顶部导航栏 效果图: wxml: <!--导航条--> <view class="navbar"><text wx:for="{{na ...

  6. 微信小程序制作顶部导航栏

    1问题描述 使用微信小程序开发者工具制作顶部导航栏. 2算法描述 首先就是对微信小程序开发者工具的配置,官网搜索后进入,选择稳定版,Windows64位下载. 然后点开开发者工具,选择小程序,点击图片 ...

  7. (转载)微信小程序自定义头部导航栏

    本文转载自微信小程序自定义头部导航栏 微信小程序自定义头部导航栏 先看下demo的效果: 最终要实现的效果: 在tabbar页面不显示左侧按钮: 分享出去的页面进入后不显示左侧返回按钮: 点击返回按钮 ...

  8. 微信小程序实现顶部导航栏渐变

    在小程序开发的过程中,会遇到一些页面上的要求,要求实现顶部导航栏的渐变如何实现,因为小程序做了一些封装,下面看看页面的布局图: 如图所示,实际上我们能够操作的页面只有中间那一块,那么,如果客户需要使用 ...

  9. 微信小程序中顶部导航栏全局切换

    一.场景 微信小程序和企业微信小程序共用一个,从不同入口进入小程序显示不同的顶部导航栏 二.思路 1.app.json中全局设置只能写死一个,无法实现 2.app.js中直接使用wx.setNavig ...

最新文章

  1. 初识Mongodb总结
  2. Hadoop常见异常
  3. 刚刚注册,打声招呼先
  4. oralce load的时候使用触发器会导致load慢吗_你真的了解性能压测中的SLA吗?
  5. 在spring中使用JdbcTemplate进行数据库管理操作
  6. 【ES6】什么是Promise?解析Promise的基本用法
  7. simulink快捷键_从EPB模型谈谈Simulink代码生成
  8. Linux审计sudo
  9. java为什么要分代回收_浅谈Java堆内存分代回收
  10. 论计算机应用技术对企业信息化的影响
  11. mac如何清空Recent Places
  12. 贝叶斯滤波和粒子滤波
  13. 最好的科普著作《追寻记忆的痕迹》——神经与精神的历史和未来
  14. 计算机管理器用户怎么打开,win10无法使用内置管理员账户打开计算器如何设置...
  15. 广义相对论与狭义相对论的区别
  16. 分享一下关于滑板的心得
  17. H3C 通过命令行对无线设备进行激活、安装License的方法
  18. SWF Decompiler/Parser/Creater Comparison(opensource)
  19. python测试开发django-122.bootstrap模态框(modal)学习
  20. 为什么海归金融就业这么难?

热门文章

  1. model.train()、model.eval()、optimizer.zero_grad()、loss.backward()、optimizer.step作用及原理详解【Pytorch入门手册】
  2. MATLAB之数据拟合(附实例+代码)
  3. [HG5143D]电信光猫3.0网关折腾笔记
  4. 自然地理学考研复试复习 :绪论
  5. 产品经理面经 及 需要准备的知识
  6. Java基础篇:什么是平台无关性
  7. 永磁同步电机MPC电流预测控制
  8. mysql5.7简要介绍_MySQL 5.7新特性介绍
  9. Error: error:0308010C:digital envelope routines::unsupported问题的解决方案包括webstorm运行vue项目的解决方案
  10. [zz]嵌入式Linux系统图形及图形用户界面综述