小程序-自定义tabbar

新建组件

image.png

tabbar.wxml

<view class="tabbar_box {{isIphoneX?'iphoneX-height':''}}" style="background-color:{{tabbar.backgroundColor}}">
  <block wx:for="{{tabbar.list}}" wx:key="{{item.pagePath}}">
    <navigator wx:if="{{item.isSpecial}}" class="tabbar_nav" hover-class="none" url="{{item.pagePath}}" style="color:{{item.selected ? tabbar.selectedColor : tabbar.color}}" open-type="switchTab">
      <view class='special-wrapper'>
        <image class="tabbar_icon" src="{{item.iconPath}}"></image>
      </view>
      <image class='special-text-wrapper'></image>
      <text>{{item.text}}</text>
    </navigator>
    <navigator wx:else class="tabbar_nav" hover-class="none" url="{{item.pagePath}}" style="color:{{item.selected ? tabbar.selectedColor : tabbar.color}}" open-type="switchTab">
      <image class="tabbar_icon" src="{{item.selected ? item.selectedIconPath : item.iconPath}}"></image>
      <text>{{item.text}}</text>
    </navigator>
  </block>
</view>

tabbar.wxss

.tabbar_box {
  display: flex;
  justify-content: space-around;
  position: fixed;
  bottom: 0;
  left: 0;
  z-index: 999;
  width: 100%;
  height: 118rpx;
  box-shadow: 0 0 4rpx rgba(0, 0, 0, 0.1);
}

.tabbar_box.iphoneX-height {
  padding-bottom: 66rpx;
}

.middle-wrapper {
  position: absolute;
  right: 310rpx;
  bottom: 0;
  background-color: #fff;
  width: 120rpx;
  height: 120rpx;
  border-radius: 50%;
  border-top: 2rpx solid #f2f2f3;
}

.middle-wrapper.iphoneX-height {
  bottom: 66rpx;
}

.tabbar_nav {
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  font-size: 20rpx;
  height: 100%;
  position: relative;
}

.tabbar_icon {
  width: 56rpx;
  height: 56rpx;
  margin-bottom: 6rpx;
}

.special-wrapper {
  position: absolute;
  left: 30rpx;
  top: -24rpx;
  width: 94rpx;
  height: 96rpx;
  border-radius: 50%;
  border-top: 2rpx solid #f2f2f3;
  background-color: #fff;
  text-align: center;
  box-sizing: border-box;
  padding: 6rpx;
}

.special-wrapper .tabbar_icon {
  width: 94rpx;
  height: 96rpx;
  position: absolute;
  left: 0;
  top: -8rpx;
}

.special-text-wrapper {
  width: 56rpx;
  height: 56rpx;
}

tabbar.js

// tabBarComponent/tabBar.js
const app = getApp();
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    tabbar: {
      type: Object,
      value: {
        "color": "#D2D2D2",
        "selectedColor": "#FFC000",
        "backgroundColor": "#ffffff", 
        "list": [
          {
            "pagePath": "/pages/home/index",
            "iconPath": "/tabbar/shouye.png",
            "selectedIconPath": "/tabbar/shouye02.png",
            "text": "首页"
          },
          {
            "pagePath": "/pages/reserve/index",
            "iconPath": "/tabbar/yuding.png",
            "selectedIconPath": "/tabbar/yuding02.png",
            "text": "预定"
          },
          {
            "pagePath": "/pages/match/index",
            "iconPath": "/tabbar/bisai.png",
            "selectedIconPath": "/tabbar/bisai.png",
            "text": "比赛",
            "isSpecial": true
          },
          {
            "pagePath": "/pages/club/index",
            "iconPath": "/tabbar/julebu.png",
            "selectedIconPath": "/tabbar/julebu02.png",
            "text": "俱乐部"
          },
          {
            "pagePath": "/pages/my/index",
            "iconPath": "/tabbar/wode.png",
            "selectedIconPath": "/tabbar/wode02.png",
            "text": "我的"
          }
        ]
      }
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    isIphoneX: app.globalData.systemInfo.model.includes("iPhone X")
  },

  /**
   * 组件的方法列表
   */
  methods: {

  }
})

tabbar.json

{
  "component": true,
  "usingComponents": {}
}

