Files

92 lines
2.6 KiB
Vue
Raw Permalink Normal View History

2026-08-19 08:17:18 +08:00
<template>
<!-- 页内只占位;官方栏挂上后不再画可见栏,避免叠两层 -->
<view class="ttb theme-tab-bar">
<!-- 首页走页面 padding 占位,避免 flex order 把这块插到轮播前面 -->
<view v-if="placeholder" class="ttb-ph" />
<view v-if="showVisual" class="ttb-fixed">
<view class="ttb-shell" :class="'ttb-shell--' + mode" :style="shellStyle">
<view
v-if="(mode === 'pill' || mode === 'line') && selected >= 0"
class="ttb-ind"
:class="'ttb-ind--' + mode"
:style="indStyle"
>
<view class="ttb-ind-core" :style="indCoreStyle" />
</view>
<view
v-if="mode === 'dot' && selected >= 0"
class="ttb-dot"
:style="dotStyle"
>
<view class="ttb-dot-core" :style="dotCoreStyle" />
</view>
<view
v-for="(item, index) in tabs"
:key="item.pagePath"
class="ttb-item"
:class="{ 'is-on': itemOn(index), 'is-draw': isDraw(index), 'is-stroke-ok': isDraw(index) && strokeOk }"
@tap="onTap(index)"
>
<view class="ttb-pair">
<view class="ttb-ico-wrap">
<image class="ttb-ico ttb-ico--off" :src="item.icon" mode="aspectFit" />
<image class="ttb-ico ttb-ico--on" :src="item.iconOn" mode="aspectFit" />
<canvas
:canvas-id="canvasId(index)"
:id="canvasId(index)"
class="ttb-cv"
:class="{ 'is-show': isDraw(index) }"
style="width: 28px; height: 28px;"
/>
</view>
<text class="ttb-txt" :style="{ color: textColor(index) }">{{ item.text }}</text>
</view>
</view>
</view>
<view class="ttb-safe" />
</view>
</view>
</template>
<script>
import tabBarLogic from '@/mixins/theme-tab-bar'
/**
* 页内底栏:占位 + 官方栏未挂时的可见兜底
* 有单例时动画打到 custom-tab-bar,这里不再自己滑
*/
export default {
name: 'ThemeTabBar',
mixins: [tabBarLogic],
props: {
/** 首页用页面 padding 占底,关掉这块以免插到图片中间 */
placeholder: { type: Boolean, default: true },
},
data() {
return { isNative: false }
},
}
</script>
<style>
@import '../../styles/theme-tab-bar.css';
.ttb {
order: 999;
width: 100%;
flex-shrink: 0;
}
.ttb-ph {
height: calc(60px + env(safe-area-inset-bottom));
background: transparent;
pointer-events: none;
}
.ttb-fixed {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 980;
background: transparent;
}
</style>