源码论坛,商业源码下载,尽在锦尚中国商业源码论坛
标题:
微信小程序自定义凸起tabBar组件源码的详细说明
[打印本页]
作者:
洪七公
时间:
2023-3-23 13:53
标题:
微信小程序自定义凸起tabBar组件源码的详细说明
大家可能见过不少的微信小程序的tabBar是不规则的,而是某个button杀死凸起的圆球状态的,比如天下网吧微信小程序的tabBar就是这样的:
这个tabBar中间的就是一个圆形「凸起」的button。当然还有更多的小程序他们的tabBar更酷炫,有很多不错的动画效果。
那么如何实现这样的不规则tabBar呢?答案是得用自定义tabBar
咱们今天以天下网吧的自定义tabBar组件源码(源码在文章最底部有下载链接)为例,希望能抛砖引玉让大家分享自己的不错的自定义tabbar组件:
wxml:
<view class="txwb_tabBar" wx:if="{{true}}">
<view class="cu-bar tabbar bg-white ">
<block wx:for="{{tabBar}}" wx:for-item="item" wx:key="tabBar">
<view class="action {{item.iconTopClass}} {{item.current==1?'text-green':''}}" catchtap='goToTab' data-url="{{item.pagePath}}" data-index="{{index}}" style="{{item.current==1?item.activeStyle:item.style}}">
<view class="reddot" wx:if="{{item.reddot>0}}"></view>
<image wx:if="{{item.iconImage}}" src="{{item.current==1?item.iconImageActive:item.iconImage}}" style="{{item.iconImagStyle}}" />
<botton wx:else class='iconfont iconf {{item.current==1?item.iconClassSelected:item.iconClass}}' />
{{item.text}}
</view>
</block>
<view class="tui-hump-box-bk"></view>
<view class="tui-hump-box "></view>
</view>
</view>
复制代码
js:
/*
* @info: 文件说明:主要功能介绍等
* @Description: 全局功能介绍和注意事项
* @Author: tt
* @Date: 2020-05-27 11:07:52
* @LastEditTime: 2021-03-15 15:43:31
* @LastEditors: tt
*/
/*jshint esversion: 6 */
Component({
properties: {
idx: {
type: Number,
value: 0
},
reddot: {
type: Number,
value: 0
},
//当前索引
current: {
type: Number,
value: 0
},
//字体颜色
color: {
type: String,
value: "#666"
},
//字体选中颜色
selectedColor: {
type: String,
value: "#5677FC"
},
//背景颜色
backgroundColor: {
type: String,
value: "#FFFFFF"
},
//是否需要中间凸起按钮
hump: {
type: Boolean,
value: false
},
//固定在底部
isFixed: {
type: Boolean,
value: true
},
//角标字体颜色
badgeColor: {
type: String,
value: "#fff"
},
//角标背景颜色
badgeBgColor: {
type: String,
value: "#F74D54"
},
unlined: {
type: Boolean,
value: false
}
},
data: {
tabBar: [{
"current": 0,
"pagePath": "/pages/index/index",
"text": "首页",
"iconClass": "icon-shouye1",
"iconClassSelected": "icon-shouyexuanzhongx",
"iconTopClass": "",
"style": "",
"activeStyle": "",
},
{
"current": 0,
"pagePath": "/pages/forum/forum",
"text": "版块",
"iconClass": "icon-bankuaifl",
"iconClassSelected": "icon-wodebankuai",
"iconTopClass": "",
"style": "",
"activeStyle": "",
},
{
"current": 0,
"pagePath": "/pages/add_forum_article/add_forum_article",
"text": "发布",
"iconClass": "cu-btn icon-add bg-green shadow icon-xinzeng",
"iconClassSelected": "cu-btn icon-add bg-green shadow icon-xinzeng",
"iconTopClass": "add-action",
"style": "",
"activeStyle": "",
},
{
"current": 0,
"pagePath": "/pages/map/map",
"text": "天下码农",
"iconClass": "icon-fujin",
"iconClassSelected": "icon-fujindianji",
"iconTopClass": "",
"style": "",
"activeStyle": "",
},
{
"current": 0,
"pagePath": "/pages/user/user",
"text": "我的",
"iconClass": "icon-wode2",
"iconClassSelected": "icon-wode1",
"iconTopClass": "",
"reddot": 0,
"style": "",
"activeStyle": "",
},
]
},
observers: {
"idx": function (id) {
var otabbar = this.data.tabBar;
otabbar[id]['iconPath'] = otabbar[id]['selectedIconPath'] //换当前的icon
otabbar[id]['current'] = 1;
this.setData({
tabBar: otabbar
});
},
"idx,reddot": function (id, reddot) {
var otabbar = this.data.tabBar;
otabbar[id]['iconPath'] = otabbar[id]['selectedIconPath'] //换当前的icon
otabbar[id]['current'] = 1;
otabbar[4]['reddot'] = reddot;
this.setData({
tabBar: otabbar
});
}
},
methods: {
goToTab: function (e) {
var url = e.currentTarget.dataset.url;
wx.switchTab({
url: url,
fail: res => {
console.log("switchTab faild:", res);
wx.navigateTo({
url
});
}
});
},
async getTabBarMenu() {
}
},
lifetimes: {
// 生命周期函数,可以为函数,或一个在methods段中定义的方法名
attached: function () {
},
ready(){
this.getTabBarMenu();
},
moved: function () {},
detached: function () {},
},
});
复制代码
wxss:
[url=home.php?mod=space&uid=554307]@import[/url] '/iconfont.wxss';
.txwb_tabBar {
width: 100%;
position: fixed;
bottom: 0;
font-size: 20rpx;
color: #8A8A8A;
z-index: 100000;
}
.iconf {
font-family: "iconfont" !important;
font-size: inherit;
font-style: normal;
width: 100rpx;
position: relative;
display: block;
height: auto;
margin: 0 auto 10rpx;
text-align: center;
font-size: 40rpx;
}
.text-green {
color: #4cb4e7;
}
.shadow {
box-shadow: 0 1rpx 6rpx rgba(0, 0, 0, 0.1);
}
.bg-red {
background-color: #e54d42;
color: #fff;
}
.bg-orange {
background-color: #f37b1d;
color: #fff;
}
.bg-yellow {
background-color: #fbbd08;
color: #333;
}
.bg-olive {
background-color: #8dc63f;
color: #fff;
}
.bg-green {
background-color: #4cb4e7;
color: #fff;
}
.bg-cyan {
background-color: #1cbbb4;
color: #fff;
}
.bg-blue {
background-color: #0081ff;
color: #fff;
}
.bg-purple {
background-color: #6739b6;
color: #fff;
}
.bg-mauve {
background-color: #9c26b0;
color: #fff;
}
.bg-pink {
background-color: #e03997;
color: #fff;
}
.bg-brown {
background-color: #a5673f;
color: #fff;
}
.bg-grey {
background-color: #8799a3;
color: #fff;
}
.bg-gray {
background-color: #f0f0f0;
color: #666;
}
.bg-black {
background-color: #333;
color: #fff;
}
.bg-white {
background-color: #fff;
color: #666;
}
.shadow .bg-green {
box-shadow: 6rpx 6rpx 8rpx rgba(48, 156, 63, 0.2);
}
.cu-bar.tabbar .action.add-action .icon-add {
position: absolute;
width: 70rpx;
z-index: 2;
height: 70rpx;
border-radius: 50%;/* +号 */
line-height: 70rpx;
font-size: 50rpx;
top: -35rpx;
left: 0;
right: 0;
margin: auto;
padding: 0;
}
.cu-bar.tabbar .action.add-action::after {
content: "";
position: absolute;
width: 40rpx;
height: 40rpx;
top: calc(-38rpx + env(safe-area-inset-bottom) / 4.5);
left: 0;
right: 0;
margin: auto;
box-shadow: 0 -3rpx 8rpx rgba(0, 0, 0, 0.08);
border-radius: 50%;/* 突出 */
background-color: inherit;
z-index: 0;
}
.cu-bar.tabbar .action.add-action::before {
content: "";
position: absolute;
width: 100rpx;
height: 30rpx;
bottom: 30rpx;
left: 0;
right: 0;
margin: auto;
background-color: inherit;
z-index: 1;
}
.cu-btn {
position: relative;
display: inline-flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
padding: 0 30rpx;
font-size: 28rpx;
height: 64rpx;
line-height: 1;
text-align: center;
text-decoration: none;
overflow: visible;
margin-left: initial;
transform: translate(0rpx, 0rpx);
margin-right: initial;
}
.cu-btn::after {
display: none;
}
.cu-bar {
display: flex;
position: relative;
align-items: center;
min-height: 100rpx;
justify-content: space-between;
}
.cu-bar .action {
display: flex;
align-items: center;
height: 100%;
justify-content: center;
max-width: 100%;
z-index: 3 !important;
}
.cu-bar.tabbar .action .icon-add {
width: 100rpx;
position: relative;
display: block;
height: auto;
margin: 0 auto 10rpx;
text-align: center;
font-size: 40rpx;
}
.cu-bar.tabbar {
padding: 0;
z-index: 0;
height: calc(100rpx + env(safe-area-inset-bottom) / 2);
padding-bottom: calc(env(safe-area-inset-bottom) / 2);
}
.cu-bar {
margin-top: 20rpx;
}
.cu-bar .action:first-child {
margin-left: 30rpx;
font-size: 30rpx;
}
.cu-bar.tabbar .action {
font-size: 22rpx;
position: relative;
flex: 1;
text-align: center;
padding: 0;
display: block;
height: auto;
line-height: 1;
margin: 0;
background-color: inherit;
overflow: initial;
}
.cu-bar.tabbar .action.add-action {
position: relative;
z-index: 2;
padding-top: 50rpx;
}
.icon-fabu {
color: #4cb4e7;
}
.reddot {
background-color: #ff693d;
height: 16rpx;
width: 16rpx;
border-radius: 16rpx;
right: 22px;
position: absolute;
top: -5rpx;
}
.txwb-tabbar {
width: 100%;
height: 100rpx;
display: flex;
align-items: center;
justify-content: space-between;
position: relative;
background-color: #FFFFFF;
}
.txwb-tabbar-fixed {
position: fixed;
z-index: 99999;
left: 0;
bottom: 0;
padding-bottom: env(safe-area-inset-bottom);
}
.tabbar::before,
.txwb-tabbar::before {
content: '';
width: 100%;
border-top: 1rpx solid #B2B2B2;
position: absolute;
top: -1rpx;
left: 0;
transform: scaleY(0.5);
transform-origin: 0 100%;
}
.txwb-tabbar-item {
height: 100%;
flex: 1;
display: flex;
text-align: center;
align-items: center;
flex-direction: column;
justify-content: space-between;
position: relative;
padding: 10rpx 0 20rpx 0;
box-sizing: border-box;
z-index: -1;
}
.tui-icon-box {
position: relative;
}
.tui-item-hump {
height: 98rpx;
z-index: 2;
}
.txwb-tabbar-icon {
width: 52rpx;
height: 52rpx;
display: block;
}
.tui-hump-box-bk {
width: 140rpx;
height: 80rpx;
background: #FFFFFF;
position: absolute;
left: 50%;
transform: translateX(-50%);
top: 1rpx;
z-index: 2;
}
.tui-hump-box {
width: 100rpx;
height: 100rpx;
background: #FFFFFF;
position: absolute;
left: 50%;
transform: translateX(-50%);
top: calc(-38rpx + env(safe-area-inset-bottom) / 4.5);
border-radius: 50%;
z-index: 1;
}
/* .cu-bar.tabbar .action.add-action::before , */
.tui-hump-box::before {
content: '';
height: 200%;
width: 200%;
border: 1rpx solid #B2B2B2;
position: absolute;
top: 0;
left: 0;
transform: scale(0.5) translateZ(0);
transform-origin: 0 0;
border-radius: 100%;
}
[url=home.php?mod=space&uid=164055]@media[/url] (prefers-color-scheme: dark) {
.bg-white {
background-color: #2e2f31;
color: white;
}
.cu-bar.tabbar .action.add-action::after {
box-shadow: none;
}
.hump-add {
background: #2e2f31 !important;
}
.bg-green {
background-color: #2e2f31;
}
.shadow .bg-green {
box-shadow: -1rpx -1rpx 20rpx rgba(255, 255, 255, 0.2);
}
.shadow {
box-shadow: -1rpx -1rpx 20rpx rgba(255, 255, 255, 0.2);
}
.tui-hump-box-bk,
.tui-item-hump,
.txwb-tabbar,
.tui-hump-box {
background-color: #2e2f31 !important;
}
.tui-hump-box::before,
.tabbar::before,
.txwb-tabbar::before {
border-top: 1rpx solid rgb(255, 255, 255, 0.5);
}
}
复制代码
好了,今天小程序自定义凸起tabBar组件源码的详细说明就到这了,希望能帮助到大家,喜欢和支持锦尚中国的朋友们,如果需要更多的素材、资源、源码请搜索锦尚中国获取!
欢迎光临 源码论坛,商业源码下载,尽在锦尚中国商业源码论坛 (https://bbs.52jscn.com/)
Powered by Discuz! X3.3