利用html5 video打造播放器(二)

有了video的基本知识(利用html5 video打造播放器(一)),接下来我们要量身定做播放器了。


那么我们的这个播放器要有什么功能呢?

1、自定义播放按钮

2、自定义的进度条,能够显示视频总时间,当前播放了多长时间

3、点击播放按钮,视频开始播放,按钮消失,进度条逐渐消失

4、点击视频,可以切换播放/暂停状态;如果切换为暂停,则播放按钮和进度条重新显示

5、全屏播放

6、手势拨动前进、快退

7、重力感应


下面开始:

(1)新建video-demo.html文件:

<div class="my-video">
    <!-- webkit-playsinline : 在ios中,加入此属性,可以关闭自动全屏播放 -->
    <!-- object-fit:fill : 视频充满video容器的大小 -->
    <video class="" style="" id="video1">
        <source src="2.mp4" type="video/mp4">
        <source src="2.ogg" type="video/ogg"> 设备不支持Video标签。
    </video>
</div>

(2)然后新建video-demo.css文件设置样式:

html, body{
      height: 100%;
}
.my-video{
      position: relative;
      background: black;
}

.my-video video {
      width: 100%;
      height: 100%;
      display: block;
      onject-fit: fill;
}

并在video-demo.html里引入该css文件:

<link rel="stylesheet" type="text/css" href="css/video-demo.css">

此时,应该能看到页面了。

(3)接下来我们要用到mui框架,所以需要在video-demo.html引入mui对应的js文件

<script type="text/javascript" src="js/mui.min.js"></script>

(4)下面我们新建video-demo.js文件,动态添加播放按钮和进度条,记得把该js文件引入到html里:

<script type="text/javascript" src="js/video-demo.js"></script>

(5)在video-demo.js里,我们先写上整体结构:

(function($) {
    var myVideo = function(dom) {
        var that = this;
        $.ready(function() {
            that.video = document.querySelector(dom || 'video');
            that.vRoom = that.video.parentNode;
            // 元素初始化
            that.initEm();
            // 事件初始化
            that.initEvent();
            //  记录信息
            that.initInfo();
        });
    }
    var nv = null;
    $.myVideo = function(dom) {
        return nv || (nv = new myVideo(dom));
    }
}(mui))

其中,

initEm是用于初始化元素,即动态添加播放按钮和控制条;

initEvent是用于放置我们需要的事件函数;

initInfo是用于处理相关信息,比如视频的元数据,小屏、全屏时对应的信息。

然后如果要使用myVideo对应的这些函数,就要在html里加入调用:

<script type="text/javascript">
  var v = mui.myVideo();
</script>

(6)接下来我们首先填充initEm()函数

var pro = myVideo.prototype;

pro.initEm = function() {
    // 动态添加播放按钮
    this.vimg = document.createElement("img");
    // 如果img的src设置为本地资源的话,那么以后使用会出现很多问题,比如,页面层级发生变化时,你要去修改video-demo.js,为避免夜长梦多,我们将图片转换为base64 
    // this.vimg.src = "img/play.png";
    // 以下就是base64编码,可以网上搜索在线转换工具,这里就没写上编码,太长了
    this.vimg.src = 'data:image/png;base64...';
    this.vimg.className = 'play-img';
    this.vRoom.appendChild(this.vimg);

    // 动态添加控制条
    this.vControls = document.createElement('div');
    this.vControls.classList.add('controls');
    this.vControls.innerHTML = '<div><div class="progressBar"><div class="timeBar"></div></div></div><div><span class="current">00:00</span>/<span class="duration">00:00</span></div><div><span class="fill">全屏</span></div>';
    this.vRoom.appendChild(this.vControls);
}

此时应该能看到播放按钮和控制条了,只是样式不对。

(7)接下来我们设置播放按钮的样式

.my-video .play-img{
  position: absolute;
  width: 15%;
  z-index: 99;
  left: 50%;
  top: 50%;
  transform: translateX(-50%) translateY(-50%)
}

(8)然后设置控制条的样式

.my-video .controls{
  width: 100%;
  height: 2rem;
  line-height: 2rem;
  font-size: 0.8rem;
  color: white;
  position: absolute;
  bottom:0;
  background: rgba(0, 0, 0, .55);
  display: flex;
}

.my-video .controls > * {
  flex: 1;
}

.my-video .controls > *:nth-child(1) {
  flex: 6;
}
.my-video .controls > *:nth-child(2) {
  flex: 2;
}

.my-video .controls .progressBar{
  margin: 0.75rem 5%;
  position: relative;
  width: 90%;
  height: 0.5rem;
  background: rgba(200, 200, 200, .55);
  border-radius: 10px;
}

.my-video .controls .timeBar {
    position: absolute;
    top: 0;
    left: 0;
    width: 0;
    height: 100%;
    background-color: rgba(99, 110, 225, .85);
    border-radius: 10px;
}

此时应该能看到这样了:
detail

至此,我们的基本样式已经搞定了,下面就是一些事件了。