解决方案

html自定义video播放器

seo靠我 2023-09-25 23:13:36

本章的css可以说约等于没有,全是逻辑,仅供参考

html

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTSEO靠我F-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=devicSEO靠我e-width, initial-scale=1.0"><title>视频</title><link rel="stylesheet" href="index.css" /> </heSEO靠我ad> <body><div><video src="你的视频名称&路径.mp4" id="myVideo" onclick="player()"></video><div classSEO靠我="timeStyle"></div></div> </body> <script src="index.js"></script> </html>

首先SEO靠我你要获取到video元素

//全局变量 const myVideo = document.getElementById("myVideo")//video,获取到的是元素标签信息

播放&暂SEO靠我

这是一个点击事件,函数名为player

const player = () => {if(myVideo.paused){myVideo.play() //播放}else {myVideo.pauseSEO靠我() //暂停} }

时间格式化函数

这是一个函数,函数名为JiSuanHMS

const JiSuanHMS = (time) => {if(time >= 60 * 60 *60){ /SEO靠我/ 大于一小时//h:m:sh = time / 60 / 60^0 //^0:四舍五入整数化m = time / 60 % 60^0s = time % 60 % 60^0return h + : SEO靠我+ m + : + s}else { //小于一小时//m:sm = time / 60 % 60^0s = time % 60 % 60^0return m + : + s} }

即将SEO靠我播放事件函数(oncanplay)

本章只是配置时间和进度条,所以之后有的功能自行添加

//全局变量 //播放的时间元素标签获取,是个class const timeStySEO靠我le = document.querySelector(".timeStyle")//time 获取视频总时间 video.duration //是一个浮点类型 SEO靠我 获取视频当前时间 video.currentTime//是一个浮点类型 myVideo.oncanplay = () => {const allTiSEO靠我me = JiSuanHMS(myVideo.duration)const cTime = JiSuanHMS(myVideo.currentTime)timeStyle.innerHTML = `<SEO靠我div>${cTime}/${allTime}</div>` //写入元素 }

暂停后将即将播放事件函数(onplaying)

我们这里先不做任何处理(你可以不写)

myVideo.onplSEO靠我aying = () => {//就是暂停后要播放时会调用// console.log(test)// console.log(myVideo.duration) }

播放时事件函数(oSEO靠我nplay )

这个事件是在我们播放视频时调用。我们这里只是定义了一个定时器,每一秒去读取当前视频时间(currentTime)的值,至于总时间(duration)因为是innerHTML 重写,所以也SEO靠我要加上去

//定时器定义与初始值 let inter = null //全局变量 myVideo.onplay = () => {inter = setIntervalSEO靠我(()=>{const allTime = JiSuanHMS(myVideo.duration)const cTime = JiSuanHMS(myVideo.currentTime)timeStySEO靠我le.innerHTML = `<div>${cTime}/${allTime}</div>`},1000) }

暂定时事件函数(onpause )

这个事件是在我们暂停视频时调用。这里我SEO靠我们的逻辑是暂停时我们取消定时器(停止获取)

myVideo.onpause = () => {console.log(pause)clearInterval(inter)inter = null SEO靠我 }

视频时间更新事件函数(ontimeupdate)

这个事件在我们视频播放的时候就会被调用,停止视频后就不会调用

进度条显示 <div class="proessBox"><diSEO靠我v id="proess"></div> </div> //需要获取到的元素(全局常量) const proess = document.getEleSEO靠我mentById(proess) //进度条元素

duration和currentTime的定义

myVideo.ontimeupdate = () => {// console.log(durationSEO靠我:,myVideo.duration)// console.log(currentTime:,myVideo.currentTime)//console.log(myVideo.currentTimeSEO靠我/myVideo.duration)//0.00*****************,所以需要乘100proess.style.width = myVideo.currentTime/myVideo.dSEO靠我uration*100 + % } .proessBox{ /*进度条全貌*/position: absolute;left: 0;top: 520pSEO靠我x;width: 300px;height: 15px;background-color: red;display: flex;z-index: -1;/*最底*/ } SEO靠我 #proess{position: absolute;left: 0;top: 0;height: 100%;background-color: skyblue;z-index: 5;/*比proeSEO靠我ssBox高一些的*/ } 进度条拖拽 //proessBox是进度条的父级 //onmousedown: 鼠标点击事件 SEO靠我 proessBox.onmousedown = (event)=>{// console.log(event:,event.pageX) //关键// console.log(proess.cliSEO靠我entWidth,proess.clientWidth)// console.log(proess.clientHeight:,proess.clientHeight)// console.log(pSEO靠我roessBox.offsetWidth:,proessBox.offsetWidth)// console.log(proessBox.offsetHeight:,proessBox.offsetHSEO靠我eight)// console.log(proessBox:,proessBox.offsetLeft) //0let len = event.pageX - proessBox.offsetLefSEO靠我tlet percent = len / proessBox.offsetWidth;// console.log(percent)proess.style.width = percent * (prSEO靠我oessBox.offsetWidth) - 2 + "px";myVideo.currentTime = percent * myVideo.duration; }

追加: 键盘事件

oSEO靠我nkeydown: 键盘被按下onkeyup: 松开键盘的按键

重点是keyCode

使用的事件是window.onkeyup()

键盘空格键的ascii码

event.keyCode显示是32

if(evenSEO靠我t.keyCode === 32){//空格按下//播放暂停逻辑if(myVideo.paused){myVideo.play()}else {myVideo.pause()} } SEO靠我 键盘左箭头的ascii码

event.keyCode显示是37

逻辑是时间不能小于0和点击键盘的左箭头回退5秒

if(event.keyCode === 37){//左箭头:37let cTSEO靠我ime = JiSuanHMS(myVideo.currentTime)if(myVideo.currentTime < 0){//if(cTime < 0:5){//cTime小于5秒(myVideSEO靠我o.currentTime或者不能小于0)console.log(cTime)return}const returnTime = JiSuanHMS(myVideo.currentTime - 5)cSEO靠我onsole.log(左箭头:,cTime,returnTime:,returnTime)myVideo.currentTime = myVideo.currentTime - 5cTime = JiSEO靠我SuanHMS(myVideo.currentTime) } 键盘右箭头的ascii码

event.keyCode显示是39

逻辑是时间不能大于视频的最大时间和点击键盘的SEO靠我右箭头前进5秒

if(event.keyCode === 39){//右键头:39let cTime = JiSuanHMS(myVideo.currentTime)let allTime = JiSuSEO靠我anHMS(myVideo.duration)if(myVideo.currentTime > myVideo.duration){//大于最大值console.log(cTime:,cTime,alSEO靠我lTime:,allTime)return}const addTime = JiSuanHMS(myVideo.currentTime + 5)console.log(右箭头:,myVideo.curSEO靠我rentTime,addTime:,addTime)myVideo.currentTime = myVideo.currentTime + 5cTime = JiSuanHMS(myVideo.curSEO靠我rentTime) }

完整代码

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8">SEO靠我<meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-widSEO靠我th, initial-scale=1.0"><title>视频</title><link rel="stylesheet" href="index.css" /> </head> SEO靠我 <body><div><video src="http://124.223.18.34:5555/static/video/djsy/djsy1/djsy1_1.mp4" id="myVSEO靠我ideo" onclick="player()"></video><div class="timeStyle"></div><div class="proessBox"><div id="proessSEO靠我"></div></div></div> </body> <script src="index.js"></script> </html> SEO靠我 .proessBox{position: absolute;left: 0;top: 520px;width: 900px;height: 15px;background-color: red;SEO靠我display: flex;z-index: -1; } #proess{position: absolute;left: 0;top: 0;height: 100%;SEO靠我background-color: skyblue;z-index: 5; } const myVideo = document.getElementById("mySEO靠我Video")//video const timeStyle = document.querySelector(".timeStyle")//time const prSEO靠我oessBox = document.querySelector(.proessBox) //进度条元素 const proess = document.getElementById(SEO靠我proess) //进度条元素let inter = null //定时器变量window.onload = () => {// console.log(myVideo) }constSEO靠我 player = () => {if(myVideo.paused){myVideo.play()}else {myVideo.pause()} }//时间格式化函数(自定义) SEO靠我 const JiSuanHMS = (time) => {if(time >= 60 * 60 *60){//h:m:sh = time / 60 / 60^0m = time / 60 SEO靠我% 60^0s = time % 60 % 60^0return h + : + m + : + s}else {//m:sm = time / 60 % 60^0s = time % 60 % 60SEO靠我^0return m + : + s} }//即将播放事件函数 myVideo.oncanplay = () => {const allTime = JiSuanHMSSEO靠我(myVideo.duration)const cTime = JiSuanHMS(myVideo.currentTime)timeStyle.innerHTML = `<div>${cTime}/$SEO靠我{allTime}</div>` }//暂停后将即将播放事件函数 myVideo.onplaying = () => {// console.log(test)// cSEO靠我onsole.log(myVideo.duration) }//播放时事件函数 myVideo.onplay = () => {inter = setInterval(SEO靠我()=>{const allTime = JiSuanHMS(myVideo.duration)const cTime = JiSuanHMS(myVideo.currentTime)timeStylSEO靠我e.innerHTML = `<div>${cTime}/${allTime}</div>`},1000) }//暂定时事件函数 myVideo.onpause = (SEO靠我) => {console.log(pause)clearInterval(inter)inter = null }//视频时间更新事件函数 myVideo.ontimSEO靠我eupdate = () => {// console.log(duration:,myVideo.duration)// console.log(currentTime:,myVideo.curreSEO靠我ntTime)//console.log(myVideo.currentTime/myVideo.duration)//0.00*****************,所以需要乘100proess.stySEO靠我le.width = myVideo.currentTime/myVideo.duration*100 + % }/* proess.onmousemove = function(evSEO靠我ent) {event = event || window.eventconsole.log(clientWidth:,event.clientWidth)console.log(clientHeigSEO靠我ht,event.clientHeight) } */proessBox.onmousedown = (event)=>{// console.log(event:,event.pagSEO靠我eX) //关键// console.log(proess.clientWidth,proess.clientWidth)// console.log(proess.clientHeight:,proSEO靠我ess.clientHeight)// console.log(proessBox.offsetWidth:,proessBox.offsetWidth)// console.log(proessBoSEO靠我x.offsetHeight:,proessBox.offsetHeight)// console.log(proessBox:,proessBox.offsetLeft) //0let len = SEO靠我event.pageX - proessBox.offsetLeftlet percent = len / proessBox.offsetWidth;// console.log(percent)pSEO靠我roess.style.width = percent * (proessBox.offsetWidth) - 2 + "px";myVideo.currentTime = percent * myVSEO靠我ideo.duration; }//定义键盘事件 window.onkeyup = (event) => {console.log(event.keyCode) //按SEO靠我键的ascii码值if(event.keyCode === 32){//空格按下//播放暂停逻辑if(myVideo.paused){myVideo.play()}else {myVideo.pausSEO靠我e()}}if(event.keyCode === 37){//左箭头:37let cTime = JiSuanHMS(myVideo.currentTime)if(myVideo.currentTiSEO靠我me < 0){//小于5秒console.log(cTime)return}const returnTime = JiSuanHMS(myVideo.currentTime - 5)console.SEO靠我log(左箭头:,cTime,returnTime:,returnTime)myVideo.currentTime = myVideo.currentTime - 5cTime = JiSuanHMSSEO靠我(myVideo.currentTime)}if(event.keyCode === 39){//右键头:39let cTime = JiSuanHMS(myVideo.currentTime)letSEO靠我 allTime = JiSuanHMS(myVideo.duration)if(myVideo.currentTime > myVideo.duration){//大于最大值console.log(SEO靠我cTime:,cTime,allTime:,allTime)return}const addTime = JiSuanHMS(myVideo.currentTime + 5)console.log(右SEO靠我箭头:,myVideo.currentTime,addTime:,addTime)myVideo.currentTime = myVideo.currentTime + 5cTime = JiSuanSEO靠我HMS(myVideo.currentTime)}}

目前先到这个定义吧

“SEO靠我”的新闻页面文章、图片、音频、视频等稿件均为自媒体人、第三方机构发布或转载。如稿件涉及版权等问题,请与 我们联系删除或处理,客服邮箱:html5sh@163.com,稿件内容仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同 其观点或证实其内容的真实性。

网站备案号:浙ICP备17034767号-2