You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							147 lines
						
					
					
						
							3.4 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							147 lines
						
					
					
						
							3.4 KiB
						
					
					
				
								<template>
							 | 
						|
									<view>
							 | 
						|
										<view class="occupy-position"></view>
							 | 
						|
										<view class="content">
							 | 
						|
											<view class="tabbar-box">
							 | 
						|
												<view class="tab-item" 
							 | 
						|
													:class="{'tab-active': currentTabBar == index}"
							 | 
						|
													:style="{'width': 100 / show_count +'%'}" 
							 | 
						|
													@click="clickTab(item, index)"
							 | 
						|
													v-if="item.show"
							 | 
						|
													v-for="(item, index) in tabbars" :key="index">
							 | 
						|
													<view class="tab-icon">
							 | 
						|
														<text class="lf-font-40 lf-iconfont" :class="item.icon"></text>
							 | 
						|
													</view>
							 | 
						|
													<view class="tab-name">{{ item.text }}</view>
							 | 
						|
												</view>
							 | 
						|
											</view>
							 | 
						|
										</view>
							 | 
						|
									</view>
							 | 
						|
								</template>
							 | 
						|
								
							 | 
						|
								<script>
							 | 
						|
									import { mapGetters } from "vuex";
							 | 
						|
									export default {
							 | 
						|
										props: {
							 | 
						|
											type: {
							 | 
						|
												type: String, // 默认跳转方式redirect,可选switch
							 | 
						|
												default: 'redirect'
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										data(){
							 | 
						|
											return {
							 | 
						|
												show_count: 0
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										computed: {
							 | 
						|
											...mapGetters(['currentTabBar', 'tabbars', 'isShowTabBar'])
							 | 
						|
										},
							 | 
						|
										created(){
							 | 
						|
											// 组件被创建时检查当前在哪个页面,然后校验currentTabBar是否与之匹配
							 | 
						|
											let pages = getCurrentPages();
							 | 
						|
											let page = pages[pages.length - 1].route;
							 | 
						|
											let tabbars = this.tabbars;
							 | 
						|
											let tabbar_name = tabbars[this.currentTabBar].path;
							 | 
						|
											let current = 0;
							 | 
						|
											let show_count = 0;
							 | 
						|
											tabbars.map((item, index) => {
							 | 
						|
												if(item.path == '/'+ page){
							 | 
						|
													current = index;
							 | 
						|
												}
							 | 
						|
												if(item.show){
							 | 
						|
													show_count++;
							 | 
						|
												}
							 | 
						|
											})
							 | 
						|
											this.show_count = show_count;
							 | 
						|
											if(tabbar_name != '/'+ page){
							 | 
						|
												this.$store.commit('setCurrentTabBar', current);
							 | 
						|
											}
							 | 
						|
										},
							 | 
						|
										methods: {
							 | 
						|
											clickTab(item, index){
							 | 
						|
												if(this.currentTabBar == index) return;
							 | 
						|
												this.$store.commit('setCurrentTabBar', index);
							 | 
						|
												uni.vibrateShort();
							 | 
						|
												this.$url(item.path, {type: this.type});
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
								</script>
							 | 
						|
								
							 | 
						|
								<style lang="scss" scoped="scoped">
							 | 
						|
									.lf-font-40{
							 | 
						|
										font-size: 40rpx;
							 | 
						|
									}
							 | 
						|
									.occupy-position{
							 | 
						|
										width: 750rpx;
							 | 
						|
										height: 120rpx;
							 | 
						|
										box-sizing: content-box;
							 | 
						|
										padding-bottom: constant(safe-area-inset-bottom);
							 | 
						|
										padding-bottom: env(safe-area-inset-bottom);
							 | 
						|
									}
							 | 
						|
									.content{
							 | 
						|
										width: 750rpx;
							 | 
						|
										height: 120rpx;
							 | 
						|
										background-color: #FFFFFF;
							 | 
						|
										border-radius: 60rpx 60rpx 0 0;
							 | 
						|
										box-shadow: 0rpx -2rpx 8rpx 1rpx rgba(0, 0, 0, 0.1);
							 | 
						|
										position: fixed;
							 | 
						|
										bottom: 0;
							 | 
						|
										left: 0;
							 | 
						|
										z-index: 99999;
							 | 
						|
										padding-bottom: constant(safe-area-inset-bottom);
							 | 
						|
										padding-bottom: env(safe-area-inset-bottom);
							 | 
						|
										display: flex;
							 | 
						|
										align-items: center;
							 | 
						|
										box-sizing: content-box;
							 | 
						|
										.tabbar-box{
							 | 
						|
											width: 100%;
							 | 
						|
											height: 100rpx;
							 | 
						|
											display: flex;
							 | 
						|
											.tab-item{
							 | 
						|
												display: flex;
							 | 
						|
												justify-content: center;
							 | 
						|
												align-items: center;
							 | 
						|
												flex-direction: column;
							 | 
						|
												.tab-name{
							 | 
						|
													font-size: 24rpx;
							 | 
						|
													color: #777777;
							 | 
						|
												}
							 | 
						|
												&.tab-active{
							 | 
						|
													.tab-icon{
							 | 
						|
														background-color: #15716E;
							 | 
						|
														width: 60rpx;
							 | 
						|
														height: 60rpx;
							 | 
						|
														display: flex;
							 | 
						|
														justify-content: center;
							 | 
						|
														align-items: center;
							 | 
						|
														// transform: translateY(-20rpx) scale(1.4);
							 | 
						|
														border-radius: 50%;
							 | 
						|
														color: #FFFFFF;
							 | 
						|
														overflow: hidden;
							 | 
						|
														animation: wobble 1s .2s ease both;
							 | 
						|
														text{
							 | 
						|
															transform: scale(0.8);
							 | 
						|
														}
							 | 
						|
													}
							 | 
						|
													.tab-name{
							 | 
						|
														color: #15716E;
							 | 
						|
														font-weight: bold;
							 | 
						|
													}
							 | 
						|
												}
							 | 
						|
											}
							 | 
						|
										}
							 | 
						|
									}
							 | 
						|
									
							 | 
						|
									@keyframes wobble{
							 | 
						|
										0%{transform:translateX(0%)}
							 | 
						|
										15%{transform:translateX(-25%) rotate(-5deg)}
							 | 
						|
										30%{transform:translateX(20%) rotate(3deg)}
							 | 
						|
										45%{transform:translateX(-15%) rotate(-3deg)}
							 | 
						|
										60%{transform:translateX(10%) rotate(2deg)}
							 | 
						|
										75%{transform:translateX(-5%) rotate(-1deg)}
							 | 
						|
										99%{transform:translateX(0%)}
							 | 
						|
										100%{transform: translateY(-20rpx) scale(1.4);}
							 | 
						|
									}
							 | 
						|
								
							 | 
						|
								</style>
							 |