video.js的坑点和自定义video的播放、全屏、快进操作

这篇具有很好参考价值的文章主要介绍了video.js的坑点和自定义video的播放、全屏、快进操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、使用插件video.js
遇到问题:点击背景视频无法触发播放和暂停的操作
问题原因:在移动端使用video.js与fastclick 冲突
解决方式:修改fastclick的源码

FastClick.prototype.needsClick = function(target) {
		switch (target.nodeName.toLowerCase()) {

		// Don't send a synthetic click to disabled inputs (issue #62)
		case 'button':
		case 'select':
		case 'textarea':
			if (target.disabled) {
				return true;
			}

			break;
		case 'input':
			// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
			if ((deviceIsIOS && target.type === 'file') || target.disabled) {
				return true;
			}

			break;
		case 'label':
		case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
		case 'video':
			return true;
		}
		// 修改源码的地方
        return ((/\bneedsclick\b/).test(target.className) || (/\bvjs/).test(target.className));

		// return (/\bneedsclick\b/).test(target.className);
	};

二、 使用自定义video满足ui设计的需求
解决方案:自定义进度条、全屏操作
实际代码:文章来源地址https://www.toymoban.com/news/detail-557687.html

<template>
  <div id="lkk">
    <div id="title">
      <span class="tit-span" @click="back"></span>
      <span class="tit-text">{{ title }}</span>
    </div>
    <div id="aa">
      <div class="progress">
        <div class="progress_bg" @touchstart.prevent="handleTap($event)">
          <div class="progress_bar" ref="progressBar"></div>
        </div>
        <div
          class="progress_btn"
          ref="progressBtn"
          @touchstart.prevent="handleStart($event)"
          @touchmove="handleMove($event)"
          @touchend="handleEnd($event)"
        ></div>
      </div>
      <div @click.stop="enableMute" class="mymuted needsclick">
        <img v-if="showVoi" src="../assets/muted.png" width="100%" height="100%" alt="" />
        <img v-else src="../assets/voice.png" width="100%" height="100%" alt="" />
      </div>
      <div id="full" class="needsclick" @click.stop="changeFull"></div>
    </div>
    <img
      id="videoPalse"
      ref="videoPalse"
      :class="{ active: isFullScreen }"
      :src="videoImg"
      @click="play"
      alt
    />
    <video
      :src="videoUrl"
      height="100%"
      width="100%"
      preload="auto"
      autoplay
      :poster="poster"
      webkit-playsinline="true"
      playsinline="true"
      x-webkit-airplay="allow"
      x5-video-player-type="h5"
      x5-video-orientation="landscape"
      id="vid"
      ref="vids"
      class="needsclick"
      @click="play"
    ></video>
  </div>
