记一次小程序自定义导航栏及加载动画的解决方案

主要逻辑就是动态获取设备的 statusBarHeight 和 titleBarHeight,来设置导航栏的高度和 paddingTop

ip6

ipx

loading

导航栏是一个组件,自定义组件通过 properties 获得 prop 参数的,组件还需要维护 statusBarHeight,titleBarHeight 和 navigatorHeight(实际没用到) 这三个 data

通过在小程序 ready 生命周期内调用 setBarHeight 来动态获取这三个 data 变量

Component({properties: {title: {type: String,default: 'default title'},ifShowBtn: {type: Boolean,default: true}},data: {statusBarHeight: 0,titleBarHeight: 0,navigatorHeight: 0},ready: function () {this.setBarHeight()},
复制代码

组件还有三个方法,这三个方法分别是:设置状态栏和标题栏高度的 setBarHeight、动态获取状态栏和标题栏高度的 getBarHeight,以及判断是否为 IOS 系统。

因为判断是否为 IOS 系统才能够设置 titleBarHeight,iPhone 或 iPad 的这个值为 44,安卓的统一设置为 48 即可

methods: {// 设置状态栏和标题栏高度setBarHeight: function () {this.isIOS().then(this.getBarHeight).then(res => {this.setData({statusBarHeight: res.statusBarHeight,titleBarHeight: res.titleBarHeight,navigatorHeight: res.navigatorHeight})})},// 动态获取状态栏高度和标题栏高度getBarHeight: function (isIOS) {return new Promise((resolve, reject) => {wx.getSystemInfo.call(this, {success: res => {let statusBarHeight = res.statusBarHeightlet titleBarHeight = isIOS ? 44 : 48resolve({ statusBarHeight, titleBarHeight, navigatorHeight: statusBarHeight + titleBarHeight })},failure: res => {reject('error getting systeminfo')}})})},// 判断是否为 IOS 系统isIOS: function () {return new Promise((resolve, reject) => {wx.getSystemInfo.call(this, {success: res => {if (res.model.indexOf('iPhone') > -1 || res.system.indexOf('iOS') > -1) {resolve(true)} else {resolve(false)}},failure: res => {reject('error getting systeminfo')}})})}
复制代码

另外,在获得这些变量之后可以存入到 app 的 globalData 对象中,每次只需要从这个对象获取变量即可

然后编写 wxml:

<view style="height: {{titleBarHeight}}px; padding-top: {{statusBarHeight}}px;"><view class="header" style="height: {{titleBarHeight}}px; padding-top: {{statusBarHeight}}px;"><view wx:if="{{ifShowBtn}}" class="header-btn"><view class="btn-item">B</view><view class="btn-item">H</view></view><view class="header-title">{{title}}</view></view><view class="loading">loading...</view>
</view>
复制代码

自定义导航栏的高度就是 titleBarHeight,paddingTop 的值就是 statusBarHeight

因为自定义导航栏是 fixed 元素,因此这个 class 为 header 的 view 元素设置样式如下:

.header {display: flex;align-items: center;position: fixed; /* fixed 因此在 wxml 中还需要再次设置一遍 height 和 paddingTop */top: 0;background: #fff;width: 100%;z-index: 9999;
}
复制代码

header-title 是一个绝对定位的元素,需要设置样式,将其居中:

.header-title {position: absolute;left: 50%;transform: translateX(-50%)
}
复制代码

最后还需要解决 pullDownRefresh 的加载动画问题,如果没有修复这个问题会出现一个大的空白

首先需要设置 app.json

  • backgroundTextStyle 为 light
  • navigationBarTextStyle 为 black
{"pages": ["pages/index/index"],"window": {"backgroundTextStyle": "light","navigationStyle": "custom","enablePullDownRefresh": true,"navigationBarBackgroundColor": "#fff","navigationBarTextStyle": "black"}
}
复制代码

然后增加组件 wxml 中 class 为 loading 的元素这个就是自定义加载动画

然后增加样式:

.loading {height: 100%;display: flex;justify-content: center;align-items: center;
}
复制代码

flex 布局并居中即可

最后设置 navigator.json 将模块定义为组件

{"component": true
}
复制代码

在页面中使用:

修改配置文件:

{"usingComponents": {"navigator": "../../components/navigator/navigator"}
}
复制代码

修改 wxml 文件:

<navigator ifShowBtn="{{true}}" title="the navigator"></navigator>
<view class="container">
<!-- ...... -->
</view>
复制代码

参考:

  • www.w3xue.com/exp/article…
  • juejin.im/post/5b7d5f…

转载于:https://juejin.im/post/5c91fc6bf265da60f00ec9f8

记一次小程序自定义导航栏及加载动画的解决方案相关推荐

  1. 微信小程序自定义导航栏(带汉堡包菜单)

    微信小程序自定义导航栏(带汉堡包菜单) 1.在app.json中 window配置navigationStyle (如果单独页面使用,可在页面的json文件配置) 2.计算相关值 整个导航栏的高度: ...

  2. 小程序自定义导航栏返回主页

    小程序自定义导航栏返回主页 效果图 在app.js中获取状态栏的高度statusBarHeight 自定义组件navbar.wxml 自定义组件navbar.wxss 自定义组件navbar.json ...

  3. 说一说要求 小程序自定义导航栏 的需求有多沙雕

    小程序是一种新的开放能力,开发者可以快速地开发一个小程序.小程序可以在 超级App 内被便捷地获取和传播,同时具有出色的使用体验. 在小程序项目中 自定义导航栏 绝对算得上是最恶心的需求之一.本篇文章 ...

  4. 小程序自定义导航栏 navigationStyle

    小程序自定义导航栏 微信提供自定义导航栏说明 开始自定义导航栏组件 微信提供自定义导航栏说明 微信版本 6.60 window下的 navigationStyle 属性,设置为 custom 即可关闭 ...

  5. taro 请务必在小程序页面中完善页面基础信息_小程序自定义导航栏(完美适配所有手机)...

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...

  6. 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...

  7. 小程序自定义导航栏(完美适配所有手机)解决上下不居中 左右不对齐 高度不协调问题...

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更 ...

  8. 微信小程序自定义导航栏 navigation bar 返回键 首页

    微信小程序自定义导航栏(wx_custom_navigation_bar) 自定义返回键.首页键,动态设置标题,响应式组件 版本号:2.0.0 作者:chen-yt github: https://g ...

  9. 微信小程序自定义导航栏组件(完美适配所有手机),可自定义实现任何你想要的功能

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...

最新文章

  1. mysql数据库主从同步过程详述(三)
  2. python RSA 加密与签名
  3. 高防服务器究竟能防御哪些攻击?
  4. js随机跳转域名_【教程】无需域名和服务器搭建属于自己的导航页!!!
  5. linux查找替换grep以及正则表达式
  6. java ftp 连接超时时间_ftpClient的连接超时设置(setConnectTimeout,setSoTimeout) | 学步园...
  7. ubuntu搭建nodejs生产环境——快速部署手册
  8. ctfshow-网络迷踪-新手上路 ( 使用百度搜图收集景点信息)
  9. 使用Netsparker扫描及**某站点
  10. linux读写磁盘文件寿命,linux下TF卡测试寿命的测试程序编写
  11. 用Adobe Flex3开发AIR应用程序–入门指南
  12. 计算机telnet命令大全,telnet 命令使用方法详解,telnet命令怎么用
  13. 前端开发工程师就业时应该选择大公司还是小公司?这是我听过最靠谱的答案!
  14. protected 修饰符的使用
  15. 百万在线:大型游戏服务端开发
  16. PostgreSQL 连接(JOIN)
  17. MATLAB找勾股数,一种寻找勾股数的方法
  18. 目录遍历,PHP 遍历一个文件夹下所有文件和子文件夹的方法
  19. day21 Excel基本操作
  20. [4月24日] 苦练基本功,事半功倍!

热门文章

  1. MyBatis 核心对象,工作原理及源码解读
  2. [swift] LeetCode 695. Max Area of Island
  3. L1-040 最佳情侣身高差-PAT团体程序设计天梯赛GPLT
  4. [Java] 1001. 害死人不偿命的(3n+1)猜想 (15)-PAT乙级
  5. LeetCode 647. Palindromic Substrings
  6. 蓝桥杯 ADV-127 算法提高 日期计算
  7. 【软件测试】负载测试与压力测试的区别
  8. max函数|C++返回数组中的最大值——max_element函数
  9. javaEmail发邮件是问号乱码,已解决
  10. WINDOWS SERVER 2003 R2 AD域控安装过程实践