最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

微信小程序自定义导航栏实例代码

来源:动视网 责编:小采 时间:2020-11-27 21:59:10
文档

微信小程序自定义导航栏实例代码

微信小程序自定义导航栏实例代码:背景 在做快狗打车小程序时,关于默认导航栏,我们遇到了以下的问题: Android、IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更丰富的title效果 左上角的事件无法监听、定制 路由导航单一,
推荐度:
导读微信小程序自定义导航栏实例代码:背景 在做快狗打车小程序时,关于默认导航栏,我们遇到了以下的问题: Android、IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更丰富的title效果 左上角的事件无法监听、定制 路由导航单一,


导航栏内容的定制,需要识别当前页面的性质,根据不同的页面展示不同的内容,可以通过获取当前的页面路由栈来判定当前的页面性质


step3 导航栏组件基本结构

目前快狗打车小程序的基本结构

// navBar.wxml
<cover-view class='place-holder'></cover-view>
<cover-view class='nav-bar'>
 <cover-view class='tool-bar' style='height: 20px'></cover-view>
 <cover-view class='title-bar'>
 <cover-view class='left-cell'>
 // scene0 常规首页 个人中心按钮
 // scene1 非常规首页 回首页按钮
 // scene2 嵌套页 返回上一页按钮 + 回首页按钮
 </cover-view>
 <cover-view class='center-cell'>
 // scene0 常规首页 个性化title
 // scene1 其他页 正常title
 </cover-view>
 <cover-view class='right-cell'>
 // 占位用的
 </cover-view>
 </cover-view>
</cover-view>

Tips:

组件内多了一个占位的place-holder块,是因为某些页面有类似滚动列表的需求,要保证导航栏始终在视窗的顶部的话,需要使用定位,定位之后脱离文档流,在最初的时候需要占位块保证后续的页面内容不会被导航栏遮挡

使用cover-view布局是因为快狗的业务中有类似map的原生组件,使用view的话有被遮挡的风险

step4 高度计算

需要计算title-bar的高度

在 默认导航栏 & 无底部tab栏 的情况下,使用wx.getSystemInfoSync获取手机信息,可以看到两项信息:

  • screenHeight 屏幕高度,单位px
  • windowHeight 可使用窗口高度,单位px
  • 这种情况下,二者的差值就是默认的导航栏的高度, 但是在设置了"navigationStyle": "custom"之后,二者的值是一样的了,因此导航栏的高度我们需要使用统计的经验值。

    根据统计,得到如下的结果:

    {
     'iPhone': 64,
     'iPhoneX': 88,
     'Android': 68,
     'samsung': 72
    }

    工具栏的高度可根据wx.getSystemInfoSync返回值中的statusBarHeight获取。

    至此,我们得到了导航栏的相关的高度值

    // 导航栏总高度 & 占位块高度
    placeHoder = totalBar = {
     'iPhone': 64,
     'iPhoneX': 88,
     'Android': 68,
     'samsung': 72
    }
    // 时间、信号等工具栏的高度
    toolBar = systermInfo.statusBarHeight
    // 页面title栏的高度
    titleBar = totalBar - toolBar

    step5 内容定制

    在组件的生命周期函数attached中,我们可以获取当前的页面路由栈

    let pages = getCurrentPages()
    let current_page = pages[pages.length - 1].route 
    const NORMAL_ENTRY = '常规的入口页路径'
    
    // scene 0 常规入口页 个性化title、个人中心
    pages.length === 1 && current_page === NORMAL_ENTRY
    // scene 1 非常规入口页 回首页
    pages.length === 1 && current_page !== NORMAL_ENTRY
    // scene 2 嵌套页面 返回 + 回首页
    pages.length > 1 

    根据不同的条件,展示不同的内容

    最终效果

    scene 0 常规首页

    scene 1 非常规首页

    scene 2 嵌套页

    目前在生产环境99%的机型中,都可以完美的运行。

    写在最后

  • 自定义导航栏是全局生效的,一旦设置,各个原生小程序页面都需要引入
  • 目前微信版本7+支持了针对特定页面的自定义导航栏,可以根据需要个性化定制
  • 自定义导航栏在web-view页面不会起效
  • 有尝试把导航栏做成插件,但是遇到在插件组件中无法获取页面路由栈的问题,因此没有成功
  • 总结

    文档

    微信小程序自定义导航栏实例代码

    微信小程序自定义导航栏实例代码:背景 在做快狗打车小程序时,关于默认导航栏,我们遇到了以下的问题: Android、IOS手机对于页面title的展示不一致,安卓title的显示不居中 页面的title只支持纯文本级别的样式控制,不能够做更丰富的title效果 左上角的事件无法监听、定制 路由导航单一,
    推荐度:
    • 热门焦点

    最新推荐

    猜你喜欢

    热门推荐

    专题
    Top