微信小程序 实现底部导航栏tabbar

2023-11-19

参考链接:
(1)微信小程序底部导航Tabbar
https://www.cnblogs.com/huangjialin/p/6278429.html
(2)小程序自定义tabbar实现中间图标突出效果(附带wx.hideTabBar不生效的bug解决方案)
https://www.jianshu.com/p/ce1c3c25527c
(3)微信小程序入门四: 顶部、导航栏样式、tabBar导航栏
https://blog.csdn.net/haibo0668/article/details/80651680
(4)微信小程序自定义tabbar组件点击对应区域显示凸起效果
https://blog.csdn.net/nan961136007/article/details/103913052

一、例子1

底部导航栏这个功能是非常常见的一个功能,基本上一个完成的app,都会存在一个导航栏,那么微信小程序的导航栏该怎么实现呢?经过无数的踩坑,终于实现了,好了,先看看效果图。
在这里插入图片描述
对于底部导航栏,小程序上给出的文档要求里面的item最少2个,最多五个。

{
  "pages":[
    "pages/index/index",
    "pages/logs/logs",
    "pages/mine/mine"

  ],
  "window":{
    "backgroundTextStyle":"light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "首页",
    "navigationBarTextStyle":"black"
  },

  "tabBar": {
   "color": "#a9b7b7",
   "selectedColor": "#11cd6e",
   "borderStyle": "black" ,
   "list": [{
     "selectedIconPath": "images/icon_consult_press.png",
     "iconPath": "images/icon_consult.png",
     "pagePath": "pages/index/index",
     "text": "首页"
   }, {
     "selectedIconPath": "images/icon_invest_press.png",
     "iconPath": "images/icon_invest.png",
     "pagePath": "pages/logs/logs",
     "text": "一元投"
   },{
     "selectedIconPath": "images/icon_mine_press.png",
     "iconPath": "images/icon_mine.png",
     "pagePath": "pages/mine/mine",
     "text": "我的"
   }
   ]
 }
}

解释一下这些属性是什么意思:

  • tabBar 指底部的 导航配置属性
  • color 未选择时 底部导航文字的颜色
  • selectedColor 选择时 底部导航文字的颜色
  • borderStyle 底部导航边框的样色(注意 这里如果没有写入样式 会导致 导航框上边框会出现默认的浅灰色线条)
  • list 导航配置数组
  • selectedIconPath 选中时 图标路径
  • iconPath 未选择时 图标路径
  • pagePath 页面访问地址
  • text 导航图标下方文字

需要注意一些小问题:

  • 每个页面的json文件都不能去掉navigationBarTitleText这个属性。否则会报错
  • "pages":[ "pages/index/index", "pages/logs/logs", "pages/mine/mine" ],

这个页面的注册一定要注意,第一个一定是要是最先显示的,否则会出现底部导航看不到。

二、例子2

github传送门 https://github.com/SuRuiGit/wxapp-customTabbar
在这里插入图片描述
集成到项目
第一步:找到项目中的tabbarComponent目录,拷贝到你的工程中,然后将tabbarComponent->icon图标替换成你自己的tabbar图片(建议把tabbarComponent目录与pages同级)
在这里插入图片描述
在这里插入图片描述
第二步:到app.json中配置tabBar,如果tabbar中间的按钮是跳到二级页面,就不要配置在tabBar的list中,如果配置了,中间的按钮点击是无效的,要注意。
在这里插入图片描述
第三步:在app.js的onLaunch方法中调用hidetabbar()自己封装一下,代码如下,隐藏系统自带的tabBar直接写wx.hideTabBar在安卓8.0有bug,并且在每一个用到tabbar的js文件中的onReady和onShow中调用一下app.hidetabbar(),调用getSystemInfo()方法获取设备信息,主要是为了适配iPhone X,这个方法在下面会给出。
在这里插入图片描述

//自己对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;
      }
    });
  },

第四步:在app.js中的globalData中加入自定义tabbar和systemInfo的参数,再加入一个方法给tabBar.list配置中的页面使用,代码如下。

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: {
      "backgroundColor": "#ffffff",
      "color": "#979795",
      "selectedColor": "#1c1c1b",
      "list": [
        {
          "pagePath": "/page/index/index",
          "iconPath": "icon/icon_home.png",
          "selectedIconPath": "icon/icon_home_HL.png",
          "text": "首页"
        },
        {
          "pagePath": "/page/myRelease/index",
          "iconPath": "icon/icon_release.png",
          "isSpecial": true,
          "text": "发布"
        },
        {
          "pagePath": "/page/mine/index",
          "iconPath": "icon/icon_mine.png",
          "selectedIconPath": "icon/icon_mine_HL.png",
          "text": "我的"
        }
      ]
     }
  }