</template>
<script>
import "../lib/flexible";
// import { Indicator } from "mint-ui";
export default {
  data() {
    return {
      videoUrl: this.$route.query.url,
      poster: this.$route.query.poster,
      portraint: "portraint",
      title: "",
      isFullScreen: false,
      videoImg: "",
      showVoi: true,
      isTit: false, //是否显示头部
      videoBox: "",
      nowAudioTime: "", // 当前播放进度
      x1: 0,
      y1: 0,
      oldTime: 0,
      newTime: 0,
      olfLeft: 0,
      newLeft: 0,
      nowLeft: 0,
      progressWidth: 0,
      current_time: 0,
      vids:'',
      progressBar:"",
      progressBtn:"",
      progress:''
    };
  },

  async mounted() {
    const that = this;
    that.vids = document.getElementById("vid");
    that.progressBar = document.querySelector(".progress_bar");
    that.progressBtn = document.querySelector(".progress_btn");
    that.progress = document.querySelector(".progress");
    let vids = that.vids
    that.progressWidth = that.progress.offsetWidth;
    vids.addEventListener("timeupdate", that.videoTime);
    // vids.addEventListener("seeking", function(e) {
    //   console.log("开始移动进度条");
    //   vids.pause();
    // });
    // // 11、seeked:查找结束。当用户已经移动/跳跃到视频中新的位置时触发
    // vids.addEventListener("seeked", function(e) {
    //   console.log("进度条已经移动到了新的位置");
    //   vids.play();
    // });
    vids.muted = true;
    vids.play();
  },
  created() {},
  methods: {
    videoTime(){
        const that = this;
        let percent = this.vids.currentTime / this.vids.duration;
        that.progressBar.style.width = percent * 100 + "%";
        that.progressBtn.style.left = percent * 100 + "%";
    },
    handleTap(e) {
      e.preventDefault();
      const that = this;
      let progressWidth = that.progressWidth;
      let touches = e.changedTouches;
      that.x1 = that.isFullScreen ? touches[0].pageY : touches[0].pageX;
      let per = that.x1 / progressWidth;
      that.nowAudioTime = that.vids.duration * per;
      that.vids.currentTime = that.nowAudioTime;
    },
    handleStart(e) {
      const that = this;
      e.preventDefault();
      var touches = e.changedTouches;
      that.x1 = that.isFullScreen ? touches[0].pageY : touches[0].pageX;
      that.olfLeft = that.progressBtn.offsetLeft;
      that.vids.pause();
      that.pause = true;
    },
    handleMove(e) {
      const that = this;
      e.preventDefault();
      let progressWidth = that.progressWidth;
      let vids = that.vids;
      let x2 = that.isFullScreen ? e.changedTouches[0].pageY : e.changedTouches[0].pageX;
      that.newLeft = x2 - that.x1;
      that.nowLeft = that.olfLeft + that.newLeft;
      if (that.nowLeft < 0) {
        that.nowLeft = 0;
      }
      if (that.nowLeft > progressWidth) {
        that.nowLeft = progressWidth;
      }
      that.progressBar.style.width = (that.nowLeft / progressWidth) * 100 + "%";
      that.progressBtn.style.left =
        ((that.nowLeft - (that.nowLeft > progressWidth - 10 ? 10 : 5)) / progressWidth) * 100 + "%";
      let per = that.nowLeft / progressWidth;
      that.nowAudioTime = vids.duration * per; //音频应该显示的时间
      that.current_time = that.nowAudioTime;
      vids.currentTime = that.nowAudioTime;
    },
    handleEnd(e) {
      const that = this;
      // touch.removeEventListener("touchmove", handleEnd, false);
      that.vids.currentTime = that.nowAudioTime;
       this.vids.play();
      that.pause = false;
    },
    resetWidth() {
      this.$nextTick(function() {
        this.progressWidth = this.progress.offsetWidth;
      });
    },
    enableMute() {
      this.vids.muted = !this.vids.muted;
      this.showVoi = !this.showVoi;
    },
    changeFull() {
      if (this.isFullScreen) {
        this.changeSet()
      } else {
        this.changeSet('width')
      }
    },
    back() {
      if (this.isFullScreen) {
         this.changeSet()
      } else {
        window.appAction("goBack");
      }
    },
    changeSet(width){
      this.resetWidth();
      let myVideo = this.vids;
      let aa = document.getElementById("aa");
      let title = document.getElementById("title");
      let w = document.documentElement.clientWidth || document.body.clientWidth;
      let h = document.documentElement.clientHeight || document.body.clientHeigth;
      let cha = width?Math.abs(h - w) / 2:0;
      let data = width?(w - 25) / 2 + cha:0;
      let dataY = width?(h - 46) / 2:0;
      let dataY2 = width?(h -40) /2:0
      let titleData = width?`${((h + 40) / 2 - w)>0?'-':''}${Math.abs((h + 40) / 2 - w)}`:0;
      myVideo.width = width?h:w;
      myVideo.height = width?w:h;
      myVideo.style.zIndex = 2000;
      myVideo.style.transform = `translate(-${cha}px,${cha}px) rotate(${width?90:0}deg)`;
      this.isFullScreen = width?true:false;
      aa.style.width = `100${width?'vh':'vw'}`;
      aa.style.transform = `translate(-${data}px,-${dataY}px) rotate(${width?90:0}deg)`;
      title.style.width = `100${width?'vh':'vw'}`;
      title.style.transform =`translate(${titleData}px,${dataY2}px) rotate(${width?90:0}deg)`;
    },
    play() {
      let myVideo = this.vids;
      if (myVideo.paused) {
        myVideo.play();
        this.videoImg = "";
        this.$refs.videoPalse.style.display = "none";
        this.isTit = false;
      } else {
        myVideo.pause();
        this.videoImg = require("../assets/mm02.png");
        this.$refs.videoPalse.style.display = "block";
        this.isTit = true;
      }
    }
  },
  beforeDestroy() {
      this.vids.removeEventListener('timeupdate',this.videoTime,false)
  },
  
};
</script>
<style lang="less" scoped>
* {
  touch-action: none;
}
#lkk {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  background: #000;
}
#aa {
  width: 100%;
  height: 24px;
  z-index: 2000001;
  position: fixed;
  left: 0;
  bottom: 10px;
  /* background: #666; */
  border-radius: 4px;
  display: flex;
  align-items: center;
  padding: 0 16px;
  box-sizing: border-box;
  /* justify-content: center; */
}
.progress {
  position: relative;
  flex: 1;
}

