当前位置:   article > 正文

小程序自定义tabBar,uniapp自定义tabBar_uni.settabbarstyle怎么更换小程序tabar的icon

uni.settabbarstyle怎么更换小程序tabar的icon

cover-view
覆盖在原生组件之上的文本视图,可覆盖的原生组件包括map、video、canvas、camera,只支持嵌套cover-view、cover-image。
注意:只支持基本的定位、布局、文本样式。不支持设置单边的border、background-image、shadow、overflow: visible等。

1、支持background-color,不支持background-image,如果你发现你的素材在真机出不来,而且你又设置了背景图片的话,那你可以把这些元素全部替换成cover-image。

2、不支持overflow: visible也是有点坑,这样的话,你想超出依然显示,就需要设置一个同级元素并提升层级才能达到效果了。

3、如果里面有cover-image超出\溢出的话不显示会剪切掉,具体放大外部cover-view,里面做外边距(margin)调整

cover-image
覆盖在原生组件之上的图片视图,可覆盖的原生组件同cover-view,支持嵌套在cover-view里。
cover-image发现了两个问题:
1、虽说和image组件基本一样,但是设置mode属性也就是图片裁剪、缩放的模式无效
2、宽度固定,高度auto,时,按照正常效果应该是图片按比例伸缩展示,但是发现该组件高度一直为0,只能根据应用场景寻找其他替代方案了。


闲聊:一般自定义底部导航基本都是中间有个另类的需求,如:拍照,扫码,发布之类的直接入口

          这里解释下官方提供的自定义custom-tab-bar 只需要自定义重新写样式就可以了,本文提供的是非官方自己写的


开发小程序中有时候会遇到比较“奇葩”的需求,tabBar突出(一般是拍照或者扫码类的)这时候原生的tabBar就无法使用了,需要自定义Component (tabBar)


正文

如果需要使用自定义tabbar的话,app.json需要设置tabBar值

app.json 代码供参考

  1. "tabBar": {
  2. "custom":true,
  3. "color": "#999999",
  4. "selectedColor":"#333333",
  5. "borderStyle":"black",
  6. "backgroundColor":"",
  7. "list": [
  8. {
  9. "pagePath": "pages/shopList/shopList",
  10. "iconPath": "/img/img/na04.png",
  11. "selectedIconPath": "/img/img/na04s.png",
  12. "color": "#999999",
  13. "selectColor": "#333333",
  14. "text": ""
  15. },
  16. {
  17. "pagePath": "pages/index/index",
  18. "iconPath": "/img/img/na02.png",
  19. "selectedIconPath": "/img/img/na02s.png",
  20. "color": "#999999",
  21. "selectColor": "#333333",
  22. "text": ""
  23. },
  24. {
  25. "pagePath": "pages/helpCenter/helpCenter",
  26. "iconPath": "/img/img/icon_saomia.png",
  27. "selectedIconPath": "/img/img/icon_saomia.png",
  28. "color": "#999999",
  29. "selectColor": "#333333",
  30. "text": ""
  31. },
  32. {
  33. "pagePath": "pages/helpCenter/helpCenter",
  34. "iconPath": "/img/img/na01.png",
  35. "selectedIconPath": "/img/img/na01s.png",
  36. "color": "#999999",
  37. "selectColor": "#333333",
  38. "text": ""
  39. },
  40. {
  41. "pagePath": "pages/user/user",
  42. "iconPath": "/img/img/na03.png",
  43. "selectedIconPath": "/img/img/na03s.png",
  44. "color": "#999999",
  45. "selectColor": "#333333",
  46. "text": ""
  47. }
  48. ]
  49. },

注:"custom":true  使用自定义tabBar 的话 "custom" 值必须为true


