位置: IT常识 - 正文

video 自定义视频播放控件(videojs自定义按钮)

编辑:rootadmin
video 自定义视频播放控件

推荐整理分享video 自定义视频播放控件(videojs自定义按钮),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:video.js自定义样式,自定义video播放器,videojs自定义按钮,自定义video播放器,video自定义播放按钮,自定义video播放器,video自定义播放按钮,自定义video样式,内容如对您有帮助,希望把文章链接给更多的朋友!

ui设计的界面总是极具个性化的,要去修改插件中的视频控件的样式和布局太困难了,那就自己参照video原生事件,重写一个吧。

(效果图预览)

一、video标签的属性(props)

 html <video>标签 | 菜鸟教程

<video ref="videoPlayer" id="videoElement" controls autoplay :muted="isMute" width="800px" height="600px" > 您的浏览器不支持video</video>

参数说明:(更多属性参照上述菜鸟教程中的video标签)

controls:默认为true,即向用户展示视频控件(如播放、暂停按钮等)autoplay:如果出现该属性,则视频在就绪后马上播放。muted:是否静音,默认为truewidth:设置视频播放器的宽度二、video视频控件的触发事件 

video标签支持的多媒体事件(Media Events) | 菜鸟教程

<video ref="videoPlayer" id="videoElement" controls autoplay :muted="isMute" width="100%" height="100%" @loadeddata="setVideoPoster($event)" @progress="videoProgress($event)" @pause="videoPause($event)" @play="videoPlay($event)" @timeupdate="videoTimeUpdate()" @ended="videoEnded()" @contextmenu="contextmenu"> 您的浏览器不支持video</video><button @click="handlePlay">播放</button><button @click="handlePause">暂停</button><button @click="handleMute">切换静音</button><button @click="fullScreen">全屏</button>data(){ return{ isMute: true // 默认静音 }}1、播放(onplay事件)

this.$refs.videoPlayer.play();

methods:{ // 视频要开始播放时 videoPlay(e){ // ...触发该函数后视频会开始播放,我们可以做一些想做的事情,比如改变自定义播放按钮的样式等 }, // 自定义播放按钮中,触发视频的播放事件 handelPlay(){ this.$refs.videoPlayer.play(); // 会触发videoPlay()函数 }}2、暂停(onpause事件)

this.$refs.videoPlayer.pause();

methods:{ // 视频要暂停播放时 videoPause(e){ // ...触发该函数后视频会暂停播放 }, // 自定义播放按钮中,触发视频的播放事件 handelPause(){ this.$refs.videoPlayer.pause(); // 会触发videoPause()函数 }}3、静音(muted属性)

(1)切换静音

 // 手动切换静音(点击(非拖拽)静音时,用户选择的音量不变)

handleMute() {

video 自定义视频播放控件(videojs自定义按钮)

      this.isMute = !this.isMute;

},

(2)改变音量(volume属性)

this.$refs.videoPlayer.volume = a; (a为从 0~1的数字)

// 这里用element的进度条写音量大小调节条<el-slider v-model="curVolume" :show-tooltip="false" @input="changeVolume"></el-slider>data(){ return{ curVolume: 0, // 默认音量为0 }},methods:{ changeVolume(val){ this.curVolume = val; // 由于h5规定volum的值在0-1之间,所以这里要对获取到的val做一个处理(滑块的val是从0-100) this.$refs.videoPlayer.volume = val / 100; // 音量为0的时候,video控件为静音 if ( val == 0 ) { this.isMute = true; } else { this.isMute = false; } }}4、全屏fullScreen() { this.$refs.videoPlayer.webkitRequestFullScreen();},5、播放进度条

获取视频总时长(duration)

var videoObj = this.$refs.videoPlayer;

videoObj.addEventListener('canplay', () => {

        this.totalT = videoObj.duration;

})

获取视频加载进度

HTML5视频 - 加载百分比?

HTML5视频 - 加载百分比?

// 获取视频加载进度videoProgress(e){       var bf = this.$refs.videoPlayer.buffered;         var time = this.$refs.videoPlayer.currentTime;       if ( bf.length != 0 ){           var range = 0;           while( !( bf.start(range) <= time && time <= bf.end(range) ) ) {               range += 1;           }           var loadEndPercentage = ( bf.end(range) / this.playerVideo.duration ) * 100;  // 结束加载的百分比           this.persentLoad = loadEndPercentage;       }},

(1)父组件调用

<template> <video ref="videoPlayer" @progress="videoProgress($event)" @timeupdate="videoTimeUpdate()" > 您的浏览器不支持video </video> // 视频播放、加载进度条 <ProgressLine :presentT="presentT" :totalT="totalT" :persentLoad="persentLoad" @changeCurrentTime="changeCurrentTime($event)" @changeCurrentWord="changeCurrentWord($event)" > </ProgressLine> // 播放时长、视频总时长 <p> <span id="currentTime" ref="progressTimer">{{ videoCurrentTime }}</span> <span style="color: #ffffff;opacity: 0.3;">&nbsp;/&nbsp;</span> <span id="durationTime" ref="durationTimer">{{ videoTotalTime }}</span> </p></template>import ProgressLine from './ProgressLine.vue';export default { name: 'videoPage', components: { ProgressLine }, data(){ return{ presentT: 0, // 进度条的当前值,必须为number totalT: 0, // 进度条的最大值,必须为number persentLoad: 0, // 视频加载进度 videoCurrentTime: '00:00', // 当前视频已播放时长 videoTotalTime: '00:00', // 视频总时长 } }, methods:{ // 子组件传入的时间修改 changeCurrentTime(data) { this.$refs.videoPlayer.currentTime = data; // 点击进度条设置视频当前播放点 }, changeCurrentWord(data) { this.videoCurrentTime = this.formatTime(data); // 当前播放时间显示文字 }, // 获取视频加载进度 videoProgress(e){ var bf = this.playerVideo.buffered; var time = this.playerVideo.currentTime; if ( bf.length != 0 ){ var range = 0; while( !( bf.start(range) <= time && time <= bf.end(range) ) ) { range += 1; } var loadEndPercentage = ( bf.end(range) / this.playerVideo.duration ) * 100; // 结束加载的百分比 this.persentLoad = loadEndPercentage; } }, // 视频自动播放时 videoTimeUpdate(){ this.presentT = this.playerVideo.currentTime; // 获取当前播放时长 this.videoCurrentTime = this.formatTime(this.presentT); // 时间格式化 }, // 时间格式化 formatTime(t) { var m = parseInt(t % 3600 / 60) m = m < 10 ? '0' + m : m var s = parseInt(t % 60) s = s < 10 ? '0' + s : s return m + ':' + s }, }}

(2)进度条组件(播放进度条 和 加载进度条)

// ProgressLine.vue 进度条组件<template> <div> <div class="line-background"> <div class="time-line" @click="adjustProgress($event)"> <div class="progress-round" ref="progressRound"> <div class="loading" ref="persentLoad" style="width: 0;"></div> <!-- 加载进度条 --> <div class="progress" ref="progress" @click="adjustProgress"></div> <div class="round" ref="round" @mousedown="roundDrag"></div> </div> </div> </div> </div></template><script>export default { name: 'ProgressLine', props: { presentT: {}, totalT: {}, persentLoad: { default : 0 } }, data() { return { // 进度条拖拽 dragClick: false, // 鼠标/手指按下 clickDown: false, } }, created() { }, watch: { // 侦听当前播放时长设置进度条 presentT: { handler(newValue, oldValue) { // 未点击进度条 if (this.dragClick == false && this.clickDown == false) { this.$refs.progress.style.width = newValue / this.totalT * 100 + '%' if ((newValue / this.totalT * 100 - 1.23) < 0) { this.$refs.round.style.left = 0 + '%' } else { this.$refs.round.style.left = (newValue / this.totalT * 100) - 1.23 + '%' } } else if (this.dragClick == true) { this.dealWidth() this.dragClick = false } } }, persentLoad: { handler(newValue, oldValue) { this.$refs.persentLoad.style.width = ( newValue / 100 ) * 1300 + 'px'; } } }, methods: { progressData(data) { this.$emit('changeCurrentTime', data) this.$emit('changeCurrentWord', data) }, // 进度条位置和圆点定位处理 dealWidth() { this.$refs.progress.style.width = this.progressWidth / this.$refs.progressRound.offsetWidth * 100 + '%' if ((this.progressWidth / this.$refs.progressRound.offsetWidth * 100) - 1.23 < 0) { // 圆点定位 this.$refs.round.style.left = 0 + '%' } else { this.$refs.round.style.left = (this.progressWidth / this.$refs.progressRound.offsetWidth * 100) - 1.23 + '%' } }, // 进度条点击 adjustProgress(e) { this.dragClick = true e.preventDefault() const { left, width } = this.$refs.progressRound.getBoundingClientRect() // 进度条到屏幕距离及进度条的宽度 this.progressWidth = e.clientX - left if (this.progressWidth < 0) {//进度条边界值计算情况 this.progressWidth = 0 } else if (this.progressWidth >= width) { this.progressWidth = width } else { this.progressWidth = e.clientX - left // e.clientX:鼠标点击的位置到屏幕最左侧的距离 } this.dealWidth() this.progressData((this.progressWidth / width) * this.totalT) }, // 进度条圆点拖拽 roundDrag(event) { event.preventDefault() const offsetX = event.offsetX this.dragClick = true this.clickDown = true // 解决圆点拖拽进度条长度抖动 document.onmousemove = (e) => { // 给圆点添加移动事件 e.preventDefault()// 阻止进度条拖拽时屏幕原有的滑动功能 const X = e.clientX // 获取圆点离屏幕的距离 const { left, width } = this.$refs.progressRound.getBoundingClientRect() const ml = X - left // 进度条长度:圆点离屏幕的距离减去进度条最左边离屏幕的距离 if (ml <= 0) { // 进度条长度最小和最大值的界定 this.progressWidth = 0 } else if (ml >= width) { this.progressWidth = width } else { this.progressWidth = ml } this.progressData((this.progressWidth / width) * this.totalT) //视频播放时间 this.dealWidth() } // 抬起鼠标,结束移动事件 document.onmouseup = () => { document.onmousemove = null document.onmouseup = null this.clickDown = false } }, }}</script><style lang="less" scoped>.line-background { width: 100%; height: 10px; background-color: rgba(255, 255, 255, 0.3); .time-line { width: 100%; height: 10px; background-color: #565651; .progress-round { cursor: pointer; width: 100%; position: relative; display: flex; .loading { height: 10px; background-color: rgba(255, 255, 255, 0.3); } .progress { position: absolute; top: 0; left: 0; width: 00%; height: 10px; background-color: #3d7eff; } .round { position: absolute; top: 50%; left: 0; transform: translateY(-50%); width: 16px; height: 16px; border-radius: 16px; background: #ffffff; box-shadow: -2px 0px 2px 2px rgba(3, 0, 0, 0.30); } } }}</style>6、视频中禁用右键(可以禁止用户下载视频)// 在视频中禁用右键(禁止用户下载)contextmenu(e){ e.returnValue = false;},7、设置倍速播放

 this.$refs.videoPlayer.playbackRate = rate;   // rate 一般在[2.0,1.75,1.5,1.0,0.75,0.5]范围

本文链接地址:https://www.jiuchutong.com/zhishi/277613.html 转载请保留说明!

上一篇:Win10 19043.1237 9月累积更新 KB5005565推送(附更新修复+下载)

下一篇:苹果推送最新系统macOS Big Sur开发者预览版Beta 5(附推送内容)(苹果今天推送更新内容)

  • 红米k50pro卡槽在哪(红米k50pro+)

    红米k50pro卡槽在哪(红米k50pro+)

  • 计算机突然停电什么数据会丢失(计算机突然停电了怎么办)

    计算机突然停电什么数据会丢失(计算机突然停电了怎么办)

  • 快手推广保证金可以不交吗(快手推广保证金和店铺保证金区别)

    快手推广保证金可以不交吗(快手推广保证金和店铺保证金区别)

  • 安卓手机如何打开.nsa文件(安卓手机如何打开.vtt文件)

    安卓手机如何打开.nsa文件(安卓手机如何打开.vtt文件)

  • 小米6能更新安卓10吗(小米6更新安卓不充电)

    小米6能更新安卓10吗(小米6更新安卓不充电)

  • icloud空间有什么用(icloud空间干嘛的)

    icloud空间有什么用(icloud空间干嘛的)

  • win10手写笔怎么关闭(win10 手写笔记)

    win10手写笔怎么关闭(win10 手写笔记)

  • 芒果会员什么时候便宜(芒果会员什么时候最便宜)

    芒果会员什么时候便宜(芒果会员什么时候最便宜)

  • 华为手机深夜模式在哪(华为手机深夜模式怎么设置)

    华为手机深夜模式在哪(华为手机深夜模式怎么设置)

  • mt6755相当于骁龙哪一款处理器(mt6757相当于骁龙)

    mt6755相当于骁龙哪一款处理器(mt6757相当于骁龙)

  • 手机号销户后多久为空号(手机号销户后多久可办新号)

    手机号销户后多久为空号(手机号销户后多久可办新号)

  • 联想电脑无线网络显示叉(联想电脑无线网卡在哪个位置)

    联想电脑无线网络显示叉(联想电脑无线网卡在哪个位置)

  • 微信好友被拉黑无法申诉(微信好友被拉黑怎么加回来)

    微信好友被拉黑无法申诉(微信好友被拉黑怎么加回来)

  • 怎么知道airpodspro充电盒是否充满(怎么知道airpodspro有没有电)

    怎么知道airpodspro充电盒是否充满(怎么知道airpodspro有没有电)

  • apple pencil压感是什么意思(Applepencil压感是多少)

    apple pencil压感是什么意思(Applepencil压感是多少)

  • vivo手机怎么往mp3里传歌(vivo手机怎么往mp4里传图片)

    vivo手机怎么往mp3里传歌(vivo手机怎么往mp4里传图片)

  • word文档字打不上去(word文档字打不出来空白)

    word文档字打不上去(word文档字打不出来空白)

  • 拼多多怎么撤销差评(拼多多怎么撤销订单)

    拼多多怎么撤销差评(拼多多怎么撤销订单)

  • 微信小气泡视频怎么发(微信气泡视频怎么不留痕迹呢)

    微信小气泡视频怎么发(微信气泡视频怎么不留痕迹呢)

  • x23上市日期(x23是什么时候出的)

    x23上市日期(x23是什么时候出的)

  • 抖音视频怎么设置成手机动态壁纸(抖音视频怎么设置封面图片)

    抖音视频怎么设置成手机动态壁纸(抖音视频怎么设置封面图片)

  • 苹果max进水了屏幕失灵怎么办(苹果max进水了屏幕失灵)

    苹果max进水了屏幕失灵怎么办(苹果max进水了屏幕失灵)

  • 快手说说为什么看不到(快手说说为什么说内容已重复显示)

    快手说说为什么看不到(快手说说为什么说内容已重复显示)

  • 朋友圈新动态能看到访客吗(朋友圈新的动态看了对方知道吗)

    朋友圈新动态能看到访客吗(朋友圈新的动态看了对方知道吗)

  • 玩穿越火线总是网络异常,该怎么办?(玩穿越火线总是提示机器遇到)

    玩穿越火线总是网络异常,该怎么办?(玩穿越火线总是提示机器遇到)

  • uniapp通过watch监听和computed的使用(uniapp监听网络状态)

    uniapp通过watch监听和computed的使用(uniapp监听网络状态)

  • 增值税发票综合服务平台红字确认
  • 自行申报是什么征收方式
  • 减免税流程
  • 一般纳税人委托其他单位加工材料收回后直接对外销售的
  • 怎样确认个人所得税专项扣除操作流程
  • 应收款时间太长怎么处理
  • 年报会计师审计费用
  • 汇算清缴退回的所得税
  • 固定资产出售损失属于广义费用吗
  • 无形资产土地使用权摊销年限规定
  • 公司回购房产契税谁交
  • 定额备用金补付会计分录怎么写?
  • 加工费发票可以不开数量吗
  • 会计中应收账款的英文
  • 完工绿化苗木怎样结转成本?
  • 别人帮开票钱要打给别人账户吗
  • 开办费转入管理费用分录
  • 购入的工具应计入哪个科目?
  • 建筑工程属于开票项目吗
  • 企事业承包承租方缴纳的管理费税费
  • 兼兼的意思
  • 完税凭证号是几位数
  • 房地产预售阶段增值税进项
  • 使用专项资金购买的固定资产 需要取得发票吗
  • 会计人员需要承担的责任
  • 货到付款一般付多少运费
  • 个税申报已经扣了怎么办
  • windows10如何开启远程
  • 电脑qq音乐设置在哪里
  • PHP:oci_num_rows()的用法_Oracle函数
  • php写html
  • 铁杆茉莉的养殖方法
  • navione.exe是什么意思
  • 商品结转成本后怎么做账
  • 盆栽玉树的养殖方法
  • 低值易耗品的三级科目有哪些
  • 逾期未收回包装物押金增值税
  • 酒店购买天然气流程
  • openai创始人阿尔特曼 取向
  • 微信小程序获取位置信息的权限在哪里修改位置
  • php数组变字符串
  • 基于微信小程序制作
  • vue2计算属性和vue3的计算属性的区别
  • custom用法
  • setsid命令
  • php识别验证码的库高级
  • 装饰公司的开票范围
  • 酒店收取电费合理吗
  • python如何开发系统
  • python中input转换
  • 业务招待费进项税额转出会计分录
  • 一般纳税人应交税费二级科目有哪些
  • 缴纳税收的凭证怎么打印
  • 电子口岸无纸化报关
  • 收到天使投资账务处理
  • mysql数据库函数
  • 根据sql脚本修改数据类型
  • 填写企业所得税年度纳税申报表都需要哪些数据
  • 银行存款和其他应付款不平怎么处理
  • 赊销应收款余额怎么算
  • 成本类账户期末如有余额在借方
  • 营改增的服务
  • 个体工商户分配所得
  • 认缴资金可以增加吗
  • 主营业务成本借贷方向增减
  • 火车票退票改签手续费
  • 会计从业人员信息查询
  • 解除非正常户罚款调整操作
  • 会计凭证中阿拉伯数字如何书写
  • sqlserver通用的删除服务器上的所有相同后缀的临时表
  • 服务器centos6.8安装教程
  • ubuntu卸载dpkg安装的软件
  • info.exe是什么病毒
  • 微软何时推出win10
  • python语言如何获取随机整数
  • python 处理mp3
  • 产品税务编号查询系统官网
  • 关于工龄认定的司法解释
  • 山西国家税务总局
  • 博兴公安局局长
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设