.progress_bg {
  overflow: hidden;
  height: 2px;
  background: rgba(255, 255, 255, 0.2);
}

.progress_bar {
  height: 2px;
  background: #5493db;
  width: 0;
}

.progress_btn {
  width: 11px;
  height: 11px;
  background: #5493db;
  border-radius: 50%;
  position: absolute;
  left: 0px;
  margin-left: -4px;
  top: -5px;
  cursor: pointer;
  box-sizing: border-box;
}

.aa {
  flex: 1;
  height: 4px;
  border-radius: 4px;
  background: rgba(255, 255, 255, 0.2);
}
#bb {
  width: 0;
  height: 4px;
  border-radius: 4px;
  background: #5493db;
  display: inline-block;
}

#full {
  color: #fff;
  width: 0.48rem;
  height: 0.4rem;
  background: url(../assets/full.png) no-repeat center;
  background-size: 100% 100%;
  margin-left: 0.2rem;
}

.mymuted {
  display: flex;
  width: 0.48rem;
  height: 0.4rem;
  margin-left: 0.43rem;
  img {
    width: 0.48rem;
    height: 0.4rem;
    max-width: 100%;
  }
}
#vid {
  position: absolute;
  left: 0;
  top: 0;
}
#title {
  height: 40px;
  line-height: 40px;
  width: 100%;
  color: #fff;
  position: relative;
  z-index: 300000;
  /* box-sizing: border-box; */
  /* background: red; */
  display: flex;
  align-items: center;
}
#title .tit-span {
  background: url(../assets/mm07.png) no-repeat center center;
  height: 0.8rem;
  width: 0.6rem;
  background-size: 0.586rem;
  border: 0;
}
#title .tit-span {
  color: #000;
}
#videoPalse {
  position: absolute;
  z-index: 9999;
  width: 1.28rem;
  height: 1.28rem;
  top: 50%;
  left: 50%;
  margin-top: -0.64rem;
  margin-left: -0.64rem;
  display: none;
}
.active {
  transform: rotate(90deg);
}
.video-desc {
  position: absolute;
  bottom: 1rem;
  color: #fff;
  padding: 0 0.3rem;
  display: flex;
  flex-direction: column;
  z-index: 9999;
  > p {
    font-size: 0.37rem;
    line-height: 0.6rem;
  }
  > span {
    color: #9b9da9;
    font-size: 0.293rem;
    margin-top: 0.1rem;
    line-height: 0.5rem;
  }
}
</style>