先贴wxml代码部分,在来讲讲为啥要使用cover-view来做tabBar而不是使用view

  1. <cover-view class="tab-bar" id='tabBars' ref='tabBars' style="height:{{isIphomex?'240rpx':'172rpx'}}">
  2. <cover-image src="/img/img/nav_bg.png" class="tab-bar-back"></cover-image>
  3. <cover-view class="fixeds" style="height:{{isIphomex?'240rpx':'172rpx'}}">
  4. <cover-view wx:for="{{list}}" wx:key="index" class="tab-bar-item {{index==2?'tab-bar-yixing':'tab-bar-yixingNo'}}" data-paths="{{item.pagePath}}" data-indexsels="{{index}}" bindtap="switchTab" style="padding-bottom:{{isIphomex?'68rpx':'0'}}">
  5. <cover-view class="viewImg">
  6. <cover-image src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></cover-image>
  7. </cover-view>
  8. <cover-view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</cover-view>
  9. </cover-view>
  10. <cover-view class="absout" wx:if='{{isIphomex}}'></cover-view>
  11. </cover-view>
  12. </cover-view>
  13. <!-- <view class="tab-bar" style="height:{{isIphomex?'240rpx':'172rpx'}}" wx:else>
  14. <image src="/img/img/nav_bg.png" class="tab-bar-back"></image>
  15. <view class="fixeds" style="height:{{isIphomex?'240rpx':'172rpx'}}">
  16. <view wx:for="{{list}}" wx:key="index" class="tab-bar-item {{index==2?'tab-bar-yixing':'tab-bar-yixingNo'}}" data-paths="{{item.pagePath}}" data-indexsels="{{index}}" bindtap="switchTab" style="padding-bottom:{{isIphomex?'68rpx':'0'}}">
  17. <image src="{{selected === index ? item.selectedIconPath : item.iconPath}}"></image>
  18. <view style="color: {{selected === index ? selectedColor : color}}">{{item.text}}</view>
  19. <view class="absout" wx:if='{{selected==1&&isIphomex}}'></view>
  20. </view>
  21. </view>
  22. </view> -->

因为在底部的4个tab页面 有一个是地图MAP原生组件,而在微信版本7.0.5以下版本是无法使用view的,7.0.5以上包括7.0.5不受限制,亲测7.0.5版本以上包括7.0.5版本在map原生组件情况下是可以使用view的。具体详见小程序原生组件,在当前没有地图模块时建议使用view 去做,因为view去写界面的话会对iPhoneX及以上的非常规屏很好的兼容性,而cover-view由于不支持border单边、fixed的左右对齐之类的等等,详见 cover-view的 BUG&TIP第11条


wxss部分

  1. .tab-bar {
  2. position: fixed;
  3. bottom: 0;
  4. left: 0;
  5. right: 0;
  6. height: 172rpx;
  7. display: flex;
  8. /* padding-bottom: constant(safe-area-inset-bottom);
  9. padding-bottom: env(safe-area-inset-bottom); */
  10. z-index: 0;
  11. }
  12. .tab-bar-back {
  13. position: absolute;
  14. top: 0;
  15. left: 0;
  16. width: 100vw;
  17. height: 172rpx;
  18. z-index: 1;
  19. }
  20. .fixeds {
  21. display: flex;
  22. /* padding-bottom: constant(safe-area-inset-bottom);
  23. padding-bottom: env(safe-area-inset-bottom); */
  24. width: 100vw;
  25. justify-content: space-between;
  26. align-items: flex-end;
  27. height: 172rpx;
  28. position: relative;
  29. z-index: 2;
  30. }
  31. .tab-bar-item {
  32. flex: 1;
  33. text-align: center;
  34. display: flex;
  35. justify-content: center;
  36. align-items: center;
  37. flex-direction: column;
  38. height: 98rpx;
  39. color: #999;
  40. background-color: #fff;
  41. }
  42. .tab-bar-item cover-image {
  43. width: 46rpx;
  44. height: 46rpx;
  45. }
  46. .tab-bar-item image {
  47. width: 46rpx;
  48. height: 46rpx;
  49. }
  50. .tab-bar-yixing {
  51. height: 172rpx;
  52. position: relative;
  53. z-index: 0;
  54. border-radius: 144rpx
  55. }
  56. .tab-bar-yixing cover-image {
  57. width: 144rpx;
  58. height: 144rpx;
  59. position: relative;
  60. z-index: 6;
  61. border-radius: 144rpx;
  62. }
  63. .viewImg{
  64. margin-bottom: 6rpx;
  65. }
  66. .tab-bar-yixing .viewImg{
  67. width: 144rpx;
  68. height: 144rpx;
  69. margin-bottom:18rpx;
  70. position: relative;
  71. z-index: 6;
  72. border-radius: 144rpx;
  73. overflow: hidden;
  74. }
  75. .tab-bar-yixing image {
  76. width: 144rpx;
  77. height: 144rpx;
  78. margin-bottom:24rpx;
  79. position: relative;
  80. z-index: 6;
  81. }
  82. .absout{
  83. position: fixed;
  84. z-index: 3;
  85. width: 100%;
  86. height: 80rpx;
  87. bottom: 0;
  88. background-color: #ffffff;
  89. }
  90. .tab-bar-item cover-view {
  91. font-size: 10px;
  92. }
  93. .tab-bar-item view {
  94. font-size: 10px;
  95. }

