h5自定义播放器得实现原理
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <!--插入播放按钮得文字图标格式(具体使用方法可以百度http://fontawesome.dashgame.com/)--> <link rel="stylesheet" href="../css/font-awesome.css"> <!--页面结构设置得样式--> <style> body { padding: 0; margin: 0; font-family: 'microsoft yahei', 'Helvetica', simhei, simsun, sans-serif; background-color: #F7F7F7; } a { text-decoration: none; } .playerTitle{ width:100%; margin: 0 auto; line-height:100px; font-size: 40px; text-align: center; } .player{ width: 720px; height: 360px; margin: 0 auto; background: url("../images/loading.gif") center no-repeat; background-size: cover; position: relative; } video{ height:100%; margin: 0 auto; display: none; } .controls { width: 720px; height: 40px; position: absolute; left: 0px; bottom: -40px; background-color: #000; } .controls > .switch{ width: 20px; height: 20px; display: block; font-size: 20px; color: #fff; position: absolute; left: 10px; top: 10px; } .controls > .expand{ width: 20px; height: 20px; display: block; font-size: 20px; color: #fff; position: absolute; right: 10px; top: 10px; } .controls > .progress{ width: 430px; height: 10px; position: absolute; left:40px; bottom:15px; background-color: #555; } .controls > .progress > .bar{ width:100%; height:100%; border-radius: 3px; cursor: pointer; position: absolute; left: 0; top: 0; opacity: 0; z-index: 999; } .controls > .progress > .loaded{ width:60%; height:100%; background-color: #999; border-radius: 3px; position: absolute; left: 0; top: 0; z-index: 2; } .controls > .progress > .elapse{ width:0%; height:100%; background-color: #fff; border-radius: 3px; position: absolute; left: 0; top: 0; z-index: 3; } .controls > .time{ height: 20px; position: absolute; left:490px; top: 10px; color: #fff; font-size: 14px; } </style> </head> <body> <h3 class="playerTitle">视频播放器</h3> <div class="player"> <video src="../mp4/chrome.mp4"></video> <div class="controls"> <!--javascript:; a链接点击不让跳转 fa 库名fa-play 文字名 文字库使用方法--> <a href="javascript:;" class="switch fa fa-play"></a> <a href="javascript:;" class="expand fa fa-expand"></a> <div class="progress"> <!--点击的透明层,效果是点击改变进度条和播放得当前时间--> <div class="bar"></div> <!--缓冲进度条(由于是本地视频加载比较快所以就没法感受到没写0.0)--> <div class="loaded"></div> <!--播放进度条--> <div class="elapse"></div> </div> <div class="time"> <!--播放当前时间--> <span class="currentTime">00:00:00</span> \ <!--视频时间总长度--> <span class="totalTime">00:00:00</span> </div> </div> </div> <!--基于jquery的文件引入--> <script src="./jquery.min.js"></script> <script> /*通过jq来实现功能*/ $(function(){ /*1.获取播放器 对象的转换,把jquery转换为dom对象*/ var video=$("video")[0]; /*2.实现播放与暂停*/ $(".switch").click(function(){ /*实现播放与暂停的切换:如果是暂停>>播放 ,如果是播放 >> 暂停*/ if(video.paused){ video.play(); /*移除暂停样式,添加播放样式*/ } else{ video.pause(); /*移除播放样式,添加暂停样式*/ } /*设置标签的样式 fa-pause:暂停 fa-play:播放*/ $(this).toggleClass("fa-play fa-pause"); }); /*3.实现全屏操作*/ $(".expand").click(function(){ /*全屏>>不同浏览器需要添加不同的前缀>>能力测试*/ if(video.requestFullScreen){ video.requestFullScreen(); } else if(video.webkitRequestFullScreen){ video.webkitRequestFullScreen(); } else if(video.mozRequestFullScreen){ video.mozRequestFullScreen(); } else if(video.msRequestFullScreen){ video.msRequestFullScreen(); } }); /*4.实现播放业务逻辑:当视频文件可以播放时触发下面的事件*/ video.oncanplay=function(){ setTimeout(function(){ /*1.将视频文件设置为显示*/ video.style.display="block"; /*2.获取当前视频文件的总时长(以秒做为单位,同时获取了小数值),计算出时分秒*/ var total=video.duration; //01:01:40 00:00:36 /*3.计算时分少 60*60=3600 * 3700:3700/3600 * 3700:3700%3600 >> 100 /60*/ /*var hour=Math.floor(total/3600); /!*补0操作*!/ hour=hour<10?"0"+hour:hour; var minute=Math.floor(total%3600/60); minute=minute<10?"0"+minute:minute; var second=Math.floor(total%60); second=second<10?"0"+second:second;*/ var result=getResult(total) /*4.将计算结果展示在指定的dom元素中*/ $(".totalTime").html(result); },2000); } /*通过总时长计算出时分秒*/ function getResult(time){ var hour=Math.floor(time/3600); /*补0操作*/ hour=hour<10?"0"+hour:hour; var minute=Math.floor(time%3600/60); minute=minute<10?"0"+minute:minute; var second=Math.floor(time%60); second=second<10?"0"+second:second; /*返回结果*/ return hour+":"+minute+":"+second; } /*5.实现播放过程中的业务逻辑,当视频播放时会触发ontimeupdate事件 * 如果修改currentTime值也会触发这个事件,说白了,只要currenTime值变化,就会触发这个事件*/ video.ontimeupdate=function(){ /*1.获取当前的播放时间*/ var current=video.currentTime; /*2.计算出时分秒*/ var result=getResult(current); /*3.将结果展示在指定的dom元素中*/ $(".currentTime").html(result); /*4.设置当前播放进度条样式 0.12>>0.12*100=12+%>12%*/ var percent=current/video.duration*100+"%"; $(".elapse").css("width",percent); } /*6.实现视频的跳播*/ $(".bar").click(function(e){ /*1.获取当前鼠标相对于父元素的left值--偏移值*/ var offset= e.offsetX; /*2.计算偏移值相对总父元素总宽度的比例*/ var percent=offset/$(this).width(); /*3.计算这个位置对应的视频进度值*/ var current=percent*video.duration; /*4.设置当前视频的currentTime*/ video.currentTime=current; }); /*7.播放完毕之后,重置播放器的状态*/ video.onended=function(){ // 当前播放时间清零 video.currentTime=0; // 播放按钮的事件由暂停替换位播放 $(".switch").removeClass("fa-pause").addClass("fa-play"); } }); </script> </body> </html>
h5自定义播放器得实现原理的更多相关文章
- 从零开始学 Web 之 HTML5(四)拖拽接口,Web存储,自定义播放器
大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...
- 基于 AVPlayer 自定义播放器
如果我只是简单的播放一个视频,而不需要考虑播放器的界面.iOS9.0 之前使用 MPMoviePlayerController, 或者内部自带一个 view 的 MPMoviePlayerViewCo ...
- 使用html5中video自定义播放器必备知识点总结以及JS全屏API介绍
一.video的js知识点: controls(控制器).autoplay(自动播放).loop(循环)==video默认的: 自定义播放器中一些JS中提供的方法和属性的记录: 1.play()控制视 ...
- 视频播放—— H5同层播放器接入规范
H5同层播放器接入规范 x5-video-player-type 启用H5同层播放器 通过video属性“x5-video-player-type”声明启用同层H5播放器 x5-video-playe ...
- 用H5和js写一个移动端自定义播放器
前言 由于html5自带的播放器样式不怎么好看,大多数人都是自己写一个来满足业务需求.这一次的需求如下: 1.不要上一曲下一曲 2.有进度条和播放暂停按钮 3.有时间显示 demo实现功能 1.进度条 ...
- 自制 h5 音乐播放器 可搜索
闲言碎语: 有好几天没有发表博客了,这也是因为一直开发音乐和完善我的博客项目,好不容易抽出时间总结一下这几天所做的东西,笔试又不断通知,实则匆忙 今天难得逃了一次课,就趁这时间,该写写就写写吧~~ 进 ...
- H5音乐播放器源码地址
源码获取 https://pan.baidu.com/s/1pR_bhIFFQWU6TK9ZvrRWIA 安卓安装包下载地址 https://pan.baidu.com/s/1Z8HF5LY ...
- H5音乐播放器源码共享
由于博客云后台管理工具写起东西来实在难受,所以直接共享源码了! https://pan.baidu.com/s/1XeRxlk7iv5qt1f16s64F9w H5源码!暂时只支持手机适配,电脑端 ...
- H5音乐播放器
前段时间无聊用JavaScript基于H5的audio写一个音乐播放器.误喷,技术有限,文笔不好之处希望各位大神海涵. 1.HTML代码: <div id="music" c ...
随机推荐
- 一文读懂所有的编码方式(UTF-8、GBK、Unicode、宽字节...)
编码方式就分两类:ANSI编码.Unicode编码.这两类编码都兼容ASC码. ------------------------------------------------------------ ...
- Prototype Chain
参考资料: <javascript权威指南 第六版> <javascript高级程序设计 第二版> 写在前面的话 所谓的原型链就是一个一个的对象通过其__proto__属性连接 ...
- windows cmd 看服务cpu、内存
开始菜单-运行-cmd-输入systeminfo-回车 不用命令从以下两个地方都可以看出CPU个数 使用命令看CPU 利用win+r键打开运行,输入cmd回车即会出现 查看cpu信息 通过上图可以看出 ...
- Swift中的参数内部名称和外部名称
1.什么是参数的内部名称和外部名称? struct Color { let red, green, blue: Double init(red redColor: Double,green green ...
- BZOJ1206:[HNOI2005]虚拟内存
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- bzoj 4815 小Q的表格 —— 反演+分块
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4815 思路就和这里一样:https://blog.csdn.net/leolyun/arti ...
- 为什么对象序列化要定义serialVersionUID
对于实现了java.io.Serializable接口的实体类来说,往往都会手动声明serialVersionUID,因为只要你实现了序列化,java自己就会默认给实体类加上一个serialVersi ...
- B+树索引和哈希索引的明显区别是:
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值:当然了,这个前提是,键值都是唯一的.如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到 ...
- C#中如何设置日期格式
在C#中,ToShortDateString()是用于显示短日期格式的方法,如果使用下面的语句: Label1.Text = DateTime.Now.ToShortDateString(); 那么, ...
- Bellman-Ford算法及其队列优化(SPFA)
一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...