第五步:在tabBar的list中配置的页面的.js文件的data中加入tabbar:{},并在onload方法中调用app.editTabbar();

第六步:在tabBar的list中配置的页面的.json文件中加入"usingComponents": { “tabbar”: “…/…/tabbarComponent/tabbar” }在.wxml文件中加入

第七步:修改tabbarComponent->tabbar.js->data中的代码,代码截图如下
这里就是作者的一个小bug,本来作者写的是==‘iPhone X’,在模拟器上没有问题,但是真机上返回的却不是这个字段,所以我们要改成包含
在这里插入图片描述

三、例子3

小程序的导航栏样式在app.json中定义。这里设置导航,背景黑色,文字白色,文字内容测试小程序
app.json内容:

{
  "pages":[
    "pages/index/index",
    "pages/login/login",
    "pages/logs/logs"
  ],
  "window":{
    "backgroundTextStyle":"red",
    "navigationBarBackgroundColor": "#000",
    "navigationBarTitleText": "测试小程序",
    "navigationBarTextStyle":"#fff"
  }
}

在这里插入图片描述
tabBar挺好的,可以放置于顶部或者底部,用于不同功能页面的切换。tabBar同样在app.json中进行定义,看一下我在app.json中对tabBar的相关定义:

  "tabBar": {
    "selectedColor": "#1296db",
    "list": [{
      "pagePath": "pages/index/index",
      "text": "首页",
      "iconPath": "images/ico-home.png",
      "selectedIconPath": "images/ico-home-d.png"
    },{
      "pagePath": "pages/setting/setting",
      "text": "设置",
      "iconPath": "images/ico-setting.png",
      "selectedIconPath": "images/ico-setting-d.png"
    },{
      "pagePath": "pages/help/help",
      "text": "帮助",
      "iconPath": "images/ico-help.png",
      "selectedIconPath": "images/ico-help-d.png"
    }]
  }

在这里插入图片描述

四、例子4

在这里插入图片描述
首先呢,先创建template文件夹,里面包含wxml,wxss和 js。

wxml文件

<view class='footer'>
  <view class='footer_list' data-current="{{0}}" bindtap="chooseImg">
    <image class="footer-image" hidden='{{curIdx===0}}' src="{{listInfo[0].imgUrl}}"></image>
    <view hidden='{{curIdx!==0}}' class="tab-img">
      <image class="footer-image2" src="{{listInfo[0].curUrl}}"></image>
    </view>
    <!-- 等于该id的话图标和名称就凸起来 -->
    <view class="footer-text">首页</view>
    <view hidden='{{curIdx!==0}}' class="footer-text2">首页</view>
  </view>

  <view class='footer_list' data-current="{{1}}" bindtap="chooseImg">
    <image class="footer-image" hidden='{{curIdx===1}}' src="{{listInfo[1].imgUrl}}"></image>
    <view hidden='{{curIdx!==1}}' class="tab-img">
      <image class="footer-image2" src="{{listInfo[1].curUrl}}"></image>
    </view>
    <view class="footer-text">分类</view>
    <view hidden='{{curIdx!==1}}' class="footer-text2">分类</view>
  </view>

  <view class='footer_list' data-current="{{2}}" bindtap="chooseImg">
    <image class="footer-image" hidden='{{curIdx===2}}' src="{{listInfo[2].imgUrl}}"></image>
    <view hidden='{{curIdx!==2}}' class="tab-img">
      <image class="footer-image2" src="{{listInfo[2].curUrl}}"></image>
    </view>
    <view class="footer-text">购物车</view>
    <view hidden='{{curIdx!==2}}' class="footer-text2">购物车</view>
  </view>

  <view class='footer_list' data-current="{{3}}" bindtap="chooseImg">
    <image class="footer-image" hidden='{{curIdx===3}}' src="{{listInfo[3].imgUrl}}"></image>
    <view hidden='{{curIdx!==3}}' class="tab-img">
      <image class="footer-image2" src="{{listInfo[3].curUrl}}"></image>
    </view>
    <view class="footer-text">个人中心</view>
    <view hidden='{{curIdx!==3}}' class="footer-text2">个人中心</view>
  </view>
