从零实现一个自定义html5播放器的示例代码


Posted in HTML / CSS onAugust 01, 2017

本次的分享是一个基于HTML5标签实现的一个自定义视频播放器。其中实现了播放暂停、进度拖拽、音量控制及全屏等功能。

效果预览

从零实现一个自定义html5播放器的示例代码

点我查看 源码仓库 。

核心思路

我相信一定会有些没有接触过制作自定义播放器的童鞋对于 标签的认识会停留在此。

<video controls="controls" autoplay="autoplay">
  <source src="movie.ogg" type="video/ogg" />
</video>

其中controls属性经过设定,会在界面中显示一个浏览器自带的控制条。如果对于UI没有要求的需求,其内置控制器已经可以满足大部分的需求。当然了如果是这样你们也不会看到这篇分享了=。=

隐藏控制条并模拟

那么实现一个自定义功能的播放器关键就在于,我们不使用原生的控制器,将其隐藏掉之后,在下方同样的位置通过html、css来模拟所需样式,同时通过js来调用vedio标签所暴露给我们的接口函数及属性,以及检测用户的操作行为来同步的模拟UI与视频播放数据的相应变化。

几个核心函数及属性的用法

myVid=document.getElementById("video1");
//控制视频开关
myVid.play() //播放
myVid.pause() //暂停
//模拟视频进度条
myVid.currentTime=5; //返回或设定当前视频播放位置
myVid.duration // 返回视频总长度
//模拟视频音量
myVid.volume //音量
//获取视频当前状态后判断何时从loading切换为播放
myVid.readyState
//0 = HAVE_NOTHING - 没有关于音频/视频是否就绪的信息
//1 = HAVE_METADATA - 关于音频/视频就绪的元数据
//2 = HAVE_CURRENT_DATA - 关于当前播放位置的数据是可用的,但没有足够的数据来播放下一帧/毫秒
//3 = HAVE_FUTURE_DATA - 当前及至少下一帧的数据是可用的
//4 = HAVE_ENOUGH_DATA - 可用数据足以开始播放

在所有实现中的关键点,较为繁琐的是对于进度条的模拟。其中使用了video标签中的currentTime以及duration属性,通过当前播放时间与总播放时间的比值,就可以计算出进度条相对于总长的位置。同时用户通过拖拽进度条所最后设置的长度也可以用来反向推算出此时视频应该播放的位置。

拖拽代码思路

//核心代码示例
var dragDis = 0
var processWidth = xxx //拖拽条总长
$('body').mousedown(function(e) {
    startX = e.clientX
    dragDis = startX - leftInit //leftInit为拖拽条起始点巨屏幕左侧的距离
    dragTarget.css({ //拖拽按钮
        left: dragDis
    })
    dragProcess.css({ //进度条(蓝色进度条)
        width: dragDis
    }) // 令进度条和拖拽按钮渲染在同一位置
    videoSource.pause()
}).mousemove(function(e) {
    moveX = e.clientX
    disX = moveX - startX
    var left = dragDis + disX
    if(left > processWidth) {
        left = processWidth
    } else if(left < 0) {
        left = 0
    }
    dragTarget.css({
        left: left
    })
    dragProcess.css({
        width: left
    })
}).mouseup(function(e) {
    videoSource.play()
    videoSource.currentTime = $('蓝色拖拽条').width() / processWidth * duration //拖拽后计算视频的正确播放位置
})

同理音量的控制与其上行为基本一致,故在源码中作者将音量与进度部分通过不同元素进行判断是进行进度还是音量的拖拽控制。

通过查询视频流状态控制播放前的加载动画

function ifState() {
    var state = videoSource.readyState
    if(state === 4) { //状态为4即可播放
        videoPlayer()
    } else {
        $('.play-sym-wrapper').remove()
        $('body').append('<div class="play-sym-wrapper"><img class="play-sym" src="./images/loading.gif"></div>')
        //添加loading动画
        setTimeout(ifState, 10)
    }
}
setTimeout(ifState, 10)

核心的控制部分已经说完了,有兴趣的同学可以去源码的html中点击播放,其中被迫有很多零碎的需求,比如点击暂停,保存音量等等。整个视频播放器的基础功能实现的还算完善。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
css3个性化字体_动力节点Java学院整理
Jul 12 HTML / CSS
详解css3 object-fit属性
Jul 27 HTML / CSS
CSS3 transform的skew属性值图文详解
Jul 21 HTML / CSS
IE浏览器单独写CSS样式的几种方法
Oct 14 HTML / CSS
CSS3属性box-sizing使用指南
Dec 09 HTML / CSS
html5中canvas学习笔记2-判断浏览器是否支持canvas
Jan 06 HTML / CSS
HTML5 Web Workers之网站也能多线程的实现
Apr 24 HTML / CSS
使用HTML5技术开发一个属于自己的超酷颜色选择器
Sep 22 HTML / CSS
HTML5新增加标签和功能概述
Sep 05 HTML / CSS
HTML5 LocalStorage 本地存储详细概括(多图)
Aug 18 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
Aug 01 HTML / CSS
CSS 新特性 contain控制页面的重绘与重排问题
Apr 30 HTML / CSS
浅谈HTML5 服务器推送事件(Server-sent Events)
Aug 01 #HTML / CSS
基于HTML5陀螺仪实现ofo首页眼睛移动效果的示例
Jul 31 #HTML / CSS
html5教你做炫酷的碎片式图片切换 (canvas)
Jul 28 #HTML / CSS
H5 canvas实现贪吃蛇小游戏
Jul 28 #HTML / CSS
LocalStorage记住用户和密码功能
Jul 24 #HTML / CSS
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
Jul 24 #HTML / CSS
H5调用相机拍照并压缩图片的实例代码
Jul 20 #HTML / CSS
You might like
《PHP边学边教》(01.开篇――准备工作)
2006/12/13 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
Thinkphp5.0框架视图view的循环标签用法示例
2019/10/12 PHP
Javascript Math ceil()、floor()、round()三个函数的区别
2010/03/09 Javascript
ExtJs grid行 右键菜单的两种方法
2010/06/19 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
jQuery validate插件submitHandler提交导致死循环解决方法
2016/01/21 Javascript
用move.js库实现百叶窗特效
2017/02/08 Javascript
node.js中express中间件body-parser的介绍与用法详解
2017/05/23 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
Js中将Long转换成日期格式的实现方法
2018/06/05 Javascript
JS实现图片切换效果
2018/11/17 Javascript
微信小程序+腾讯地图开发实现路径规划绘制
2019/05/22 Javascript
在LayUI图片上传中,解决由跨域问题引起的请求接口错误的方法
2019/09/24 Javascript
javascript设计模式 ? 建造者模式原理与应用实例分析
2020/04/10 Javascript
javascript实现前端分页功能
2020/11/26 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
Python 通过pip安装Django详细介绍
2017/04/28 Python
深入浅析python 中的匿名函数
2018/05/21 Python
详解10个可以快速用Python进行数据分析的小技巧
2019/06/24 Python
对python 中class与变量的使用方法详解
2019/06/26 Python
python面向对象 反射原理解析
2019/08/12 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
Django调用支付宝接口代码实例详解
2020/04/04 Python
python中元组的用法整理
2020/06/15 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
使用Python实现NBA球员数据查询小程序功能
2020/11/09 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
大学生村官典型材料
2014/01/12 职场文书
爱心捐书倡议书
2015/04/27 职场文书
2016党员入党决心书
2015/09/22 职场文书
靠谱准确的求职信
2019/04/02 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
SQL基础的查询语句
2021/11/11 MySQL
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers