小程序底部导航栏仿真自定义

小程序底部导航栏仿真自定义

最近做了一个小项目,涉及到这个的应用先上图:(不好意思哈,不会做gif效果就这样展示了)

                 

前言:

其实直接用navigatTo 或者 navigatBack 就可以实现自定义导航栏的效果了;

为什么会 不嫌麻烦的 想到做一个这样的自定义仿真导航栏呢?

不妨先把代码拿回去试试效果!

下面直接粘代码了啊:

由于多个页面需要用到同样的代码块,所以这里用了小程序模板组件 template

先上template代码:/pages/template/template.wxml

<template name="tabbars">
  <view class='tabs'>
    <navigator open-type='navigate{{t.page1}}' delta='{{t.p1}}' url="{{t.url1}}" class="tab beside {{t.choosed == 0 ? 'blue':'dark'}}" hover-class='tabhover'>
      <image src="/images/fang{{t.choosed == 0 ? '1':'2'}}.png"></image>
      <view>首页</view>
   </navigator>

    <navigator open-type='navigate{{t.page2}}' delta='{{t.p2}}' url="{{t.url2}}" class="tab mid  {{t.choosed == 1 ? 'blue':'dark'}}" hover-class='tabhover'>
      <image src="/images/bed{{t.choosed == 1 ? '1':'2'}}.png"></image>
      <view>房型</view>
    </navigator> 

    <navigator open-type='navigate{{t.page3}}' delta='{{t.p3}}' url="{{t.url3}}" class="tab beside {{t.choosed == 2 ? 'blue':'dark'}}" hover-class='tabhover'>
      <image src="/images/ren{{t.choosed == 2 ? '1':'2'}}.png"></image>
      <view>我的</view>
    </navigator>
  </view>
</template>

template wxss部分:/pages/template/template.wxss

.tabs{
  background-color: rgb(255,255,255);
  height: 100rpx;
  position: fixed;
  z-index: 99;
  bottom: 0;
  width: 100%;
  display: flex;
  flex-direction: row;
  align-items: center;
  border-top:3rpx solid rgb(243,243,243);
  /* border: 1rpx red solid; */
}
.beside{
  width: 33%;
}
.mid{
  width: 34%;
}
.tab{
  height: 90%;
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  align-items: center;
  /* border: 1rpx red solid; */
  font-size: 22rpx;
}
.tab image{
  height: 60%;
  width: 60rpx;
}

.blue{
  color: rgb(71,176,231);
}

.dark{
  color: rgb(114,114,114);
}
.tabhover{
  background-color: rgb(203,203,203);
}

这里就是三个页面引入 template 以及 js 跳转参数设置的代码(仅包含自定义跳转相关的代码)

首页 index :/pages/index/index.wxml
 

<navigator url="/pages/chooseRoom/chooseRoom"> 预定酒店</navigator>

 房型选择 choosRoom wxml: /pages/chooseRoom/choosRoom.wxml

<import src="/pages/template/template.wxml" />
   <template is="tabbars" data="{{t}}">
   </template>

房型选择 chooseRoom wxss:/pages/chooseRoom/chooseRoom.wxss

@import "/pages/template/template.wxss";