</view>

wxss文件

page {
  background: #f8f7f6;
}
.footer {
  position: fixed;
  bottom: 0;
  width: 100%;
  height: 105rpx; /*footer的高度*/
  background: #fff;
  z-index: 500;
  border-top: 1rpx solid #e9e9e9;
  display: flex;
  flex-direction: row;
}
.footer_list {
  display: flex;
  flex-direction: column;
  align-items: center;
  width: 100%;
  height: 100%;
}
.footer-image {
  width: 50rpx;
  height: 50rpx;
  margin-top: 10rpx;

}
.footer-image2 {
  width: 50rpx;
  height: 50rpx;
  margin-top: 20rpx;
}
.footer-text2 {
  font-size: 24rpx;
  margin-top: 15rpx;
  color: #896D59;
}
.tab-img {
  position: absolute;
  top: -36rpx;
  width: 96rpx;
  height: 96rpx;
  border-radius: 50%;
  border-top: 2rpx solid #f2f2f3;
  background-color: #fff;
  text-align: center;
  box-sizing: border-box;
  padding: 6rpx;
}
.footer-text {
  font-size: 24rpx;
  margin-top: 10rpx;
  color: #896D59;
}

js文件

// pages/template/template.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    listInfo: [{
      text: '首页',
      imgUrl: '/pages/images/main.png',
      curUrl: '/pages/images/mian_lo1_on.png',
    },
    {
      text: '分类',
      imgUrl: '/pages/images/mian_lo2.png',
      curUrl: '/pages/images/mian_lo2_on.png',
    },
    {
      text: '购物车',
      imgUrl: '/pages/images/mian_lo3.png',
      curUrl: '/pages/images/mian_lo3_on.png',
    },
    {
      text: '个人中心',
      imgUrl: '/pages/images/mian_lo4.png',
      curUrl: '/pages/images/mian_lo4_on.png',
    }]
  },
  // 底部导航
  chooseImg: function (e) {
    var that = this
    this.setData({
      curIdx: e.currentTarget.dataset.current
    })
    console.log("kk", e.currentTarget.dataset.current)
    if (e.currentTarget.dataset.current == 0) {
      wx.switchTab({
        url: '/pages/index/index',
      })
    } else if (e.currentTarget.dataset.current == 1) {
      wx.switchTab({
        url: '/pages/classify/classify',
      })
    } else if (e.currentTarget.dataset.current == 2) {
      wx.switchTab({
        url: '/pages/car/car',
      })
    } else if (e.currentTarget.dataset.current == 3) {
      wx.switchTab({
        url: '/pages/person/person',
      })
    }
    that.onShow();
  },
  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    var that = this
  },
  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {
    this.onLoad();
  },
})

app.json文件

{
  "pages": [
    "pages/index/index",
    "pages/classify/classify",
    "pages/car/car",
    "pages/person/person",
    "pages/template/template"
  ],
  "window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#fff",
    "navigationBarTitleText": "你们项目的名字",
    "navigationBarTextStyle": "black"
  },
  "tabBar": {
    "backgroundColor": "#ffffff",
    "color": "#896D59",
    "selectedColor": "#896D59",
    "list": [
      {
        "pagePath": "pages/index/index",
        "text": "首页",
        "iconPath": "pages/images/main.png",
        "selectedIconPath": "pages/images/mian_lo1_on.png"
      },
      {
        "pagePath": "pages/classify/classify",
        "text": "分类",
        "iconPath": "pages/images/mian_lo2.png",
        "selectedIconPath": "pages/images/mian_lo2_on.png"
      },
      {
        "pagePath": "pages/car/car",
        "text": "购物车",
        "iconPath": "pages/images/mian_lo3.png",
        "selectedIconPath": "pages/images/mian_lo3_on.png"
      },
      {
        "pagePath": "pages/person/person",
        "text": "个人中心",
        "iconPath": "pages/images/mian_lo4.png",
        "selectedIconPath": "pages/images/mian_lo4_on.png"
      }
    ]
  },
  "sitemapLocation": "sitemap.json"
}

app.js文件

