小程序自定义导航栏(完美适配所有手机)

2019-09-0319:15:09APP与小程序开发Comments2,954 views字数 1713阅读模式

做小程序时,关于默认导航栏,我们遇到了以下的问题:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

  • Android、IOS手机对于页面title的展示不一致,安卓title的显示不居中
  • 页面的title只支持纯文本级别的样式控制,不能够做更丰富的title效果
  • 左上角的事件无法监听、定制
  • 路由导航单一,只能够返回上一页,深层级页面的返回不够友好

探索

小程序自定义导航栏已开放许久>>了解一下,相信不少小伙伴已使用过这个功能,同时不少小伙伴也会发现一些坑:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

  • 机型多如牛毛:自定义导航栏高度在不同机型始终无法达到视觉上的统一
  • 导航栏中内容怎么都不垂直居中对齐,更别说适配所有手机
  • 调皮的胶囊按钮:导航栏元素(文字,图标等)怎么也对不齐那该死的胶囊按钮
  • 各种尺寸的全面屏,奇怪的刘海屏,简直要抓狂

一探究竟

为了搞明白原理,我先去翻了官方文档,>>飞机,点过去是不是很惊喜,很意外,通篇大文尽然只有最下方的一张图片与这个问题有关,并且啥也看不清,汗汗汗...文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

我特意找了一张图片来文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

小程序自定义导航栏(完美适配所有手机)

分析上图,我得到如下信息:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

  • Android跟iOS有差异,表现在顶部到胶囊按钮之间的距离差了6pt
  • 胶囊按钮高度为32pt, iOS和Android一致

动手分析

我们写一个状态栏,通过wx.getSystemInfoSync().statusBarHeight设置高度文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

Android:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

小程序自定义导航栏(完美适配所有手机)

iOS:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

小程序自定义导航栏(完美适配所有手机)

可以看出,iOS胶囊按钮与状态栏之间距离为:4px, Android为8px,是不是所有手机都是这种情况呢? 答案是:苹果手机确实都是4px,安卓大部分都是7和8 也会有其他的情况(可以自己打印getSystemInfo验证)如何快速便捷算出这个高度,请接着往下看文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

如何计算

导航栏分为状态栏和标题栏,只要能算出每台手机的导航栏高度问题就迎刃而解文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

  • 导航栏高度 = 胶囊按钮高度 + 状态栏到胶囊按钮间距 * 2 + 状态栏高度

注:由于胶囊按钮是原生组件,为表现一致,其单位在各种手机中都为px,所以我们自定义导航栏的单位都必需是px(切记不能用rpx),才能完美适配。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

解决问题

现在我们明白了原理,可以利用胶囊按钮的位置信息和statusBarHeight高度动态计算导航栏的高度,贴一个实现此功能最重要的方法文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

let systemInfo = wx.getSystemInfoSync();
let rect = wx.getMenuButtonBoundingClientRect ? wx.getMenuButtonBoundingClientRect() : null; //胶囊按钮位置信息
    wx.getMenuButtonBoundingClientRect();
    let navBarHeight = (function() { //导航栏高度
            let gap = rect.top - systemInfo.statusBarHeight; //动态计算每台手机状态栏到胶囊按钮间距
            return 2 * gap + rect.height;
          })();
复制代码

gap信息就是不同的手机其状态栏到胶囊按钮间距,具体更多代码实现和使用demo请移步下方代码仓库,代码中还会有输入框文字跳动解决办法,安卓手机输入框文字飞出解决办法,左侧按钮边框太粗解决办法等等文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

吐槽

这么重要的问题,官方尽然没有提供解决方案...竟然提供了一张看不清的图片???文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

网上有很多ios设置44,android设置48,还有根据不同的手机型号设置不同高度,通过长时间的开发和尝试,本人发现以上方案并不完美,并且bug很多文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

代码库

  • Taro组件gitHub地址详细用法请参考README
  • 原生组件npm构建版本gitHub地址详细用法请参考README
  • 原生组件简易版gitHub地址详细用法请参考README
  • 由于本人精力有限,目前只计划发布维护好这2种组件,其他组件请自行修改代码,有问题请联系

备注

  • 上方2种组件在最下方30多款手机测试情况表现良好
  • iPhone手机打电话和开热点导致导航栏样式错乱,问题已经解决啦,请去demo里测试,这里特别感谢moments网友提出的问题

作者:成风
链接:https://juejin.im/post/5d557e2e5188255af1619716
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html

文章源自菜鸟学院-https://www.cainiaoxueyuan.com/xcx/16046.html
  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/xcx/16046.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定