• vue 自定义video 的进度条,可快进,可拖动


    <template>
      <div class="trailer_video_box">
        <!-- 宣传片区域 -->
        <video ref="trailer" class="trailer_box" preload :src="videoUrl"></video>
        <!-- end -->
        <!-- 自定义进度条 -->
        <div class="trailer_progress_bar">
          <div class="proress_title">
            <img src="@/assets/images/live/xsjlogo.png" />
            <p>正在播放宣传片,播放完后,可继续录制,请耐心等待…</p>
          </div>
          <div class="proress_content_box">
            <p class="pro_pone">{{ this.currentTime }}</p>
            <div
              ref="progress"
              class="progress_bar_box"
              @mousedown="getNowWh($event)"
              @mouseup="mouseup($event)"
            >
              <div
                ref="onProgress"
                :class="[
                  radiusLeft
                    ? 'on_progress_bar_child border_Radius'
                    : 'on_progress_bar_child',
                ]"
              >
                <span
                  v-show="!radiusLeft"
                  ref="mouseDom"
                  class="mouse_down"
                  @mousedown.stop="mousedown($event)"
                  @mouseup.stop="mouseup($event)"
                ></span>
              </div>
            </div>
            <p class="pro_pone">{{ this.duration }}</p>
          </div>
        </div>
        <!-- end -->
      </div>
    </template>
    <script>
    import Watcher from "../../../webSocket/watcher";
    export default {
      name: "trailerModal",
      props: {
        videoUrl: {
          type: String,
          default: "",
        },
      },
      data() {
        return {
          currentTime: "00:00", //当前时间
          duration: "00:00", //总时长
          pvideo: null, //视频容器
          timer: null, //定时器
          radiusLeft: false,
          // https://www.w3school.com.cn/i/movie.ogg
          // videoUrl:'https://vdse.bdstatic.com//b143aff3dacc8c3baca30fd0f9882eba.mp4'
        };
      },
      mounted() {
        console.log("aa==" + this.videoUrl);
        this.init();
      },
      methods: {
        //初始化事件
        init() {
          this.pvideo = this.$refs.trailer;
          this.isPlay();
        },
        //播放宣传片
        isPlay() {
          if (this.pvideo.paused || this.pvideo.ended) {
            this.pvideo.play();
            this.timer = setInterval(this.setProgress, 60);
          } else {
            this.pvideo.pause();
            clearInterval(this.timer);
            this.timer = null;
          }
        },
        //设置进度条
        setProgress() {
          let progress = this.$refs.progress; //获取进度条父元素
          let onProgress = this.$refs.onProgress; //获取变化进度条的元素
          let mouseDom = this.$refs.mouseDom;
          this.currentTime = this.timeFomat(this.pvideo.currentTime); //当前播放的时间,格式化时间格式后展示
          this.duration = this.timeFomat(this.pvideo.duration); //总时长,格式化时间格式后展示
          //换算,视频没有结束或者被暂停
          if (!this.pvideo.ended) {
            this.radiusLeft = false;
            let percent = this.pvideo.currentTime / this.pvideo.duration; //得出比例
            mouseDom &&
              (mouseDom.style.left = percent * progress.offsetWidth + "px");
            onProgress &&
              (onProgress.style.width = percent * progress.offsetWidth + "px");
          } else {
            //视频已结束
            onProgress && (onProgress.style.width = "100%");
            this.radiusLeft = true;
            clearInterval(this.timer);
            this.timer = null;
            // this.$store.commit('setPlayVideo',false);
            // let flag = this.$store.state.live.isVideo;
            // !flag&&Watcher.$emit('ffMpeg',flag);
            // window.$myToast({
            //     text:'宣传片已播放完,请继续录制',
            //     duration: 1500,
            //     icon: "warning",
            //     style: "right:50%;bottom:10%;transform: translate(50%,50%);"
            // });
            setTimeout(() => {
              //通知父组件关闭
              this.$emit("closeModal");
            }, 1500);
          }
        },
        //点击当前位置,设置进度条
        getNowWh(event) {
          let ev = event || window.event;
          this.videoSeek(ev.offsetX);
        },
        //传入当前点击的偏移量,换算当前视频时间,并播放
        videoSeek(startx) {
          if (this.pvideo.paused || this.pvideo.ended) {
            this.pvideo.play();
            this.enhanceVideoSeek(startx);
          } else {
            this.enhanceVideoSeek(startx);
          }
        },
        //根据鼠标拖动的距离,换算进度条
        enhanceVideoSeek(moveWidth) {
          clearInterval(this.timer);
          let progress = this.$refs.progress; //获取进度条父元素
          let onProgress = this.$refs.onProgress; //获取变化进度条的元素
          let percent = moveWidth / progress.offsetWidth;
          onProgress &&
            (onProgress.style.width = percent * progress.offsetWidth + "px");
          this.pvideo.currentTime = percent * this.pvideo.duration;
          this.timer = setInterval(this.setProgress, 60);
        },
        //鼠标按下
        mousedown(event) {
          let that = this;
          let ev = event || window.event;
          let _target = ev.target;
          let startx = ev.clientX;
          let sb_bkx = startx - ev.target.offsetLeft;
          let allwh = this.$refs.progress.clientWidth;
          let ww = document.documentElement.clientWidth;
          let wh = window.innerHeight;
          //阻止事件冒泡
          if (ev.preventDefault) {
            ev.preventDefault();
          } else {
            ev.returnValue = false;
          }
          //移动
          document.onmousemove = function (ev) {
            let evt = ev || window.event;
            let scrolltop =
              document.documentElement.scrollTop || document.body.scrollTop;
            if (
              evt.clientY < 0 ||
              evt.clientX < 0 ||
              evt.clientY > wh ||
              evt.clientX > ww
            ) {
              return false;
            }
            let endx = evt.clientX - sb_bkx;
            //设置拖动有效区域
            if (endx > -1 && endx < allwh) {
              _target.style.left = endx + "px";
              that.enhanceVideoSeek(endx);
            } else {
              //超出区域,置空拖动事件
              document.onmousemove = null;
            }
          };
        },
        //鼠标放开
        mouseup(e) {
          document.onmousemove = null;
        },
        //订阅暂停事件
        stopPlay() {
          Watcher.$on("stop", (data) => {
            this.isPlay();
          });
        },
        /* 时间格式化 */
        timeFomat(time) {
          let h = Math.floor(time / 3600);
          let m = Math.floor((time % 3600) / 60);
          let s = Math.floor(time % 60);
          m = m >= 10 ? m : "0" + m;
          s = s >= 10 ? s : "0" + s;
          if (h === 0) {
            return m + ":" + s;
          }
          return h + ":" + m + ":" + s;
        },
      },
    };
    </script>
    <style lang='less' scoped>
    .trailer_video_box {
       100%;
      height: calc(100% - 100px);
      position: absolute;
      top: 8px;
      left: 0;
      z-index: 1000;
      background: #292c32;
      border-radius: 12px;
      .trailer_box {
         100%;
        height: calc(100% - 143px);
        padding: 0;
        object-fit: initial;
        border-radius: 12px 12px 0 0;
      }
      .trailer_progress_bar {
         100%;
        overflow: hidden;
        position: relative;
        .proress_title {
           100%;
          height: 100px;
          overflow: hidden;
          display: flex;
          align-items: center;
          justify-content: center;
          img {
             32px;
            height: 32px;
            margin-right: 8px;
          }
          p {
            color: #fff;
            font-size: 12px;
            font-weight: 600;
          }
        }
        .proress_content_box {
           100%;
          overflow: hidden;
          display: flex;
          padding: 0 24px;
          justify-content: center;
          p {
            color: #fff;
            font-weight: 400;
            font-size: 12px;
          }
          .pro_pone {
          }
          .progress_bar_box {
            flex: 1;
            margin: 6px 16px 0 16px;
            height: 8px;
            background: rgba(205, 206, 209, 0.2);
            border-radius: 5px;
            box-sizing: border-box;
            position: relative;
            .on_progress_bar_child {
               0;
              height: 100%;
              background: #cdced1;
              border-radius: 4px 0px 0px 4px;
              // overflow: hidden;
              position: absolute;
              top: 0;
              left: 0;
              z-index: 1001;
              .mouse_down {
                position: absolute;
                 5px;
                height: 16px;
                top: 50%;
                margin-top: -8px;
                left: 100%;
                background: #ff5001;
                border-radius: 3px;
                z-index: 1002;
                cursor: pointer;
              }
            }
            .on_progress_bar_child.border_Radius {
              border-radius: 4px;
            }
          }
        }
      }
    }
    </style>
  • 相关阅读:
    代码高亮测试
    自定义Edit控件控制输入范围
    多字节字符与界面 manifest
    实现类成员函数回调
    [VIM插件]fedora22编译vim7.4对perl组件支持的问题
    火车头Ecshop2.7文章采集发布模块
    js 创建对象
    js 属性类型
    JS函数的属性
    JS 函数中返回另一个函数
  • 原文地址:https://www.cnblogs.com/wenqylh/p/14131857.html
Copyright © 2020-2023  润新知