在小程序开发中,默认底部导航栏很难满足实际需求,好在官方给出了自定义形式,效果如下:

话不多说,直接上代码

1.组件

custom-tarbar.vue文件

  1. <template>
  2. <view class="tarbar">
  3. <view
  4. class=".tarbar-list"
  5. :style="{
  6. background: tabBar.backgroundColor,
  7. color: tabBar.color,
  8. 'border-top': tabBar.position == 'bottom' ? '1rpx solid ' + tabBar.borderStyle : 0,
  9. 'border-bottom': tabBar.position == 'top' ? '1rpx solid ' + tabBar.borderStyle : 0
  10. }"
  11. >
  12. <view class="tarbar-list-ul">
  13. <view class="tarbar-list-li" :class="index == 2 ? 'tarbar-list-li-center' : ''" v-for="(item, index) in tabBar.list" :key="index" @click.top="setSelected(index)">
  14. <block v-if="index != 2">
  15. <view class="tarbar-list-li-icon"><image :src="selected == index ? item.selectedIconPath : item.iconPath" mode=""></image></view>
  16. <view class="tarbar-list-li-name">{{ item.text }}</view>
  17. </block>
  18. <block v-else>
  19. <view class="tarbar-list-li-icon"><image :src="item.selectedIconPath" mode=""></image></view>
  20. </block>
  21. </view>
  22. </view>
  23. </view>
  24. <block v-if="isShowMask"><release-popup @close-mask="closeMask"></release-popup></block>
  25. </view>
  26. </template>
  27.  
  28. <script>
  29. import releasePopup from './release-popup.vue';
  30. export default {
  31. components: {
  32. 'release-popup': releasePopup
  33. },
  34. props: ['selected'],
  35. data() {
  36. return {
  37. tabBar: {
  38. color: '#ccc',
  39. selectedColor: '#E84351',
  40. borderStyle: '#ccc',
  41. backgroundColor: '#fff',
  42. position: 'bottom',
  43. list: [
  44. {
  45. pagePath: '/pages/index/index',
  46. iconPath: '/static/tarbar/home1.png',
  47. selectedIconPath: '/static/tarbar/home2.png',
  48. text: '首页'
  49. },
  50. {
  51. pagePath: '/pages/foodie/foodie',
  52. iconPath: '/static/tarbar/foodie1.png',
  53. selectedIconPath: '/static/tarbar/foodie2.png',
  54. text: '吃什么'
  55. },
  56. {
  57. pagePath: '/pages/releaseBtn/releaseBtn',
  58. iconPath: '',
  59. selectedIconPath: '/static/tarbar/release.png'
  60. },
  61. {
  62. pagePath: '/pages/discover/discover',
  63. iconPath: '/static/tarbar/discover1.png',
  64. selectedIconPath: '/static/tarbar/discover2.png',
  65. text: '发现'
  66. },
  67. {
  68. pagePath: '/pages/personal/personal',
  69. iconPath: '/static/tarbar/personal1.png',
  70. selectedIconPath: '/static/tarbar/personal2.png',
  71. text: '我的'
  72. }
  73. ]
  74. },
  75. oldSelected: 0, // 记录之前访问的索引; 值为2的时候显示遮罩
  76. isShowMask: false
  77. };
  78. },
  79. onLoad() {},
  80. methods: {
  81. setSelected(index) {
  82. console.log(index);
  83. if (index != 2) {
  84. uni.switchTab({
  85. url: this.tabBar.list[index].pagePath
  86. });
  87. } else {
  88. this.isShowMask = true;
  89. }
  90. this.$forceUpdate();
  91. },
  92. closeMask() {
  93. this.isShowMask = false;
  94. }
  95. }
  96. };
  97. </script>
  98.  
  99. <style>
  100. .tarbar {
  101. width: 100%;
  102. z-index: 9999;
  103. position: fixed;
  104. }
  105. .tarbar-list {
  106. width: 100%;
  107. height: 120upx;
  108. background: #4d586f;
  109. position: fixed;
  110. left: 0;
  111. bottom: 0;
  112. }
  113. .tarbar-list-ul {
  114. width: 100%;
  115. height: 100%;
  116. padding: 20upx 50upx;
  117. display: flex;
  118. justify-content: space-between;
  119. box-sizing: border-box;
  120. }
  121. .tarbar-list-li {
  122. width: 80upx;
  123. height: 80upx;
  124. }
  125. .tarbar-list-li-icon {
  126. width: 50upx;
  127. height: 50upx;
  128. margin: 0 auto;
  129. }
  130. .tarbar-list-li-icon image {
  131. width: 50upx;
  132. height: 50upx;
  133. }
  134. .tarbar-list-li-name {
  135. width: 100%;
  136. text-align: center;
  137. line-height: 30upx;
  138. font-size: 20upx;
  139. height: 30upx;
  140. }
  141. .tarbar-list-li-center {
  142. width: 100upx;
  143. }
  144. .tarbar-list-li-center .tarbar-list-li-icon,
  145. .tarbar-list-li-center .tarbar-list-li-icon image {
  146. width: 90upx;
  147. height: 60upx;
  148. }
  149. </style>

