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

H5浏览器自定义用户控件——嘿嘿

时间:2023-04-05 14:55:40 HTML5

参考文章:https://css-tricks.com/custom...https://blog.hellojs.org/crea...原生用户控件为但是原生控件往往不能满足我们的一些需求,所以自定义用户控件还是很有必要的。首先声明一个变量,我们定义如下自定义用户控件自定义控件的实现说起来也很简单,只需要用到H5播放器的几个事件和属性:pause和startPause和start是最基本的功能,实现起来也很简单Start:videoElement.play()Pause:videoElement.pause()所以只需要在当前视频暂停的时候调用play()方法就可以继续播放了。同样,在播放视频时调用pause()。里面提到“判断当前视频是否暂停”如果只用videoElement.paused判断视频是否暂停,可能会报错play()请求被pause()调用打断了。经过查询,最终使用isPlaying变量判断视频是否暂停letisPlaying=videoElement.currentTime>0&&!videoElement.paused&&!videoElement.ended&&videoElement.readyState>2;最后暂停/启动事件的方法如下:if(!isPlaying){videoElement.play();}else{videoElement.pause();}返回假;}video当前时长/总时长很容易,只需要使用两个参数;duration可以得到视频的总时长;currentTime可以获取当前视频的时长。视频的总时长可以在视频加载完成后获取一次。当视频进度更新一次时,视频的当前时间需要相应更新。loadedmetadata事件:获取视频元数据。timeupdate事件:视频播放完毕后,更新播放进度的事件。会有明显的进度变化,可以获取到currentTime。值得一提的是,使用duration和currentTime得到的数据格式保留了小数位数和一个以秒为单位的值。通常,需要根据需要进行格式化。我为了把“十分二十四秒”格式化成类似10:24的格式,创建了下面的方法letnumberToTime=function(number){number=parseInt(number,10);让分钟=0;让秒=0;minues=parseInt(number/60,10);second=number%60if(minues<10){minues='0'+minues}if(second<10){second='0'+second}returnminues+':'+second;}而监听对应事件并更新当前时间的代码如下$videoElement.on('loadedmetadata',function(){$('.duration').text(numberToTime(videoElement.duration));});$videoElement.on('timeupdate',function(){$('.current').text(numberToTime(videoElement.currentTime));});00:00/00:00</div>进度条没有进度条的视频不是好视频。实现一个进度条是非常重要的。重要声明:这里进度条的样式是bootstrapdom的样式。dom结构如下

有两个栏,一个是当前进度,另一个是缓冲进度。基本原理也很简单,获取当前时间/总时长*100%的值,然后将这个值赋值给进度条对应dom样式中的'width',通过timeupdate事件不断更新。$videoElement.on('timeupdate',function(){letcurrentPos=videoElement.currentTime;letmaxduration=videoElement.duration;letpercentage=100*currentPos/maxduration;$('.progress-bar-primary').css('width',percentage+'%');})缓冲进度条和上面的实现基本一样,上面对应的currentPos值是让currentBuffer=videoElement.buffered.end(0)进度条不仅要既能看到进度,又能拖动进度的思路是根据鼠标在mousedown事件和mouseup中X坐标(包括正负)的变化来判断当前进度的变化程度进度条上的事件。具体代码如下:lettimeDrag=false;/*拖动状态*/$('.progress').mousedown(function(e){timeDrag=true;updatebar(e.pageX);});$(document).mouseup(function(e){if(timeDrag){timeDrag=false;updatebar(e.pageX);}});$(document).mousemove(function(e){if(timeDrag){updatebar(e.pageX);}});letupdatebar=function(x){letprogress=$('.progress');让maxduration=videoElement.duration;//总视频时长letposition=x-progress.offset().left;//Variationletpercentage=100*position/progress.width();//超出范围校正if(percentage>100){percentage=100;}如果(百分比<0){百分比=0;}//更新进度条和当前时间$('progress-bar').css('width',percentage+'%');videoElement.currentTime=maxduration*percentage/100;};音量控制很容易,主要有以下几个方法和属性,具体的交互可以根据需要实现。之前看过一篇介绍疯狂音量键的文章,大家可以学学[滑稽]:http://adquan.com/post-10-410...videoElement.muted=true//MutevideoElement.muted=false//取消静音videoElement.volume=1//设置音量最大videoElement.volume=0.5//设置音量为50%videoElement.volume=0//设置音量最小Fullscreen全屏有点麻烦要兼容的功能。如果要写一个firefox的用户控件,调用全屏api的必须是
//全屏函数fullScreenOn(element){if(element.requestFullscreen){element.requestFullscreen();}elseif(element.mozRequestFullscreen){$('.live__player')[0].mozRequestFullScreen();}elseif(element.msRequestFullscreen){element.msRequestFullscreen();}elseif(element.oRequestFullscreen){element.oRequestFullscreen();}elseif(element.webkitRequestFullscreen){element.webkitRequestFullscreen();}else{vardocHtml=document.documentElement;vardocBody=document.body;varvideobox=document.get(sfLive');varcssText='width:100%;height:100%;overflow:hidden;';docHtml.style.cssText=cssText;docBody.style.cssText=cssText;videobox.style.cssText=cssText+';'+'边距:0px;填充:0px;';文档.IsFullScreen=true;}$controls.css('z-index','2147483647');}这里传入的值是videoElement`(videoElement=document.getElementById('video');)`还有一点,最后一行代码做的是:把我们的自定义控件之所以z-index属性设置为浏览器的最大值是当webkit内核浏览器全屏时,视频的z-index变成浏览器允许的最大值,我们也设置了z-index的将自定义控件调到最大值,防止用户控件被视频遮挡。同样,退出全屏模式的代码如下:}elseif(document.msExitFullscreen){document.msExitFullscreen();}elseif(document.mozCancelFullscreen){document.mozCancelFullScreen();}elseif(document.oRequestFullscreen){document.oCancelFullScreen();}elseif(document.webkitExitFullscreen){document.webkitExitFullscreen();=文档.正文;varvideobox=document.getElementById('sfLive');docHtml.style.cssText="";docBody.style.cssText="";videobox.style.cssText="";文档.IsFullScreen=false;}$('.live__playcontrol').css('z-index','1');}检查视频是否全屏的代码如下:letisFullScreen=document.fullscreenElement||文档.webkitFullscreenElement||文档.mozFullScreenElement||document.msFullscreenElement文中写了判断视频开始/暂停的依据,代码如下letisPlaying=videoElement.currentTime>0&&!videoElement.paused&&!videoElement.ended&&videoElement.readyState>2;firefox全屏后,自定义的用户控件不见了。文章里已经写过了。与其他浏览器不同的是,firefox并没有使用`