当前位置: 首页 > Web前端 > CSS

实现H5视频播放器的部分播放控件

时间:2023-03-31 12:26:54 CSS

GitHub链接:https://github.com/cyjsysu/H5_video_player1。为什么我上学期(2019年底)写了玩家的数据库作业,本来是为了做一个简单的视频网站。但是看了网上的一些相关内容,感觉自己不懂JS,无法自定义样式。所以我放弃了原来的计划,改做音乐网站。现在有了一定的JS基础,又把之前的思路拿出来了。本文相当于粗略的实验报告。(小项目中使用的图标均来自百度图片)2.效果图3.自定义控件如果在html中设置video的controls属性,浏览器会显示其自带的对应控件。一开始以为自定义控件是通过设置controls属性来实现的。但是后来看了B站播放页面的HTML,发现B站的控件都是DIV标签。后来才知道这些控件是独立于HTML中的video标签的,只是通过JS来控制video。4.视频播放和暂停4.1需要点击播放窗口和播放按钮来控制视频的播放或在暂停状态下暂停播放按钮图标,否则为两条竖线(Video.paused)到相反的状态,并改变图标。Video对象属性请参考https://www.runoob.com/jsref/dom-obj-video.html。这些属性在这个小项目中会用的比较多。functionplayOrPause(){varoPlayer=document.getElementById("player");//videoletoPlayerBtn=document.getElementById("playerBtn");//播放按钮if(oPlayer.paused==true){oPlayer.play();oPlayerBtn.src="./img/pause1.png";}else{oPlayer.pause();oPlayerBtn.src="./img/on1.png";}}5.进度条5.1要求通过进度条实时显示当前视频的播放进度和缓冲进度播放进度为蓝色,在最上面;缓冲进度为浅灰色,在底部(模仿B站)。可以通过拖动进度条来调整播放位置。播放时间显示在进度条旁边。5.2实现5.2.1进度条的显示。之前看过一篇类似的博客(基本上只做了播放器控件的外观)。文章中的进度条是一个标签,导致我误导了一段时间。后来又看了看B站的HTML才找到方向。这里的自定义进度条其实就是一个div。呈现条是因为属性height设置的很小,背景色设置为进度条。我分别写了三个这样的div。一个是深灰色的,作为进度条的背景,另外两个div在里面分别设置完整。另外两个中的一个是浅灰色的,作为缓冲条;另一个是蓝色的,作为播放进度条。另外,在播放进度条的最后设置一个div作为拖拽按钮。

5.2.2拖动进度条是用JS实现的,鼠标点击进度条触发。按住鼠标的同时移动鼠标,会使播放进度条的终点与鼠标的横坐标相同(不能超过整个进度条),并通过计算更新视频的currentTime属性。因为代码中多处使用了document.onmousemove,所以没有直接绑定函数,而是使用了事件监听。functiondragProgress(){varoControlBar=document.getElementById("controlBar");oControlBar.onmousedown=function(evt){vare=evt||窗口事件;如果(e.button==0){leftX=getOffsetX(oControlBar);rightX=leftX+parseInt(getComputedStyle(oControlBar)["width"]);document.addEventListener("mousemove",toDragProgress);}};document.addEventListener("mouseup",function(){document.removeEventListener("mousemove",toDragProgress);})}functiontoDragProgress(evt){vare=evt||窗口事件;varbuttonX=e.pageX;如果(按钮X<左X)按钮X=左X;如果(按钮X>右X)按钮X=右X;varprog=(buttonX-leftX)/(rightX-leftX);//console.log(prog);setProgress(prog);}5.2.3实时显示进度和时间是用定时器实现的,每秒执行一次。functionupdateProgressBar(){varoPlayer=document.getElementById("播放器");varoPlayerBar=document.getElementById("playerBar");varoBufferBar=document.getElementById("bufferBar");varoBarButton=document.getElementById("barButton");varoShowTime=document.getElementById("showTime");varcTime=oPlayer.currentTime;vardTime=oPlayer.duration;varplayerProgress=cTime/dTime*100;oPlayerBar.style.width=playerProgress+"%";oBarButton.style.left=playerProgress+"%";if(player.buffered.length){varbTime=oPlayer.buffered.end(0);varbufferProgress=bTime/dTime*100;oBufferBar.style.width=bufferProgress+"%";}//duration是一个全局变量if(duration==0)duration=getTime(oPlayer.duration);varcurrentTime=getTime(oPlayer.currentTime);oShowTime.innerText=currentTime+"/"+duration;}setInterval("updateProgressBar()",1000);//每秒6.音量6.1要求音量控制的外观也是参考B站效果制作的(我的没有音量百分比)。通常,播放器只有底部的音量图标,当鼠标移动到它时会显示音量控制条(display:block;)。当鼠标移出一段时间后,音量控制条消失(display:none;)。单击音量按钮可静音,图标变为带有“X”的扬声器。然后在静音后点击音量键,音量会恢复到静音前的值。6.2实现6.2.1显示和隐藏用于设置控件条图标上的鼠标悬停事件。当鼠标在这个div和子节点的div中时,去除用于隐藏控制条和显示音量条的延迟器。这里需要计算音量条的位置,使音量条在音量图标的正上方,而不是靠近它。当鼠标移出时,设置一个延时器,一段时间后隐藏音量条。varhideVol=null;//隐藏音量条事件//显示音量条oControlVol.onmouseover=function(){clearTimeout(hideVol);//只要鼠标在音量框内,音量框就不会隐藏//设置音量图标和音量条分开,计算音量条框的位置vartarX=oControlVol.offsetLeft+(parseInt(getComputedStyle(oControlVol)["width"])-parseInt(getComputedStyle(oVolFrame)["width"]))/2;vartarY=oControlVol.offsetTop-parseInt(getComputedStyle(oVolFrame)["height"])-20;oVolFrame.style.left=tarX+"px";oVolFrame.style.top=tarY+"px";oVolFrame.style.display="方块";};//隐藏音量条oControlVol.onmouseout=function(){hideVol=setTimeout(function(){varoVolFrame=document.getElementById("volumeFrame");oVolFrame.style.display="none";},600);};6.2.2拖动音量条的实现过程与视频进度条类似。7、全屏7.1要求点击全屏图标进入全屏,再次点击退出全屏进入全屏不显示浏览器自带的播放控件,而是显示自带控件。进入全屏后,当鼠标移动或鼠标在播放控件上时,控件可以一直显示;否则隐藏控件。进入全屏前,控件在视频下方,除了音量条外,两者不重叠。但是进入全屏后,需要控件和视频重叠显示在视频底部,并且有一定的透明度。7.2实现7.2.1进入和退出全屏,完整说明请参考https://www.jianshu.com/p/54729c73686a。7.2.2控件全屏显示如果