app.js

//app.js
App({
  onLaunch: function(options) {
    //隐藏系统tabbar
    this.hidetabbar();
    //获取设备信息
    this.getSystemInfo();
  },

  onShow: function() {
    wx.hideTabBar();
  },

  //封装wx.hideTabBar
  hidetabbar() {
    wx.hideTabBar({
      fail: function() {
        setTimeout(function() { // 延时保底
          wx.hideTabBar()
        }, 500)
      }
    });
  },

  getSystemInfo: function() {
    let t = this;
    wx.getSystemInfo({
      success: function(res) {
        t.globalData.systemInfo = res;
      }
    });
  },

  // 显示tabbar
  editTabbar: function() {
    let tabbar = this.globalData.tabBar;
    let currentPages = getCurrentPages();
    let _this = currentPages[currentPages.length - 1];
    let pagePath = _this.route;
    (pagePath.indexOf('/') != 0) && (pagePath = '/' + pagePath);
    for (let i in tabbar.list) {
      tabbar.list[i].selected = false;
      (tabbar.list[i].pagePath == pagePath) && (tabbar.list[i].selected = true);
    }
    _this.setData({
      tabbar: tabbar
    });
  },

  globalData: {
    systemInfo: null, //客户端设备信息
    tabBar: {
      "color": "#D2D2D2",
      "selectedColor": "#FFC000",
      "backgroundColor": "#ffffff",
      "list": [{
          "pagePath": "/pages/home/index",
          "iconPath": "/images/tabbar/shouye.png",
          "selectedIconPath": "/images/tabbar/shouye02.png",
          "text": "首页"
        },
        {
          "pagePath": "/pages/reserve/index",
          "iconPath": "/images/tabbar/yuding.png",
          "selectedIconPath": "/images/tabbar/yuding02.png",
          "text": "预定"
        },
        {
          "pagePath": "/pages/match/index",
          "iconPath": "/images/tabbar/bisai.png",
          "selectedIconPath": "/images/tabbar/bisai.png",
          "text": "比赛",
          "isSpecial": true
        },
        {
          "pagePath": "/pages/club/index",
          "iconPath": "/images/tabbar/julebu.png",
          "selectedIconPath": "/images/tabbar/julebu02.png",
          "text": "俱乐部"
        },
        {
          "pagePath": "/pages/my/index",
          "iconPath": "/images/tabbar/wode.png",
          "selectedIconPath": "/images/tabbar/wode02.png",
          "text": "我的"
        }
      ]
    }
  },
})

app.json

"list": [
      {
        "pagePath": "pages/home/index",
        "iconPath": "images/tabbar/shouye.png",
        "selectedIconPath": "images/tabbar/shouye02.png",
        "text": "首页"
      },
      {
        "pagePath": "pages/reserve/index",
        "iconPath": "images/tabbar/yuding.png",
        "selectedIconPath": "images/tabbar/yuding02.png",
        "text": "预定"
      },
      {
        "pagePath": "pages/match/index",
        "iconPath": "/images/tabbar/bisai.png",
        "selectedIconPath": "/images/tabbar/bisai.png",
        "text": "比赛",
        "isSpecial": true
      },
      {
        "pagePath": "pages/club/index",
        "iconPath": "images/tabbar/julebu.png",
        "selectedIconPath": "images/tabbar/julebu02.png",
        "text": "俱乐部"
      },
      {
        "pagePath": "pages/my/index",
        "iconPath": "images/tabbar/wode.png",
        "selectedIconPath": "images/tabbar/wode02.png",
        "text": "我的"
      }
    ]

页面.json

"usingComponents": {
    "tabbar": "/component/custom-tabbar/tabbar"
  }

页面 wxml 使用

<tabbar tabbar="{{tabbar}}"></tabbar>

页面 js

//获取应用实例
const app = getApp()

Page({
  data: {
    tabbar: {}
  },

  onLoad: function() {
    app.editTabbar();
  },

  onShow: function() {
    app.hidetabbar();
  },

})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,039评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,223评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,916评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,009评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,030评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,011评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,934评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,754评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,202评论 1 309
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,433评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,590评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,321评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,917评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,568评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,738评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,583评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,482评论 2 352