|                                                                                                                                                                                                                                         |  | <template>  <view class="custom-tabbar" :class="{ 'tabbar-hidden': !showNavbar }">    <!-- 音频控制栏组件 -->    <AudioControls      :current-page="currentPage"      :course-id="courseId"      :voice-id="voiceId"      :book-pages="bookPages"      :is-text-page="isTextPage"      :should-load-audio="shouldLoadAudio"      :is-member="isMember"      :current-page-requires-member="currentPageRequiresMember"      :page-pay="pagePay"      :is-word-audio-playing="isWordAudioPlaying"      @previous-page="previousPage"      @next-page="nextPage"      @audio-state-change="onAudioStateChange"      @highlight-change="onHighlightChange"      @voice-change-complete="onVoiceChangeComplete"      @voice-change-error="onVoiceChangeError"      @page-data-needed="onPageDataNeeded"      ref="audioControls"    />      <view style="background-color: #fff;position: relative;z-index: 100">      <view class="tabbar-content">        <view class="tabbar-left">          <view class="tab-button" @click="toggleCoursePopup">            <image src="/static/course-icon.png" class="tab-icon" />            <text class="tab-text">课程</text>          </view>          <view class="tab-button" @click="toggleSound">            <image src="/static/voice-switch-icon.png" class="tab-icon" />            <text class="tab-text">音色切换</text>          </view>        </view>                <view class="tabbar-right">          <view class="page-controls">            <view class="page-numbers">              <view                 v-for="(page, index) in bookPages"                 :key="index"                class="page-number"                :class="{ 'active': (index + 1) === currentPage }"                @click="goToPage(index + 1)"              >                {{ index + 1 }}              </view>            </view>          </view>        </view>      </view>      <uv-safe-bottom></uv-safe-bottom>    </view>  </view></template>
<script>import AudioControls from '../AudioControls.vue'
export default {  name: 'CustomTabbar',  components: {    AudioControls  },  props: {    showNavbar: {      type: Boolean,      default: true    },    currentPage: {      type: Number,      default: 1    },    courseId: {      type: String,      default: ''    },    voiceId: {      type: Number,      default: null    },    bookPages: {      type: Array,      default: () => []    },    isTextPage: {      type: Boolean,      default: false    },    shouldLoadAudio: {      type: Boolean,      default: false    },    isMember: {      type: Boolean,      default: false    },    currentPageRequiresMember: {      type: Boolean,      default: false    },    pagePay: {      type: Array,      default: () => []    },    isWordAudioPlaying: {      type: Boolean,      default: false    }  },  methods: {    toggleCoursePopup() {      this.$emit('toggle-course-popup')    },    toggleSound() {      this.$emit('toggle-sound')    },    goToPage(pageNumber) {      this.$emit('go-to-page', pageNumber)    },    previousPage() {      this.$emit('previous-page')    },    nextPage() {      this.$emit('next-page')    },    onAudioStateChange(audioState) {      this.$emit('audio-state-change', audioState)    },    onHighlightChange(highlightData) {      this.$emit('highlight-change', highlightData)    },    onVoiceChangeComplete(data) {      this.$emit('voice-change-complete', data)    },    onVoiceChangeError(error) {      this.$emit('voice-change-error', error)    },    onPageDataNeeded(pageNumber) {      this.$emit('page-data-needed', pageNumber)    },    // onScrollToText(refName) {
    //   this.$emit('scroll-to-text', refName)
    // }
  }}</script>
<style lang="scss" scoped>.custom-tabbar {  position: fixed;  bottom: 0;  left: 0;  right: 0;  border-top: 1rpx solid #EEEEEE;  z-index: 1000;  transition: transform 0.3s ease;    &.tabbar-hidden {    transform: translateY(100%);  }}
.tabbar-content {  display: flex;  align-items: center;  justify-content: space-between;  padding: 24rpx 62rpx;  height: 88rpx;}
.tabbar-left {  display: flex;  align-items: center;  gap: 35rpx;}
.tab-button {  display: flex;  align-items: center;  flex-direction: column;  gap: 8rpx;}
.tab-icon {  width: 52rpx;  height: 52rpx;}
.tab-text {  font-family: PingFang SC;  font-size: 22rpx;  color: #999;  line-height: 24rpx;}
.tabbar-right {  flex: 1;  display: flex;  justify-content: flex-end;}
.page-controls {  display: flex;  align-items: center;}
.page-numbers {  display: flex;  align-items: center;  gap: 8rpx;  overflow-x: auto;  max-width: 400rpx;    &::-webkit-scrollbar {    display: none;  }}
.page-number {  min-width: 84rpx;  height: 58rpx;  display: flex;  align-items: center;  justify-content: center;  border-radius: 100rpx;  font-family: PingFang SC;  font-size: 30rpx;  color: #3B3D3D;  background-color: transparent;  border: 1px solid #3B3D3D;  transition: all 0.3s ease;    &.active {    border: 1px solid #06DADC;    color: #06DADC;  }}</style>
 |