custom-tarbar.vue

release-popup.vue文件(弹窗)

  1. <template>
  2. <view class="mask">
  3. <view class="mask-top">
  4. <view class="mask-title">唯美食与爱不可辜负</view>
  5. <view class="mask-desc">对于美食的热爱,如果用一句话来形容,那就是:唯美食与爱不可辜负。</view>
  6. <view class="mask-btn">
  7. <view class="mask-btn-list" v-for="(item, index) in btnList" :key="index" @click.stop="toRelease(index)">
  8. <view class="mask-btn-list-icon iconfont" :class="item.icon"></view>
  9. <view class="mask-btn-list-name">{{ item.name }}</view>
  10. </view>
  11. </view>
  12. </view>
  13. <view class="mask-close iconfont iconfabu-guanbi" @click.stop="closeMask"></view>
  14. </view>
  15. </template>
  16.  
  17. <script>
  18. export default {
  19. data() {
  20. return {
  21. btnList: [
  22. { icon: 'iconfabu-fashipin', name: '发视频' },
  23. { icon: 'iconfabu-facaipu', name: '发菜谱' },
  24. { icon: 'iconfabu-shaimeishi', name: '晒美食' },
  25. { icon: 'iconfabu-caogaoxiang', name: '草稿箱' }
  26. ]
  27. };
  28. },
  29. methods: {
  30. closeMask() {
  31. this.$emit('close-mask');
  32. },
  33. toRelease(index) {
  34. let url = '';
  35. if (index == 1) {
  36. url = '';
  37. } else if (index == 2) {
  38. url = '/pages/release/release';
  39. } else if (index == 3) {
  40. url = '';
  41. } else {
  42. url = '';
  43. }
  44. if (!url) {
  45. this.getMessage('敬请期待', 0);
  46. return;
  47. }
  48. uni.navigateTo({
  49. url: url
  50. });
  51. },
  52. getMessage(title, icon = 0, duration = 2000, mask = true) {
  53. icon = icon == 1 ? 'success' : icon == 2 ? 'loading' : 'none';
  54. uni.showToast({
  55. title: title,
  56. icon: icon,
  57. duration: duration,
  58. mask: mask
  59. });
  60. }
  61. }
  62. };
  63. </script>
  64.  
  65. <style>
  66. .mask {
  67. padding: 100upx 80upx 0;
  68. width: 100%;
  69. height: 100vh;
  70. background: #f6f7f7;
  71. position: relative;
  72. box-sizing: border-box;
  73. /* left: 0;
  74. top: 0; */
  75. }
  76. .mask-top {
  77. width: 100%;
  78. color: #595656;
  79. }
  80. .mask-title {
  81. height: 100upx;
  82. line-height: 100upx;
  83. font-size: 50upx;
  84. }
  85. .mask-desc {
  86. width: 100%;
  87. height: 260upx;
  88. line-height: 50upx;
  89. font-size: 30upx;
  90. }
  91. .mask-btn {
  92. width: 100%;
  93. height: 560upx;
  94. padding: 0 10upx;
  95. display: flex;
  96. flex-wrap: wrap;
  97. justify-content: space-between;
  98. align-content: space-between;
  99. box-sizing: border-box;
  100. }
  101. .mask-btn-list {
  102. width: 260upx;
  103. height: 260upx;
  104. border-radius: 20upx;
  105. background: #007aff;
  106. padding: 70upx;
  107. box-sizing: border-box;
  108. }
  109. .mask-btn-list:nth-child(1) {
  110. background: -webkit-linear-gradient(30deg, #fadde9, #eb68a3); /* Safari 5.1 - 6.0 */
  111. background: -o-linear-gradient(30deg, #fadde9, #eb68a3); /* Opera 11.1 - 12.0 */
  112. background: -moz-linear-gradient(30deg, #fadde9, #eb68a3); /* Firefox 3.6 - 15 */
  113. background: linear-gradient(30deg, #fadde9, #eb68a3); /* 标准的语法(必须放在最后) */
  114. color: #5d163a;
  115. }
  116. .mask-btn-list:nth-child(2) {
  117. background: -webkit-linear-gradient(30deg, #d7e378, #1eb7b6); /* Safari 5.1 - 6.0 */
  118. background: -o-linear-gradient(30deg, #d7e378, #1eb7b6); /* Opera 11.1 - 12.0 */
  119. background: -moz-linear-gradient(30deg, #d7e378, #1eb7b6); /* Firefox 3.6 - 15 */
  120. background: linear-gradient(30deg, #d7e378, #1eb7b6); /* 标准的语法(必须放在最后) */
  121. color: #113d41;
  122. }
  123. .mask-btn-list:nth-child(3) {
  124. background: -webkit-linear-gradient(30deg, #a7daf6, #7b4d9b); /* Safari 5.1 - 6.0 */
  125. background: -o-linear-gradient(30deg, #a7daf6, #7b4d9b); /* Opera 11.1 - 12.0 */
  126. background: -moz-linear-gradient(30deg, #a7daf6, #7b4d9b); /* Firefox 3.6 - 15 */
  127. background: linear-gradient(30deg, #a7daf6, #7b4d9b); /* 标准的语法(必须放在最后) */
  128. color: #2a274c;
  129. }
  130. .mask-btn-list:nth-child(4) {
  131. background: -webkit-linear-gradient(30deg, #ffef01, #ee7437); /* Safari 5.1 - 6.0 */
  132. background: -o-linear-gradient(30deg, #ffef01, #ee7437); /* Opera 11.1 - 12.0 */
  133. background: -moz-linear-gradient(30deg, #ffef01, #ee7437); /* Firefox 3.6 - 15 */
  134. background: linear-gradient(30deg, #ffef01, #ee7437); /* 标准的语法(必须放在最后) */
  135. color: #562f15;
  136. }
  137. .mask-btn-list-icon {
  138. width: 100%;
  139. height: 70upx;
  140. line-height: 70upx;
  141. text-align: center;
  142. font-size: 50upx;
  143. }
  144. .mask-btn-list-name {
  145. width: 100%;
  146. height: 50upx;
  147. line-height: 50upx;
  148. text-align: center;
  149. font-size: 30upx;
  150. }
  151. .mask-close {
  152. width: 80upx;
  153. height: 80upx;
  154. position: absolute;
  155. left: 50%;
  156. margin-left: -40upx;
  157. bottom: 40upx;
  158. font-size: 50upx;
  159. line-height: 80upx;
  160. text-align: center;
  161. color: #595656;
  162. }
  163. </style>

release-popup.vue

2.调用

  1. <template>
  2. <view class="content">
  3. <custom-tarbar :selected="0"></custom-tarbar>
  4. <view class="home">
  5. home
  6. </view>
  7. </view>
  8. </template>
  9.  
  10. <script>
  11. import customTarbar from '@/wxcomponents/custom-tarbar/custom-tarbar.vue';
  12. export default {
  13. components: {
  14. 'custom-tarbar': customTarbar
  15. }
  16. };
  17. </script>
  18.  
  19. <style>
  20. .content {
  21. width: 100%;
  22. }
  23. </style>

注意:组件传值(selected)索引对应默认从0开始

uniapp 小程序实现自定义底部导航栏(tarbar)的更多相关文章

  1. 小程序 mpvue自定义底部导航栏

    1.在compontents新建文件放入 <template> <section class="tabBar-wrap"> <article clas ...

  2. uniapp 小程序 flex布局 v-for 4栏展示

    注:本项目的图片资源来源于后端接口,所以使用的是v-for. 关键词:uniapp 小程序 flex布局 v-for 4栏展示 自适应 <view style="display: fl ...

  3. 微信小程序自定义底部导航栏组件+跳转

    微信小程序本来封装有底部导航栏,但对于想自定义样式和方法的开发者来说,这并不是很好. 参考链接:https://github.com/ljybill/miniprogram-utils/tree/ma ...

  4. 小程序配置单个页面导航栏的属性(微信小程序交流群:604788754)

    配置单个页面导航栏的属性: 就在所要配置页面相对应的json文件中写入以下想要设置的属性: { "navigationBarBackgroundColor": "#fff ...

  5. 初尝微信小程序2-Swiper组件、导航栏标题配置

    swiper 滑块视图容器. 很多网页的首页都会有一个滚动的图片模块,比如天猫超市首页,滚动着很多优惠活动的图片,用来介绍优惠内容,以及供用户点击快速跳转到相应页面. Swiper不仅可以滚动图片,也 ...

  6. 微信小程序之自定义底部弹出框动画

    最近做小程序时,会经常用到各种弹框.直接做显示和隐藏虽然也能达到效果,但是体验性太差,也比较简单粗暴.想要美美地玩,添加点动画还是非常有必要的.下面做一个底部上滑的弹框. wxml <view ...

  7. 自定义底部导航栏(tabBar)

    前言如果大家用过微信提供的tabBar就会发现,他的tabBar有很大的局限性.暂且不说样式局限性了,他提供的app.json配置文件中没有function.这也就意味着使用它提供的这个组件,你只能用 ...

  8. 微信小程序开发之tab导航栏

    实现功能: 点击不同的tab导航,筛选数据 UI:   js: data:{ navbar: ['半月维保', '季度维保', '半年维保',"年度维保"],    //count ...

  9. 微信小程序点击顶部导航栏切换样式

    类似这样的效果 <view class='helpCateList'> <!-- 类别 --> <scroll-view class='scroll-view' scro ...

随机推荐

  1. 用Hyper-v 在win10下使用Docker-Desktop体验kubernetes

    首先开启Hyper-v ,会自动创建一个交换机. 开启internet共享,自动创建的那个交换机(虚拟的网络适配器)会分配一个默认的IP 192.168.137.1,这个IP你不爽,就用注册表搜索并修 ...

  2. js加密(十)csti.cn md5

    1. http://www.csti.cn/index.htm 2. 登录密码加密 3. 加密js: var hexcase = 0; var b64pad = ""; var c ...

  3. 搭建 nginx + rtmp 媒体服务器笔记

    工作需要搭建一个流媒体服务器,用来接收前端推过来的视频流,达到实时保存的目的. 具体步骤网上已经比较详细了 可以参考下面这个文档参考文档 https://www.cnblogs.com/monjeo/ ...

  4. 字典NSDictionary和NSMutableDictionary的使用

    简介:字典是一种数据结构,字典里面的每一个元素,是一个key-value(键值对),key和value都是对象类型.同NSArray一样,里面的对象不用保持一致性. NSDictionary 1.字面 ...

  5. C# 中的委托和事件 转载张子阳的

        C# 中的委托和事件 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人 ...

  6. 高斯消元几道入门题总结POJ1222&&POJ1681&&POJ1830&&POJ2065&&POJ3185

    最近在搞高斯消元,反正这些题要么是我击败了它们,要么就是这些题把我给击败了.现在高斯消元专题部分还有很多题,先把几道很简单的入门题总结一下吧. 专题:http://acm.hust.edu.cn/vj ...

  7. jQuery EasyUI window窗口实例

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>j ...

  8. HTTP和HTTPS的区别,SSL的握手过程

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  9. 如何书写高效的MySQL查询?

    How to write efficient MySQL query statements WHERE子句中的书写注意事项 模糊查询(like)时需要注意的事项 索引 字段类型 表连接时的注意事项 其 ...

  10. Eclipse 导入 Tomcat 源码

    我的环境:Win10,Eclipse 4.8.0 Photon,JDK 10.0.2   1.下载Tomcat源码 我下载的是:apache-tomcat-9.0.12-src.zip 下载地址:ht ...