当前位置: 首页 > article >正文

视频video鼠标移入移除展示隐藏(自定义控件)

效果图

在这里插入图片描述

代码

<template>
  <div class="video-container" @mouseover="showControls" @mouseleave="hideControlsAfterDelay">
    <video
      ref="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); // 3秒后隐藏控件,时间可根据需要调整
    },
    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>

http://www.kler.cn/a/420004.html

相关文章:

  • Linux 入门——基本指令2
  • CTF-PWN: WEB_and_PWN [第一届“吾杯”网络安全技能大赛 Calculator] 赛后学习(不会)
  • Unity AssetBundles(AB包)
  • wordpress网站首页底部栏显示网站备案信息
  • android-studio开发第一个项目,并在设备上调试
  • 十、软件设计架构-微服务-服务调用Dubbo
  • 第22周:机器学习
  • 从Apache Solr 看 Velocity 模板注入
  • Android:生成Excel表格并保存到本地
  • 使用epoll监测定时器是否到达指定时间,并执行回调函数
  • 前端番外小知识——为什么需要箭头函数?
  • Pytorch使用手册-What is torch.nn really?(专题九)
  • 【电子通识】USB Type-C线缆为什么有的用到E-Marker芯片
  • 数据结构自测题4
  • 【docker】docker网络六种网络模式
  • 雪花算法生成ID
  • git 常用命令及问题
  • 多级缓存设计实践
  • Cannot resolve symbol ‘ActivityThread‘ | Android 语法
  • 【目标跟踪】AntiUAV600数据集详细介绍
  • avcodec_alloc_context3,avcodec_open2,avcodec_free_context,avcodec_close
  • 多功能察打一体多旋翼无人机技术详解
  • 摆脱复杂配置!使用MusicGPT部署你的私人AI音乐生成环境
  • [在线实验]-ActiveMQ Docker镜像的下载与部署
  • 【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
  • HCSIF: 中国区域2000-2022年高时空分辨率(500m)SIF数据集