绿满眶商城微信小程序-uniapp
zxl
2025-08-08 bfdadd3f45f4ee3a2779e61fc08df453dd28f6a9
pages/tabbar/index/home.vue
@@ -34,14 +34,18 @@
            :ref="'video'+index"
            :src="item.videoUrl"
            :autoplay="index === currentIndex"
            :controls="false"
            :controls="isControls"
            :loop="true"
            :object-fit="item.videoFit"
            :enable-progress-gesture="false"
            :show-center-play-btn="false"
            :show-progress="true"
            :show-fullscreen-btn="true"
            :show-progress="false"
            :show-fullscreen-btn="isControls"
            :show-play-btn="isControls"
            :show-mute-btn="false"
            class="video-item"
            @fullscreenchange="onFullscreenChange"
            @play="onPlay(item.id, index)"
            @pause="onPause(index)"
            @ended="onEnded(index)"
@@ -50,6 +54,14 @@
            @loadedmetadata="onLoadedMetadata($event)"
            @waiting="videoWaiting(index)"
           ></video>
            <view class="fullscreen-btn">
                 <image
                   class="fullscreen-icon"
                   :src="isFullScreen ? off_screen : on_screen"
                   mode="aspectFit"
                 @click="requestFullScreen('video'+index,item)"
                 ></image>
             </view>
           <!-- 自定义控制条 -->
           <view
            @touchstart.stop="handleTouchStart"
@@ -73,6 +85,7 @@
            </view>
           </view>
      </view>
      <view style="width: 100%; height: 100%;" v-else-if="item.videoContentType === 'img'">
        <uni-swiper-dot
         :info="item.imgs"
@@ -125,7 +138,7 @@
        <view class="video-info" :style="{bottom: marginBottom + 20 + 'px'}">
        <view style="width: 100%; position: relative;">
           <text class="video-author">@{{item.authorName}}</text>
           <text class="iconfont" @click="jumpToSearch" style="position: absolute;right: 45px;">&#xe64e;</text>
           <text class="iconfont" @click="jumpToSearch" style="position: absolute;right: 42px;bottom: 50rpx;">&#xe64e;</text>
        </view>
          <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
           <text class="video-title">{{item.title}}</text>
@@ -269,6 +282,7 @@
import { getUserInfo } from "@/api/members";
import storage from "@/utils/storage.js";
import TopBar from "@/components/TopBar.vue";
import { nextTick } from "vue";
export default {
  components: {TopBar},
@@ -279,6 +293,10 @@
  },
  data() {
    return {
      isControls:false,
      on_screen: require('@/pages/tabbar/index/static/on_screen.png'),
      off_screen: require('@/pages/tabbar/index/static/off_screen.png'),
      isFullScreen:false,
      isTouch:false,
      userId :'',
      currentImgIndex: 0, // 播放到第几张图--索引
@@ -450,7 +468,40 @@
        path: `/pages/tabbar/index/home?videoId=${videoInfo.id}&userId=${userInfo.id}`,
     }
  },
  methods: {
  methods: {
     requestFullScreen(id,item){
        console.log(item)
        const videoContext = uni.createVideoContext(id, this)
        // 根据视频方向决定全屏方向
          const direction = this.shouldUseLandscape(item) ? 90 : 0;
          // 先暂停视频(避免切换时的声音问题)
          // videoContext.pause();
        // 请求全屏
         videoContext.requestFullScreen({
           direction: direction,
         });
     },
     shouldUseLandscape(item) {
      if(item.videoFit === 'cover'){
         return false
      }
       // 默认横屏(根据业务需求调整)
       return true;
     },
     // 全屏状态变化事件
         onFullscreenChange(e) {
           console.log('全屏状态变化:', e.detail.fullScreen)
         if(e.detail.fullScreen){
             this.isControls = true;
         }else{
            this.isControls = false;
         }
         },
     getUserId(){
        const {id} = uni.getStorageSync('user_info_obj_dev')
        this.userId = id;
@@ -1178,6 +1229,28 @@
</script>
<style scoped>
   .fullscreen-btn {
      position: absolute;
      right: 45rpx;
      bottom: 70rpx;
     width: 60rpx;
     height: 60rpx;
     border-radius: 50%;
     background-color: rgba(0, 0, 0, 0.4);
     display: flex;
     justify-content: center;
     align-items: center;
     z-index: 999;
     backdrop-filter: blur(10rpx);
     border: 1rpx solid rgba(255, 255, 255, 0.2);
   }
   /* 图标样式 */
   .fullscreen-icon {
     width: 36rpx;
     height: 36rpx;
     opacity: 0.9;
   }
   ::v-deep .custom-tabbar {
      border-top: none !important;
   }