//app.js
App({
  onLaunch: function () {
    //隐藏系统tabbar
    wx.hideTabBar();

    // 展示本地存储能力
    var logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 登录
    wx.login({
      success: res => {
        // 发送 res.code 到后台换取 openId, sessionKey, unionId
      }
    })
    // 获取用户信息
    wx.getSetting({
      success: res => {
        if (res.authSetting['scope.userInfo']) {
          // 已经授权,可以直接调用 getUserInfo 获取头像昵称,不会弹框
          wx.getUserInfo({
            success: res => {
              // 可以将 res 发送给后台解码出 unionId
              this.globalData.userInfo = res.userInfo

              // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
              // 所以此处加入 callback 以防止这种情况
              if (this.userInfoReadyCallback) {
                this.userInfoReadyCallback(res)
              }
            }
          })
        }
      }
    })
  },
  onShow: function () {
    //隐藏系统tabbar
    wx.hideTabBar();
  },
  globalData: {
    userInfo: null
  }
})

app.js的重点是隐藏小程序自带的tabbar,让你自定义的组件得以显示,并且不被占位置。

然后是每个界面的引用了,你想在哪个界面显示这个tabbar,就放进去以下代码。比如index首页嘛,记得看你们的层级引用模板文件哦,不然会报错的。

wxml文件

<import src='../../template/template.wxml' />
<view>
  <include src="/pages/template/template.wxml" />
</view>

wxss文件

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

js文件