到了这里,关于video.js的坑点和自定义video的播放、全屏、快进操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • vue 视频播放插件vue-video-player自定义样式、自动播放设置、设置一开始全屏播放视频

    1、背景 项目中有涉及视频播放的需求,并且UI设计了样式,与原生的视频video组件有差异,所以使用了vue-video-player插件,并对vue-video-player进行样式改造,自定义播放暂停按钮、全屏按钮、时间进度条样式等,自动播放设置、设置一开始全屏播放视频、监听全屏事件等。 2、效

    2024年02月05日
    浏览(46)
  • video全屏操作栏自定义样式&&js 指定元素全屏&&视频截图下载

    目录 1. 页面结构 2. 全屏方法 3. 截图方法 4. 样式代码 5. 效果截图 6. 附上完整代码 最近遇到的需求就是重新video标签的控制栏的样式,包括进度条、音量、倍速、全屏等样式,在正常状态下,可以将原生样式隐藏掉自定义新的控制栏元素定位上去,但是全屏后样式失效,出现

    2024年02月12日
    浏览(45)
  • vue自定义h5video视频播放器进度条组件,可拖拽、跳转、倍速、全屏

    一个进度条组件控制多个视频的播放、进度调整。视频可点击全屏观看,唯一的进度条是某个指定视频的视频信息。 全屏 点击进度条跳转 拖动滑块 在菜鸟教程上有以下几个参数的详细解说,这张图忘记哪里看的了,如有认领可评论我贴链接 倍速 // 倍速 handleChangeSpeed(item)

    2024年02月12日
    浏览(108)
  • 苹果手机video标签播放视频问题(播放mp4视频遇到的坑)

    1.场景描述 服务端上传MP4视频文件,iOS客户端通过URL播放该视频文件。提供视频接口,可以进行视频下载或者直接播放,但是iOS手机无法播放,且PC端safari浏览器也无法播放。 2.问题描述 安卓手机可以正常播放视频,iOS手机无法播放,且PC段safari浏览器也无法播放。 3.问题分

    2024年02月22日
    浏览(52)
  • 微信小程序video 点击自动全屏播放

    2024年02月19日
    浏览(52)
  • video视频标签一些设置,包括封面、播放结束后的封面、视频占满屏幕的方式、视频播放暂停、展示控制栏、触发全屏播放事件

    代码如上,poster属性用于设置视频封面;视频链接放在source标签内的src属性;加controls属性就会展示控制栏,不加不显示; 视频进入网页自动播放 查阅资料都是说在vedio属性中加 autoplay=\\\"autoplay\\\" muted=\\\'muted\\\',如第一段代码,但是我试了都是被浏览器评屏蔽掉的(为了提高用户体

    2024年02月13日
    浏览(73)
  • video 自定义视频播放控件

    ui设计的界面总是极具个性化的,要去修改插件中的视频控件的样式和布局太困难了,那就自己参照video原生事件,重写一个吧。 (效果图预览)  html video标签 | 菜鸟教程 参数说明:(更多属性参照上述菜鸟教程中的video标签) controls:默认为true,即向用户展示视频控件(如

    2024年02月02日
    浏览(49)
  • H5自定义video播放控件,播放暂停使用图标

    大家都知道vedio的contorls属性可以将video的控件显示出来,包括 播放、暂停、进度条、声量控制、全屏显示 等。但是出于需求,往往需要将某些控件外形变成我们想要图标(但功能一样),而不是全部使用vedio自带的控件图标。 下面这个例子,我将隐藏video自带的播放按钮,使

    2024年02月08日
    浏览(47)
  • ES scroll查询的坑点

    scroll 查询是ES中为了解决一次获取不到全部数据的一种解决方案。 第一次查询 第二次查询(第二次查询,可以不加scroll的失效时间) 第2+n次访问(第三次及之后的查询必须要加scroll的失效时间) 首次访问 访问后,会得到部分或全部数据和scroll_id. 之后再访问 注意点 : 用

    2024年02月11日
    浏览(33)
  • video 自定义视频播放控件的显示和隐藏

    用户自定义视频控件的话,就得我们自己去控制控件的显示和隐藏状态,一起看看如何实现吧。 1、在video标签中加入几个鼠标事件: @dblclick=\\\"fullScreen()\\\"    // 双击 @mouseover=\\\"handleMouseOver()\\\"   // 鼠标移入视频区域 @mousemove.self=\\\"handleMouseMove()\\\"   // 鼠标在视频区域内移动 @mouseo

    2024年02月11日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包