- 这两天开发一个微信小程序,需要让底部导航栏中间图标往上突出一点来。之前都是用组件或者直接原生没有太多定制样式,所以记录一下完成步骤。
1. 自定义tabbar栏配置
- 在 app.json 文件中的 tabBar 中指定 custom 字段为 true(意思是允许使用自定义 tabBar);
- 在 app.json 中全局开启使用组件,或者在所有涉及的 tab 页 json 中申明usingComponents 项;
- 在 app.json 中添加作为 tabBar 栏的页面;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| "tabBar": { "custom": true, "color": "#cccccc", "selectedColor": "#eb585b", "borderStyle": "black", "backgroundColor": "#ffffff", "list": [ { "pagePath": "pages/index/index", "iconPath": "images/home.png", "selectedIconPath": "images/home-active.png", "text": "首页" }, { "pagePath": "pages/follow/index", "iconPath": "images/zhizhen.png", "selectedIconPath": "images/zhizhen-active.png", "text": "关注" }, { "pagePath": "pages/add-house/index", "iconPath": "images/plus.png", "selectedIconPath": "images/plus.png", "bulge": true, "text": "" }, { "pagePath": "pages/message/index", "iconPath": "images/xiaoxi.png", "selectedIconPath": "images/xiaoxi-active.png", "text": "消息" }, { "pagePath": "pages/home/index", "iconPath": "images/my.png", "selectedIconPath": "images/my-active.png", "text": "我的" } ] }
|
pagePath
是自己添加的页面,text
是tabBar上展示的文字。
2. 添加自定义tabbar组件栏
在根目录下创建 custom-tab-bar
文件夹,并在该文件夹下新建 Component
,或者新建 Page
,但是这种创建方式需要自己改动一些代码,在这里我们选用新建 Component
的方式。
2.1 添加组件代码
2.1.1 完善 wxml
文件代码,tabBar
栏需要展示的页面是一个固定的数组,可以使用 wx:for
循环展示,在这里用到 selected
这个字段,这个字段的作用是帮助展示 tabBar
选中和未选中的样式。
1 2 3 4 5 6 7 8 9 10
| <view class="tab-bar"> <view wx:for="{{list}}" wx:key="index" class="tab-bar-item {{item.bulge?'bulge':''}}" data-path="{{item.pagePath}}" data-index="{{index}}" bindtap="switchTab"> <view wx:if="{{item.bulge}}" class="tab-bar-bulge"></view> <image class="image" src="{{selected == index ? item.selectedIconPath : item.iconPath}}"></image> <view class="tab-bar-view" style="color: {{selected === index ? selectedColor : color}}"> {{item.text}} </view> </view> </view>
|
2.1.2 完善 js
文件代码,list
数组就是在 tabBar
栏展示的页面信息,switchTab
方法作用可以出看来是负责跳转页面。其它的字段相信各位都知道,这里就不再描述。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| Component({ data: { selected: 0, color: "#ccc", selectedColor: "#eb585b", list: [{ pagePath: "/pages/index/index", iconPath: "/images/home.png", selectedIconPath: "/images/home-active.png", text: "首页" }, { pagePath: "/pages/follow/index", iconPath: "/images/zhizhen.png", selectedIconPath: "/images/zhizhen-active.png", text: "关注" }, { pagePath: "pages/add-house/index", iconPath: "/images/plus.png", selectedIconPath: "/images/plus.png", bulge: true, }, { pagePath: "/pages/message/index", iconPath: "/images/xiaoxi.png", selectedIconPath: "/images/xiaoxi-active.png", text: "消息" }, { pagePath: "/pages/home/index", iconPath: "/images/my.png", selectedIconPath: "/images/my-active.png", text: "我的" }] }, attached() { }, methods: { switchTab(e) { const data = e.currentTarget.dataset const url = data.path wx.switchTab({ url }) } } })
|
2.1.3 完善wxss
文件代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| .tab-bar { position: fixed; bottom: 0; left: 0; right: 0; height: 50px; background: #FFF; display: flex; line-height: 1.2; padding-bottom: env(safe-area-inset-bottom); -moz-box-shadow:0px -1px 8px #eee; -webkit-box-shadow:0px -1px 8px #eee; box-shadow:0px -1px 8px #eee; }
.tab-bar-item { flex: 1; text-align: center; display: flex; justify-content: center; align-items: center; flex-direction: column; }
.tab-bar-item .image { width: 26px; height: 26px; } .bulge { background-color: #FFF; } .bulge .tab-bar-bulge{ position: absolute; z-index: -1; width: 64px; height: 64px; top: -20px; border-radius: 50%; background-color: #FFF; -moz-box-shadow:0px -1px 8px #eee; -webkit-box-shadow:0px -1px 8px #eee; box-shadow:0px -1px 8px #eee; } .bulge .image{ width: 50px; height: 50px; transform: translate(1rpx,-25rpx);
} .bulge .tab-bar-view{ position: relative; bottom: -16px; margin-top: 4px; }
.tab-bar-item .tab-bar-view { font-size: 12px; margin-top: 4px; }
|
2.2 修复bug
这样就大致完成了一个自定义tabbar栏,当时它目前还是有点问题的。在每一个tabbar标签的页面的js中添加以下代码,另外还有一个问题就是会出现初次进入小程序点击底部tabbar-item跳转时会闪烁。这是微信那边的问题,网上有方法解决,这个奇怪的问题留给下次在修复吧。
1 2 3 4 5 6 7 8 9
| onShow() { if (typeof this.getTabBar === 'function' && this.getTabBar()) { this.getTabBar().setData({ selected: 1 }) } },
|