uniapp video全屏如何二次封装自定义控制按钮
在uniapp中,如何对video组件进行二次封装以实现自定义控制按钮?目前官方提供的控制条样式无法满足需求,想实现以下功能:1)替换默认的全屏/退出按钮图标;2)添加额外的功能按钮(比如倍速切换);3) 在全屏模式下依然能显示自定义按钮。尝试过cover-view覆盖但存在层级问题,请问有没有完整的实现方案或组件封装思路?
        
          2 回复
        
      
      
        在uniapp中,二次封装video组件时,可通过controls属性设为false隐藏原生控件,然后自定义按钮布局。使用@fullscreenchange监听全屏状态,通过createVideoContext控制播放/暂停等操作。
在UniApp中,可以通过二次封装<video>组件实现自定义控制按钮。以下是实现步骤和示例代码:
实现思路
- 隐藏原生控件:设置controls="false"隐藏原生控制条。
- 自定义UI:使用绝对定位在视频上方覆盖自定义按钮。
- 控制视频:通过ref调用视频实例的播放/暂停/全屏等方法。
- 全屏处理:监听全屏状态变化,动态调整按钮布局。
示例代码
<template>
  <view class="video-container">
    <!-- 视频组件 -->
    <video 
      ref="videoRef"
      :src="src"
      :controls="false"
      @fullscreenchange="onFullscreenChange"
      class="video"
    ></video>
    
    <!-- 自定义控制栏 -->
    <view class="controls" :class="{ fullscreen: isFullscreen }">
      <button @click="togglePlay">{{ isPlaying ? '暂停' : '播放' }}</button>
      <button @click="toggleFullscreen">全屏</button>
      <button @click="showVolume = !showVolume">音量</button>
    </view>
  </view>
</template>
<script>
export default {
  data() {
    return {
      isPlaying: false,
      isFullscreen: false,
      showVolume: false
    }
  },
  props: ['src'],
  methods: {
    // 播放/暂停
    togglePlay() {
      const video = this.$refs.videoRef
      this.isPlaying ? video.pause() : video.play()
      this.isPlaying = !this.isPlaying
    },
    
    // 切换全屏
    toggleFullscreen() {
      const video = this.$refs.videoRef
      video.requestFullScreen() // 进入全屏
    },
    
    // 全屏状态变化
    onFullscreenChange(e) {
      this.isFullscreen = e.detail.fullScreen
    }
  }
}
</script>
<style scoped>
.video-container {
  position: relative;
  width: 100%;
}
.video {
  width: 100%;
  height: 400rpx;
}
.controls {
  position: absolute;
  bottom: 0;
  left: 0;
  right: 0;
  background: rgba(0,0,0,0.5);
  padding: 20rpx;
  display: flex;
  justify-content: space-around;
}
.controls.fullscreen {
  bottom: 80rpx; /* 全屏时避免被系统手势区域遮挡 */
}
</style>
关键点说明
- 使用ref获取视频组件实例
- 通过requestFullScreen()方法触发全屏
- 监听fullscreenchange事件处理全屏状态
- 使用CSS绝对定位覆盖控制按钮
- 全屏时调整控制栏位置避免被系统UI遮挡
扩展建议
- 可添加进度条控制(通过timeupdate事件)
- 实现手势控制(双击暂停、滑动调节音量/亮度)
- 添加加载状态和错误处理
这样封装后即可通过<custom-video src="..."></custom-video>调用自定义视频组件。
 
        
       
                     
                   
                    