注:padding-bottom: constant(safe-area-inset-bottom);在使用cover-view模式下IphoneX及以上机型底部会留空白,所以我注释掉了,采用了一个底部80的高度白底的cover-view遮盖


js的部分代码

  1. Component({
  2. data: {
  3. isIphomex: app.upVersions(),
  4. selected: 0,
  5. color: "#999999",
  6. selectedColor: "#333333",
  7. list:[],
  8. },
  9. attached() {
  10. this.setData({
  11. list: [{
  12. pagePath: "/pages/shopList/shopList",
  13. iconPath: "/img/img/na04.png",
  14. selectedIconPath: "/img/img/na04s.png",
  15. color: '#999999',
  16. selectedColor: '#333333',
  17. text: 首页
  18. }, {
  19. pagePath: "/pages/index/index",
  20. iconPath: "/img/img/na02.png",
  21. selectedIconPath: "/img/img/na02s.png",
  22. color: '#999999',
  23. selectedColor: '#333333',
  24. text: 地图
  25. }, {
  26. pagePath: "/pages/helpCenter/helpCenter",
  27. iconPath: "/img/img/icon_saomia.png",
  28. selectedIconPath: "/img/img/icon_saomia.png",
  29. color: '#999999',
  30. selectedColor: '#333333',
  31. text: "" // 扫码非人类设计突出的部分
  32. }, {
  33. pagePath: "/pages/shopCat/index",
  34. iconPath: "/img/img/na01.png",
  35. selectedIconPath: "/img/img/na01s.png",
  36. color: '#999999',
  37. selectedColor: '#333333',
  38. text: 购物车
  39. }, {
  40. pagePath: "/pages/user/user",
  41. iconPath: "/img/img/na03.png",
  42. selectedIconPath: "/img/img/na03s.png",
  43. color: '#999999',
  44. selectedColor: '#333333',
  45. text: 个人中心
  46. }]
  47. })
  48. },
  49. methods: {
  50. switchTab(e) {
  51. const data = e.currentTarget.dataset
  52. const url = data.paths
  53. if (data.indexsels != 2) {
  54. wx.switchTab({ url });
  55. this.setData({ selected: data.indexsels })
  56. } else {
  57. wx.scanCode({
  58. success: (res) => {
  59. if (res.errMsg == "scanCode:ok") {
  60. // 扫码成功
  61. } else {}
  62. },
  63. fail: err => {
  64. console.log("扫描err:" + JSON.stringify(err));
  65. }
  66. })
  67. }
  68. }
  69. }
  70. })

JSON文件里面  设置

{
"component": true
}

app.upVersions() 为当前封装的公共部分的判断当前用户手持终端设备是否是iPhoneX及以上机型,具体详见下方upVersions函数

注:官方提供的 只需要使用这圈住的if这段,放在四个页面的onShow 函数生命周期里,selected为当前选中的,底部的页面都需要写,哪个点击带入的就是哪个0-4,扫码或拍照的不设置


判断机型upVersions函数

  1. /**
  2. * 判断获取当前机型是否是iPhoneX及以上机型
  3. */
  4. upVersions()=> {
  5. let tmps = ['iPhone X', 'iPhone 11'], flag= false;
  6. for (let i in tmps) {
  7. // 微信版本
  8. if (wx.getSystemInfoSync().model.search(tmps[i]) > -1) {
  9. flag = true
  10. break;
  11. }
  12. // uniapp版本
  13. if (uni.getSystemInfoSync().model.search(tmps[i]) > -1) {
  14. flag = true
  15. break;
  16. }
  17. }
  18. return flag
  19. },

参考官方 tabBar 自定义 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/103270
推荐阅读