房型选择 choosRoom js : /pages/chooseRoom/chooseRoom.js

  data: {
    //优化页面跳转参数
    t: {
      choosed: 1,                  //选中状态判断参数 
      url1: '/pages/index/index',  // url1首页路径
      url2: '',                    // url2 chooseRoom路径
      url3: '/pages/myCenter/myCenter',  //url3 myCenter页面路径
      p1: '',                       //返回首页delta值
      p2: '',                       //返回 chooseRoom页面的 delta值
      p3: '',                       //返回 myCneter 页面的 delta值 
      page1: '',    // 到首页的optenType字符串,决定是 navigatTo 还是navigatBack
      page2: '',    // 到chooseRoom页的optenType字符串,决定是 navigatTo 还是navigatBack
      page3: ''     // 到myCenter页的optenType字符串,决定是 navigatTo 还是navigatBack
    } 
  },

  //页面跳转优化,参数设置
  betterNavigator: function() {
    var t_ = this.data.t
    var pages = getCurrentPages();
    //遍历历史页面信息
    for (let i = pages.length - 1; i >= 0; i--) {
      //如果历史页面有index页面 就设置 navigateback
      if (pages[i].route == "pages/index/index") {
        t_.p1 = pages.length - 1 - i
        t_.page1 = 'Back'
        t_.url1 = ''
        // console.log("i2:", i);
        break
      }
    }

    //如果历史页面有myCenter页面 就设置 navigateback
    for (let i = pages.length - 1; i >= 0; i--) {
      if (pages[i].route == "pages/myCenter/myCenter") {
        t_.p3 = pages.length - 1 - i
        t_.page3 = 'Back'
        t_.url3 = ''
        break
      }
    }
    this.setData({
      t: t_
    })
    // console.log("t_2:",t_);
  },

个人中心 myCenter  wxml : /pages/myCenter/myCenter.wxml

<import src="/pages/template/template.wxml" />
    <template is="tabbars" data="{{t}}" />

个人中心 myCenter  css : /pages/myCenter/myCenter.wxss

@import "/pages/template/template.wxss";

个人中心 myCenter  js : /pages/myCenter/myCenter.js

 data: {
    //优化页面跳转参数
    t: {
      choosed: 2,                  //选中状态判断参数 
      url1: '/pages/index/index',  // url1首页路径
      url2: '',                    // url2 chooseRoom路径
      url3: '/pages/myCenter/myCenter',  //url3 myCenter页面路径
      p1: '',                       //返回首页delta值
      p2: '',                       //返回 chooseRoom页面的 delta值
      p3: '',                       //返回 myCneter 页面的 delta值 
      page1: '',    // 到首页的optenType字符串,决定是 navigatTo 还是navigatBack
      page2: '',    // 到chooseRoom页的optenType字符串,决定是 navigatTo 还是navigatBack
      page3: ''     // 到myCenter页的optenType字符串,决定是 navigatTo 还是navigatBack
    } 
}

 //页面跳转优化,参数设置
 betterNavigator: function() {
    var t_ = this.data.t
    var pages = getCurrentPages();
    // console.log("pages3:", pages[0].route)
    //如果历史页面有index页面 就设置 navigateback
    for (let i = pages.length - 1; i >= 0; i--) {
      // console.log("i1:", i);
      if (pages[i].route == "pages/index/index") {
        t_.p1 = pages.length - 1 - i
        t_.page1 = 'Back'
        t_.url1 = ''
        //  console.log("i2:",i);
        break
      }
    }
    //如果历史页面有chooseRoom页面 就设置 navigateback
    for (let i = pages.length - 1; i >= 0; i--) {
      if (pages[i].route == "pages/chooseRoom/chooseRoom") {
        t_.p2 = pages.length - 1 - i
        t_.page2 = 'Back'
        t_.url2 = ''

        break
      }
    }
    this.setData({
      t: t_
    })
    // console.log("t_3:", t_);
 },

以上内容主要涉及到微信小程序的 navigator组件

后记:

为什么我要 做一个这样的自定义的 仿真 导航栏呢??

如果把代码拿下去体验了的可能会注意到:

1.这个页面跳转的时候,滑动效果的视觉体验比navigatBack要 好;

2.如果仅仅用navigatTo 也有滑动效果啊,但是呢,这样会造成 currentPage 里面积累的页面太多,手机会很卡,而且页面单一的向左滑动也会造成审美疲劳,

综上所述:做一个这样的自定义仿真导航栏是为了更好的用户体验。

好了好了:该装的b都装完了,该贴的代码也贴了,

        有需要进一步交流的小伙伴,可以加qq群找我:635248448

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值