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>调用自定义视频组件。