Page({
  data: {
	listInfo: [{
        text: '首页',
        imgUrl: '/pages/images/main.png',
        curUrl: '/pages/images/mian_lo1_on.png',
      },
      {
        text: '分类',
        imgUrl: '/pages/images/mian_lo2.png',
        curUrl: '/pages/images/mian_lo2_on.png',
      },
      {
        text: '购物车',
        imgUrl: '/pages/images/mian_lo3.png',
        curUrl: '/pages/images/mian_lo3_on.png',
      },
      {
        text: '个人中心',
        imgUrl: '/pages/images/mian_lo4.png',
        curUrl: '/pages/images/mian_lo4_on.png',
      }],
      // 底部导航
  chooseImg: function(e) {
    var that = this
    this.setData({
      curIdx: e.currentTarget.dataset.current
    })
    console.log("kk", e.currentTarget.dataset.current)
    if (e.currentTarget.dataset.current == 0) {
      wx.switchTab({
        url: '/pages/index/index',
      })
    } else if (e.currentTarget.dataset.current == 1) {
      wx.switchTab({
        url: '/pages/classify/classify',
      })
    } else if (e.currentTarget.dataset.current == 2) {
      wx.switchTab({
        url: '/pages/car/car',
      })
    } else if (e.currentTarget.dataset.current == 3) {
      wx.switchTab({
        url: '/pages/person/person',
      })
    }
    that.onShow();
  },
  onLoad: function(options) {
    var curIdx = 0
    this.setData({
      curIdx: curIdx,
    })

  },
  onShow: function() {
    this.onLoad();
  },
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微信小程序 实现底部导航栏tabbar 的相关文章

随机推荐

  • docker打包运行中的容器,生成镜像文件保存到本地

    因为想着方便部署 将所有没问题的项目容器打包成镜像 走到哪儿都离线安装自动部署 第一步先把运行中的容器打包成镜像 docker commit 运行中容器id 像打包成的镜像名称 第二步将大象装进冰箱 不好意思说错了 把镜像保存到本地 doc
  • 穷举法解决鸡兔同笼问题 Python实现

    今天学习王晓华老师课程中的穷举法 在此简单用穷举法求解鸡兔同笼问题 import pandas as pd import numpy as np head 50 foot 120 def chick rabbit head foot rab
  • python 赋值/浅拷贝/深拷贝的区别

    在了解赋值 浅拷贝 深拷贝之前 需要预热一下python对象知识点 一 变量名字和对象 a 123 b 1 2 3 代码中 a和b是变量名称 123和 1 2 3 是对象 对象包括值和类型 python中 一切皆对象 对象占内存 内存中存放
  • 5、DML语句(数据操纵语言-增删改查)

    文章目录 一 DML语句介绍 二 insert 增加 插入数据 1 基本语法 2 示例 三 delete 删除表中的某行或者某些行数据 1 基本语法 2 示例 四 update 更新 修改 1 基本语法 2 示例 五 select 查询 1
  • 软件和建筑的结构

    一般都倾向于将软件比作建筑 因为建筑的架构和软件框架类似 好的建筑需要好的框架 但是大家忽略了另外一个情况 一个建筑要能居住 不但要好的建 筑风格和框架 更需要有好的家居和内部装修 建筑居住的舒适度很大程度上由内部装修细节决定的 装修时家居
  • 程序员,职场上请远离这种人!

    对有些职场人来讲 甩锅就是一种生存手段 01 从大学打篮球说起 上大学的时候喜欢打篮球 然后我又特别喜欢抢篮板 经常是跳起来的时候没事 落下来的时候偶尔会踩到别人的脚上 于是左脚经常性崴脚 这是背景 我们班上有一个同学也喜欢打篮球 我俩水平
  • 多媒体透明屏,在户外广告领域中,有哪些应用展示?

    多媒体透明屏是一种新型的显示技术 它能够将图像和视频直接投射到透明的屏幕上 使得观众可以同时看到屏幕后面的实物 这种技术在广告 展览 商场等场合有着广泛的应用前景 多媒体透明屏的原理是利用透明显示技术 将图像和视频通过光学投射技术投射到透明
  • 【C语言初学】作业:计算在贷款第一个月、第二个月、第三个月后需要还款金额

    贷款金额 20000 00元 年贷款利率 6 0 每个月还款金额 386 66 第一个月剩余的需还款金额 19713 34元 第二个月剩余的需还款金额 19425 25元 第三个月剩余的需还款金额 19135 71元 提示 每个月剩余的贷款
  • 深入浅出 sideEffects

    前言 最近在给团队对 webpack 中的 sideEffects 字段用途进行微分享 于是乎 我最后就整理成一篇文章 希望帮助更多的人理解 sideEffects 的作用 sideEffects 是什么呢 我用一句话来概括就是 让 web
  • redis 安装配置

    原文链接 https www cpweb top 1266 一 介绍 Redis 是一个开源的 基于内存的数据结构存储系统 它可以用作数据库 缓存和消息中间件 它是一个键值 Key Value 存储数据库 为非关系型数据库 它支持多种类型的
  • 在el-table的功能,并且在单元格里面加入输入框

    在我们的前端拿到后端返回的数据的时候 需要在el table的功能 并且在单元格里面加入输入框 为了让输入框的输入时候不会影响到其他的输入框 可以使用 input来获取输入框内容的值
  • python 多个logger对象使用,输出到多个文件

    就不介绍logger基础配置了 如何创建多个logger对象 输出到多个文件 import logging from datetime import datetime def get logger name logger logging g
  • 解决BookxNotePro在linux下无法启动或GLIBC_2.29‘ not found的问题

    问题描述如题 命令行启动出现如下报错 usr local BookxNotePro BookxNotePro usr local BookxNotePro BookxNotePro lib x86 64 linux gnu libm so
  • JS声明二维数组常见办法

    JS声明二维数组常见办法 目录 文章目录 前言 new Array 和 fill fill 灵活插入 for 笨办法 Array from 前言 目前论坛常见的办法代码质量奇差 因此针对这个问题进行整理 new Array和fill con
  • 使用机器学习算法打造一个简单的“微博指数”

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 林浩威 前言 随着人工智能的大热 越来越多的小伙伴们开始投身到机器学习的大潮中 作为其中的一员 我对此也是极有兴趣的 当然我更感兴趣的 是怎么利用这些有趣的算法 来实现脑海里
  • element样式无法修改

    在使用el form组件时 组件中的字体是黑色的 需要显示白色字体就加了个color fff 结果发现修改并没有什么效果 还是原来的黑色 打开F12发现属于 el form item label选择器下面的 我就在css下面修改了该选择器
  • 端口占用查询

    我们做WEB开发 本地调试时 有时出现 Caused by java net BindException Address already in use bind at sun nio ch Net bind0 Native Method a
  • 机械孔与盲孔

    过孔是什么 过孔 Via 电路板上的孔 连接不同层之间的线路 把电路板从平面结构变成立体结构 单层线路想不交叉太难了 双层或更多层线路 必须通过过孔来连接 通过孔壁上的铜 连通上下层的电路铜线 单层PCB 有些时候无法布线 必须通过过孔换层
  • Chisel手册之Types

    本文是Chisel手册第二篇Types Types 表示硬件设计的Chisel图包含原始节点和类型节点 Chisel类型系统与底层Scala类型系统分开维护 因此类型节点散布在原始节点之间 以允许Chisel检查并响应Chisel类型 Ch
  • 微信小程序 实现底部导航栏tabbar

    参考链接 1 微信小程序底部导航Tabbar https www cnblogs com huangjialin p 6278429 html 2 小程序自定义tabbar实现中间图标突出效果 附带wx hideTabBar不生效的bug解