你是否有一个梦想?用JavaScript开发一款自定义配置视频播放器

[[358845]]

前言

沉寂了一周了,打算把这几天的结果呈现给大家。这几天抽空就一直在搞一个自定义视频播放器,为什么会有如此想法?是因为之前看一些学习视频网站时,看到它们做的视频播放器非常Nice!于是,就打算抽空开发一款属于自己的视频播放器。话不多说,一起来实战吧!

项目展示

(这只是一张图片哦~)

这张图就是我们的成品,还等什么?赶紧来实战吧!

实战

我会把完整源码放在github上,欢迎来star,地址在文末。

首先,我们会使用最原生的JavaScript来实现,老大哥肯定要打头阵啊!

一、JavaScript

1.iconfont.css:阿里字体图标文件,你可以在上面找到很多漂亮的图标。

2.index.css:项目样式文件。

3.index.js:项目逻辑文件。

 
 
 
 
  1.  
  2.  
  3.    
  4.      
  5.      
  6.     VamVideo(原生js版) 
  7.      
  8.      
  9.    
  10.    
  11.      
  12.        
  13.         
  14.           src="https://mos-vod-drcn.dbankcdn.cn/P_VT/video_injection/A91343E9D/v3/9AB0A7921049102362779584128/MP4Mix_H.264_1920x1080_6000_HEAAC1_PVC_NoCut.mp4" 
  15.         /> 
  16.          
  17.        
  18.        
  19.          
  20.           
 
  •           
  •  
  •         
  •  
  •          
  •            
  •              
  •                
  •                
  •              
  •              
  •               00:00:00 
  •               / 
  •               00:00:00 
  •              
  •            
  •            
  •              
  •                
  •                 

     
  •                 

     
  •                
  •                
  •                  
  •                  
  •                
  •              
  •              
  •               1x

     
  •                
  •                 
  • 0.5x
  •  
  •                 
  • 1x
  •  
  •                 
  • 1.25x
  •  
  •                 
  • 1.5x
  •  
  •                 
  • 2x
  •  
  •                
  •              
  •              
  •                
  •                
  •              
  •            
  •          
  •        
  •      
  •      
  •    
  •  
  •  我们主要看下逻辑文件index.js。

     
     
     
     
    1. let timer = null; 
    2. let disX = 0; 
    3. let disL = 0; 
    4. function $(el) { 
    5.   return document.querySelector(el); 
    6. function showEl(el) { 
    7.   $(el).style.display = "block"; 
    8. function hideEl(el) { 
    9.   $(el).style.display = "none"; 
    10. function setVp(w, h) { 
    11.   $(".video-player").style.width = w + "px"; 
    12.   $(".video-player").style.height = h + "px"; 
    13.   $(".video-box").style.width = w + "px"; 
    14.   $(".video-box").style.height = h + "px"; 
    15.   $(".pv-bar").style.width = w + "px"; 
    16. // 时间格式化 
    17. function changeTime(iNum) { 
    18.   let iN = parseInt(iNum); 
    19.   const iH = toZero(Math.floor(iN / 3600)); 
    20.   const iM = toZero(Math.floor((iN % 3600) / 60)); 
    21.   const iS = toZero(Math.floor(iN % 60)); 
    22.   return iH + ":" + iM + ":" + iS; 
    23. // 整0处理 
    24. function toZero(num) { 
    25.   if (num <= 9) { 
    26.     return "0" + num; 
    27.   } else { 
    28.     return "" + num; 
    29.   } 
    30. // 底部控制栏 
    31. $(".video-box").onmouseenter = function () { 
    32.   $(".bottom-tool").style.bottom = "0px"; 
    33. }; 
    34. $(".video-box").onmouseleave = function () { 
    35.   $(".bottom-tool").style.bottom = "-45px"; 
    36. }; 
    37.  
    38. // 倍速播放栏(显示/隐藏) 
    39. $(".pv-spnum").onmouseover = function () { 
    40.   showEl(".selectList"); 
    41. }; 
    42. $(".pv-controls").onmouseleave = function () { 
    43.   hideEl(".selectList"); 
    44. }; 
    45.  
    46. // 播放/暂停 
    47. $(".play-btn").onclick = function () { 
    48.   if ($(".video-player").paused) { 
    49.     $(".video-player").play(); 
    50.     hideEl(".icon-bofang"); 
    51.     showEl(".icon-zanting"); 
    52.     nowTime(); 
    53.     timer = setInterval(nowTime, 1000); 
    54.   } else { 
    55.     $(".video-player").pause(); 
    56.     showEl(".icon-bofang"); 
    57.     hideEl(".icon-zanting"); 
    58.     clearInterval(timer); 
    59.   } 
    60. }; 
    61.  
    62. // 总时长 
    63. $(".video-player").oncanplay = function () { 
    64.   $(".pv-duration").innerHTML = changeTime($(".video-player").duration); 
    65. }; 
    66.  
    67. // 播放结束 
    68. $(".video-player").onended = function (params) { 
    69.   showEl(".icon-bofang"); 
    70.   hideEl(".icon-zanting"); 
    71. }; 
    72.  
    73. // 播放时长 
    74. function nowTime() { 
    75.   $(".pv-currentTime").innerHTML = changeTime($(".video-player").currentTime); 
    76.   let scale = $(".video-player").currentTime / $(".video-player").duration; 
    77.   let w = $(".pv-bar").offsetWidth - $(".pv-dot").offsetWidth; 
    78.   $(".pv-dot").style.left = scale * w + "px"; 
    79.   $(".pv-played").style.width = scale * w + "px"; 
    80.  
    81. // 静音/取消静音 
    82. $(".pv-iconyl").onclick = function () { 
    83.   if ($(".video-player").muted) { 
    84.     $(".video-player").volume = 1; 
    85.     hideEl(".icon-jingyin"); 
    86.     showEl(".icon-yinliang"); 
    87.     $(".video-player").muted = false; 
    88.   } else { 
    89.     $(".video-player").volume = 0; 
    90.     showEl(".icon-jingyin"); 
    91.     hideEl(".icon-yinliang"); 
    92.     $(".video-player").muted = true; 
    93.   } 
    94. }; 
    95. let isfullScreen = false; 
    96. // 全屏 
    97. $(".pv-screen").onclick = function () { 
    98.   const w = document.documentElement.clientWidth || document.body.clientWidth; 
    99.   const h = document.documentElement.clientHeight || document.body.clientHeight; 
    100.   isfullScreen = !isfullScreen; 
    101.   if (isfullScreen) { 
    102.     setVp(w, h); 
    103.     hideEl(".icon-quanping"); 
    104.     showEl(".icon-huanyuan"); 
    105.   } else { 
    106.     setVp(900, 480); 
    107.     showEl(".icon-quanping"); 
    108.     hideEl(".icon-huanyuan"); 
    109.   } 
    110. }; 
    111. // 播放进度条 
    112. $(".pv-dot").onmousedown = function (ev) { 
    113.   let ev1 = ev || window.event; 
    114.   disX = ev1.clientX - $(".pv-dot").offsetLeft; 
    115.   document.onmousemove = function (ev) { 
    116.     let ev2 = ev || window.event; 
    117.     let L = ev2.clientX - disX; 
    118.     if (L < 0) { 
    119.       L = 0; 
    120.     } else if (L > $(".pv-bar").offsetWidth - $(".pv-dot").offsetWidth) { 
    121.       L = $(".pv-bar").offsetWidth - $(".pv-dot").offsetWidth; 
    122.     } 
    123.     $(".pv-dot").style.left = L + "px"; 
    124.  
    125.     let scale = L / ($(".pv-bar").offsetWidth - $(".pv-dot").offsetWidth); 
    126.     $(".video-player").currentTime = scale * $(".video-player").duration; 
    127.     nowTime(); 
    128.   }; 
    129.  
    130.   document.onmouseup = function () { 
    131.     document.onmousemove = null; 
    132.   }; 
    133.  
    134.   return false; 
    135. }; 
    136. // 音量控制 
    137. $(".pv-ol").onmousedown = function (ev) { 
    138.   let ev1 = ev || window.event; 
    139.   disL = ev1.clientX - $(".pv-ol").offsetLeft; 
    140.   document.onmousemove = function (ev) { 
    141.     let ev2 = ev || window.event; 
    142.     let L = ev2.clientX - disL; 
    143.     if (L < 0) { 
    144.       L = 0; 
    145.     } else if (L > $(".pv-yl").offsetWidth - $(".pv-ol").offsetWidth) { 
    146.       L = $(".pv-yl").offsetWidth - $(".pv-ol").offsetWidth; 
    147.     } 
    148.     $(".pv-ol").style.left = L + "px"; 
    149.     let scale = L / ($(".pv-yl").offsetWidth - $(".pv-ol").offsetWidth); 
    150.     $(".pv-bg").style.width = $(".pv-ol").offsetLeft + "px"; 
    151.     if ($(".pv-ol").offsetLeft !== 0) { 
    152.       showEl(".icon-yinliang"); 
    153.       hideEl(".icon-jingyin"); 
    154.     } else { 
    155.       showEl(".icon-jingyin"); 
    156.       hideEl(".icon-yinliang"); 
    157.     } 
    158.     $(".video-player").volume = scale; 
    159.   }; 
    160.  
    161.   document.onmouseup = function () { 
    162.     document.onmousemove = null; 
    163.   }; 
    164.  
    165.   return false; 
    166. }; 
    167. // 播放速度 
    168. $(".selectList").onclick = function (e) { 
    169.   let ev = e || window.event; 
    170.   hideEl(".selectList"); 
    171.   $(".pv-spnum").innerText = ev.target.innerText; 
    172.   const value = ev.target.innerText.replace("x", ""); 
    173.   $(".video-player").playbackRate = value; 
    174. }; 

    这样写是可以实现一个视频播放器,你可以通过改样式文件还有部分逻辑文件来实现一个自定义配置视频播放器,但是这种效果不太好,所以我们将通过使用Es6中的Class类来重写这个自定义配置视频播放器。

    二、Class类

    1.vp.js:class类逻辑文件。

        
     
     
     
    1.  
    2.  
    3.    
    4.      
    5.      
    6.     VamVideo(Class类版) 
    7.      
    8.      
    9.    
    10.    
    11.      
    12.        
    13.        
    14.          
    15.            
    16.            
    17.          
    18.          
    19.            
    20.              
    21.                
    22.                
    23.              
    24.              
    25.               00:00:00 
    26.               / 
    27.               00:00:00 
    28.              
    29.            
    30.            
    31.              
    32.                
    33.                 

       
    34.                 

       
    35.                
    36.                
    37.                  
    38.                  
    39.                
    40.              
    41.              
    42.               1x

       
    43.                
    44.                 
    45. 0.5x
    46.  
    47.                 
    48. 1x
    49.  
    50.                 
    51. 1.25x
    52.  
    53.                 
    54. 1.5x
    55.  
    56.                 
    57. 2x
    58.  
    59.                
    60.              
    61.              
    62.                
    63.                
    64.              
    65.            
    66.          
    67.        
    68.      
    69.      
    70.      
    71.    
    72.  

     看到上面的代码,已经发现我们可以配置视频播放器了,那么这个vp.js到底是何方神圣呢?我们来看下。

     
     
     
     
    1. class VamVideo { 
    2.   constructor(vp, attrObj, styleObj) { 
    3.     this.timer = null; 
    4.     this.disX = 0; 
    5.     this.disL = 0; 
    6.     this.isfullScreen = false; 
    7.     for (const key in attrObj) { 
    8.       if (Object.hasOwnProperty.call(attrObj, key)) { 
    9.         this.$(".video-player").setAttribute(key, attrObj[key]); 
    10.       } 
    11.     } 
    12.     for (const key in styleObj) { 
    13.       if (Object.hasOwnProperty.call(styleObj, key)) { 
    14.         this.$(".video-box").style[`${key}`] = styleObj[key]; 
    15.         key === "width" 
    16.           ? (this.vbw = styleObj.width) 
    17.           : (this.vbw = vp.offsetWidth); 
    18.         key === "height" 
    19.           ? (this.vbh = styleObj.height) 
    20.           : (this.vbh = vp.offsetHeight); 
    21.       } 
    22.     } 
    23.   } 
    24.   $ = (el) => document.querySelector(el); 
    25.   showEl = (el) => { 
    26.     this.$(el).style.display = "block"; 
    27.   }; 
    28.   hideEl = (el) => { 
    29.     this.$(el).style.display = "none"; 
    30.   }; 
    31.   setVp = (w, h) => { 
    32.     const _w = String(w).indexOf("px") != -1 ? w : w + "px"; 
    33.     const _h = String(h).indexOf("px") != -1 ? h : h + "px"; 
    34.     this.$(".video-player").style.width = _w; 
    35.     this.$(".video-player").style.height = _h; 
    36.     this.$(".video-box").style.width = _w; 
    37.     this.$(".video-box").style.height = _h; 
    38.     this.$(".pv-bar").style.width = _w; 
    39.   }; 
    40.   nowTime = () => { 
    41.     this.$(".pv-currentTime").innerHTML = this.changeTime( 
    42.       this.$(".video-player").currentTime 
    43.     ); 
    44.     let scale = 
    45.       this.$(".video-player").currentTime / this.$(".video-player").duration; 
    46.     let w = this.$(".pv-bar").offsetWidth - this.$(".pv-dot").offsetWidth; 
    47.     this.$(".pv-dot").style.left = scale * w + "px"; 
    48.     this.$(".pv-played").style.width = scale * w + "px"; 
    49.   }; 
    50.   changeTime = (iNum) => { 
    51.     let iN = parseInt(iNum); 
    52.     const iH = this.toZero(Math.floor(iN / 3600)); 
    53.     const iM = this.toZero(Math.floor((iN % 3600) / 60)); 
    54.     const iS = this.toZero(Math.floor(iN % 60)); 
    55.     return iH + ":" + iM + ":" + iS; 
    56.   }; 
    57.   toZero = (num) => { 
    58.     if (num <= 9) { 
    59.       return "0" + num; 
    60.     } else { 
    61.       return "" + num; 
    62.     } 
    63.   }; 
    64.   // 底部控制栏(显示/隐藏) 
    65.   bottomTup = () => { 
    66.     this.$(".bottom-tool").style.bottom = "0px"; 
    67.   }; 
    68.   bottomTdow = () => { 
    69.     this.$(".bottom-tool").style.bottom = "-45px"; 
    70.   }; 
    71.   // 倍速播放栏(显示/隐藏) 
    72.   selectListShow = () => { 
    73.     this.showEl(".selectList"); 
    74.   }; 
    75.   selectListHide = () => { 
    76.     this.hideEl(".selectList"); 
    77.   }; 
    78.   // 播放/暂停 
    79.   usePlay = () => { 
    80.     if (this.$(".video-player").paused) { 
    81.       this.$(".video-player").play(); 
    82.       this.hideEl(".icon-bofang"); 
    83.       this.showEl(".icon-zanting"); 
    84.       this.nowTime(); 
    85.       this.timer = setInterval(this.nowTime, 1000); 
    86.     } else { 
    87.       this.$(".video-player").pause(); 
    88.       this.showEl(".icon-bofang"); 
    89.       this.hideEl(".icon-zanting"); 
    90.       clearInterval(this.timer); 
    91.     } 
    92.   }; 
    93.   // 总时长 
    94.   useOnplay = () => { 
    95.     this.$(".pv-duration").innerHTML = this.changeTime( 
    96.       this.$(".video-player").duration 
    97.     ); 
    98.   }; 
    99.   // 播放结束 
    100.   useEnd = () => { 
    101.     this.showEl(".icon-bofang"); 
    102.     this.hideEl(".icon-zanting"); 
    103.   }; 
    104.   // 静音 
    105.   useVolume = () => { 
    106.     if (this.$(".video-player").muted) { 
    107.       this.$(".video-player").volume = 1; 
    108.       this.hideEl(".icon-jingyin"); 
    109.       this.showEl(".icon-yinliang"); 
    110.       this.$(".video-player").muted = false; 
    111.     } else { 
    112.       this.$(".video-player").volume = 0; 
    113.       this.showEl(".icon-jingyin"); 
    114.       this.hideEl(".icon-yinliang"); 
    115.       this.$(".video-player").muted = true; 
    116.     } 
    117.   }; 
    118.   // 全屏 
    119.   fullScreen = () => { 
    120.     const w = document.documentElement.clientWidth || document.body.clientWidth; 
    121.     const h = 
    122.       document.documentElement.clientHeight || document.body.clientHeight; 
    123.     this.isfullScreen = !this.isfullScreen; 
    124.     if (this.isfullScreen) { 
    125.       this.setVp(w, h); 
    126.       this.hideEl(".icon-quanping"); 
    127.       this.showEl(".icon-huanyuan"); 
    128.     } else { 
    129.       console.log("w" + this.vbw, "h" + this.vbh); 
    130.       this.setVp(this.vbw, this.vbh); 
    131.       this.showEl(".icon-quanping"); 
    132.       this.hideEl(".icon-huanyuan"); 
    133.     } 
    134.   }; 
    135.   // 播放进度条 
    136.   useTime = (ev) => { 
    137.     let ev1 = ev || window.event; 
    138.     this.disX = ev1.clientX - this.$(".pv-dot").offsetLeft; 
    139.     document.onmousemove = (ev) => { 
    140.       let ev2 = ev || window.event; 
    141.       let L = ev2.clientX - this.disX; 
    142.       if (L < 0) { 
    143.         L = 0; 
    144.       } else if ( 
    145.         L > 
    146.         this.$(".pv-bar").offsetWidth - this.$(".pv-dot").offsetWidth 
    147.       ) { 
    148.         L = this.$(".pv-bar").offsetWidth - this.$(".pv-dot").offsetWidth; 
    149.       } 
    150.       this.$(".pv-dot").style.left = L + "px"; 
    151.       let scale = 
    152.         L / (this.$(".pv-bar").offsetWidth - this.$(".pv-dot").offsetWidth); 
    153.       this.$(".video-player").currentTime = 
    154.         scale * this.$(".video-player").duration; 
    155.       this.nowTime(); 
    156.     }; 
    157.     document.onmouseup = function () { 
    158.       document.onmousemove = null; 
    159.     }; 
    160.     return false; 
    161.   }; 
    162.   // 音量控制 
    163.   useListen = (ev) => { 
    164.     let ev1 = ev || window.event; 
    165.     this.disL = ev1.clientX - this.$(".pv-ol").offsetLeft; 
    166.     document.onmousemove = (ev) => { 
    167.       let ev2 = ev || window.event; 
    168.       let L = ev2.clientX - this.disL; 
    169.       if (L < 0) { 
    170.         L = 0; 
    171.       } else if ( 
    172.         L > 
    173.         this.$(".pv-yl").offsetWidth - this.$(".pv-ol").offsetWidth 
    174.       ) { 
    175.         L = this.$(".pv-yl").offsetWidth - this.$(".pv-ol").offsetWidth; 
    176.       } 
    177.       this.$(".pv-ol").style.left = L + "px"; 
    178.       let scale = 
    179.         L / (this.$(".pv-yl").offsetWidth - this.$(".pv-ol").offsetWidth); 
    180.       th

      文章标题:你是否有一个梦想?用JavaScript开发一款自定义配置视频播放器
      网址分享:http://www.shufengxianlan.com/qtweb/news11/428111.html

      网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

      广告

      声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联