video标签自定义控制按钮--全屏与非全屏--播放与暂停

hover时,显示红色播放按钮和最大化按钮, 其余时刻隐藏,全屏时显示播放进度条,以及hover时,才显示红色暂停按钮和最小化按钮

html 复制代码
<template>
  <div class="item-wrapper-inner" ref="fullscreenDomRef">
    <!-- 
      muted: 出现该属性表示静音 
      autoplay: 出现该属性表示自动播放
      loop: 出现该属性表示循环播放
      preload: 出现该属性表示视频在页面加载前就开始加载
      disablepictureinpicture: 禁用画中画
    -->
    <video
      :controls="controls"
      preload
      muted
      autoplay
      loop
      disablepictureinpicture
      controlslist="nodownload noplaybackrate"
      ref="videoDomRef"
    >
      <source src="/01.mp4" />
    </video>
    <div class="full-screen-btn" @click="onToggleFullscreen">
      <a-icon type="fullscreen" />
    </div>
    <div class="play-stop-btn" @click="onTogglePlay">
      <a-icon type="pause-circle" v-if="playing" />
      <a-icon type="play-circle" v-else />
    </div>
  </div>
</template>

<script>
export default {
  name: "VideoPLayer",
  props: ["src"],
  data() {
    return {
      controls: false,
      playing: false
    };
  },
  methods: {
    onToggleFullscreen() {
      const fullscreenDom = this.$refs.fullscreenDomRef;
      console.log(document.fullscreenElement);
      if (document.fullscreenElement) {
        this.cancelFullscreen();
      } else {
        this.fullscreenFun(fullscreenDom);
      }
    },
    fullscreenFun(ele) {
      if (ele.requestFullscreen) {
        ele.requestFullscreen();
      } else if (ele.mozRequestFullScreen) {
        ele.mozRequestFullScreen();
      } else if (ele.webkitRequestFullScreen) {
        ele.webkitRequestFullScreen();
      }
    },
    cancelFullscreen() {
      if (document.exitFullscreen) {
        document.exitFullscreen();
      } else if (document.msExitFullscreen) {
        document.msExitFullscreen();
      } else if (document.mozCancelFullScreen) {
        document.mozCancelFullScreen();
      } else if (document.webkitExitFullscreen) {
        document.webkitExitFullscreen();
      }
    },
    onFullscreenchange() {
      if (document.fullscreenElement) {
        console.log("元素已进入全屏状态");
        this.controls = true;
      } else {
        console.log("元素已退出全屏状态");
        this.controls = false;
      }
    },
    onTogglePlay() {
      const videoDom = this.$refs.videoDomRef;
      if (videoDom) {
        if (videoDom.paused) {
          videoDom.play();
        } else {
          videoDom.pause();
        }
      }
    },
    videoEvtListnerDestory() {
      const videoDom = this.$refs.videoDomRef;
      if (videoDom) {
        videoDom.removeEventListener("play");
        videoDom.removeEventListener("pause");
        videoDom.removeEventListener("ended");
      }
    },
    videoEvtListner() {
      const videoDom = this.$refs.videoDomRef;
      if (videoDom) {
        videoDom.addEventListener("play", () => {
          //播放
          console.log("开始播放");
          this.playing = true;
        });
        videoDom.addEventListener("pause", () => {
          //暂停
          console.log("暂停");
          this.playing = false;
        });
        videoDom.addEventListener(
          "ended",
          () => {
            //结束
            console.log("播放结束");
            this.playing = false;
          },
          false
        );
      }
    }
  },
  mounted() {
    this.videoEvtListner();
    document.addEventListener("fullscreenchange", this.onFullscreenchange);
  },
  beforeDestroy() {
    this.videoEvtListnerDestory();
    document.removeEventListener("fullscreenchange", this.onFullscreenchange);
  }
};
</script>
<style scoped lang="less">
.item-wrapper-inner {
  height: 100%;
  position: relative;
  video {
    width: 100%;
    height: 100%;
  }
  // 全屏按钮
  video::-webkit-media-controls-fullscreen-button {
    display: none;
  }
  //播放按钮
  video::-webkit-media-controls-play-button {
    display: none;
  }
  .full-screen-btn {
    position: absolute;
    top: 30px;
    right: 30px;
    color: red;
    display: none;
    cursor: pointer;
  }
  .play-stop-btn {
    position: absolute;
    top: 50%;
    left: 50%;
    color: red;
    display: none;
    cursor: pointer;
    transform: translate(-50%);
  }
  &:hover {
    .full-screen-btn {
      display: block;
    }
    .play-stop-btn {
      display: block;
    }
  }
}
</style>
相关推荐
程序员黑豆2 小时前
鸿蒙应用开发:Scroll 组件从入门到实战
前端·华为·harmonyos
a1117763 小时前
三色软糖坠落玻璃池 THreeJS kimi
前端·人工智能·threejs
凤山老林4 小时前
防抖与节流:解决Web前段高频事件,性能优化的”YYDS“
前端·防抖节流
a1117764 小时前
Web 3D 肌肉车展示项目 开源
前端·3d
KaMeidebaby4 小时前
卡梅德生物技术快报|核酸适配体文库筛选:核酸适配体文库筛选全流程技术解析:NGS与AI辅助方案的设计与实践
前端·人工智能·物联网·算法·百度
Wect4 小时前
TypeScript 完全指南
前端·javascript·typescript
hunterandroid4 小时前
Fragment 事务与状态丢失:从崩溃现场到稳定治理
前端
清风programmer4 小时前
H5与小程序通信
前端·vue.js·uni-app
不一样的少年_4 小时前
原来 AI Agent 的核心循环这么简单:手搓一个 Agent Loop
前端·后端·agent
爱勇宝5 小时前
你以为自己性格不好,其实只是被环境反复训练
前端·后端·程序员