效果图

代码
<template><div class="video-container" @mouseover="showControls" @mouseleave="hideControlsAfterDelay"><videoref="video"@loadedmetadata="initializePlayer"@timeupdate="updateProgress"@ended="resetPlayer"width="640"height="360"src="./11.mp4"></video><!--video自带的属性设置controls="false" 禁用自带默认控件(直接不写才会展示自定义的控件)--><div v-if="isControlsVisible" class="controls"><button @click="playPause">{{ isPlaying ? 'Pause' : 'Play' }}</button><input type="range" min="0" :max="duration" v-model.number="currentTime" @input="seekTo" /><span>{{ formatTime(currentTime) }} / {{ formatTime(duration) }}</span><button @click="muteUnmute">{{ isMuted ? 'Unmute' : 'Mute' }}</button></div></div>
</template><script>
export default {data() {return {isControlsVisible: false,isPlaying: false,isMuted: false,currentTime: 0,duration: 0,controlsTimeout: null,};},methods: {playPause() {const video = this.$refs.video;if (this.isPlaying) {video.pause();} else {video.play();}this.isPlaying = !this.isPlaying;},seekTo(event) {const video = this.$refs.video;video.currentTime = event.target.value;},updateProgress() {this.currentTime = this.$refs.video.currentTime;},initializePlayer() {this.duration = this.$refs.video.duration;},resetPlayer() {this.currentTime = 0;this.isPlaying = false;},muteUnmute() {const video = this.$refs.video;video.muted = !video.muted;this.isMuted = video.muted; },computed: {isMuted() {return this.$refs.video.muted;},},showControls() {this.isControlsVisible = true;if (this.controlsTimeout) {clearTimeout(this.controlsTimeout);this.controlsTimeout = null;}},hideControlsAfterDelay() {this.controlsTimeout = setTimeout(() => {this.isControlsVisible = false;}, 3000); },formatTime(time) {const minutes = Math.floor(time / 60);const seconds = Math.floor(time % 60).toString().padStart(2, '0');return `${minutes}:${seconds}`;},},
};
</script><style scoped>
.video-container {position: relative;width: 640px;height: 360px;border: 1px solid #ccc;
}.controls {position: absolute;bottom: 10px;left: 10px;right: 10px;display: flex;justify-content: space-between;align-items: center;background: rgba(255, 255, 255, 0.7);padding: 5px;border-radius: 5px;
}.controls button,
.controls input[type="range"] {flex: 1;
}.controls input[type="range"] {margin: 0 10px;
}
</style>