`
wjlgryx
  • 浏览: 308435 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

HTML5+CSS3+JQuery打造自定义视频播放器

阅读更多

简介
HTML5的<video>标签已经被目前大多数主流浏览器所支持,包括还未正式发布的IE9也声明将支持<video>标签,利用浏览器原生特性嵌入视频有很多好处,所以很多开发者想尽快用上,但是真正使用前还有些问题要考虑,尤其是 Opera/Firefox 和IE/Safari浏览器所支持的视频编码不同的问题,Google几个月前发布的开源视频编码VP8有望能解决这一问题,另外Google还发布了开放网络媒体项目
WebM,旨在帮助开发者为开放网络制作出世界级媒体格式,Opera, Firefox, Chrome和IE9都将支持VP8,而且Flash Player也将可以播放VP8,这就意味着我们很快就可以只制作一个版本的视频然后在所有主流浏览器上播放了。另外一个主要的问题就是如何构建自定义的HTML5<video>播放器,这是目前Flash Player的优势所在,利用Flash的IDE所提供的接口可以很方便的构建一个个性化的视频播放器,那HTML5的<video>标签要怎样才能实现呢?这个问题就是本文所要解决的!我们将开发一个HTML5<video>视频播放器的jQuery插件,并且可以很方便的进行自定义,将分为以下几个部分:
1.视频控制工具条
2.视频控制按钮
3.打包成jQuery插件
4.外观和体验
5.自定义皮肤

视频控制工具条
做为一个专业的web开发人员,我们创建一个视频播放器时一定希望它的外观在各个浏览器中看起来一致(consistent),但是通过下面的图可以看到目前各个浏览器提供的视频控制工具条外观各不相同:

那就没办法了,我们得自己从头来创建这个控制工具条,利用HTML和CSS再加上一些图片实现起来并不算很难,另外通过HTML5多媒体元素提供的API我们可以很方便将创建的任何按钮与播放/暂停等事件进行绑定。

视频控制按钮
基本的视频控制工具条要包含一个播放/暂停按钮,一个进度条,一个计时器和一个音量控制按钮,我们将这些按钮放在<video>元素下面,并用一个div作为父容器:
  1. <div class="ghinda-video-controls">
  2.         <a class="ghinda-video-play" title="Play/Pause"></a>
  3.         <div class="ghinda-video-seek"></div>
  4.         <div class="ghinda-video-timer">00:00</div>
  5.         <div class="ghinda-volume-box">
  6.                 <div class="ghinda-volume-slider"></div>
  7.                 <a class="ghinda-volume-button" title="Mute/Unmute"></a>
  8.         </div>
  9. </div>
复制代码
注意,我们使用元素的class属性来代替ID属性是为了方便在一个页面上使用多个播放器。

打包成jQuery插件
创建好控制按钮后我们需要配合多媒体元素的API来实现视频控制的目的,正如前面提到的一样我们将我们的播放器打包成jQuery插件,这样可以很好的实现复用,代码如下:
  1. $.fn.gVideo = function(options) {
  2.         // build main options before element iteration
  3.         var defaults = {
  4.                 theme: 'simpledark',
  5.                 childtheme: ''
  6.         };
  7.         var options = $.extend(defaults, options);
  8.         // iterate and reformat each matched element
  9.         return this.each(function() {
  10.                 var $gVideo = $(this);
  11.                 
  12.                 //create html structure
  13.                 //main wrapper
  14.                 var $video_wrap = $('<div></div>').addClass('ghinda-video-player').addClass(options.theme).addClass(options.childtheme);
  15.                 //controls wraper
  16.                 var $video_controls = $('<div class="ghinda-video-controls"><a class="ghinda-video-play" title="Play/Pause"></a><div class="ghinda-video-seek"></div><div class="ghinda-video-timer">00:00</div><div class="ghinda-volume-box"><div class="ghinda-volume-slider"></div><a class="ghinda-volume-button" title="Mute/Unmute"></a></div></div>');                                                
  17.                 $gVideo.wrap($video_wrap);
  18.                 $gVideo.after($video_controls);
复制代码
这里先假设您了解jQuery并知道如何创建一个jQuery插件,因为这个不在本文的讨论范围之内,在上面这段脚本中我们使用jQuery动态创建视频控制工具条的元素,接下来为了绑定事件我们需要获取对应的元素:
  1. //get newly created elements
  2. var $video_container = $gVideo.parent('.ghinda-video-player');
  3. var $video_controls = $('.ghinda-video-controls', $video_container);
  4. var $ghinda_play_btn = $('.ghinda-video-play', $video_container);
  5. var $ghinda_video_seek = $('.ghinda-video-seek', $video_container);
  6. var $ghinda_video_timer = $('.ghinda-video-timer', $video_container);
  7. var $ghinda_volume = $('.ghinda-volume-slider', $video_container);
  8. var $ghinda_volume_btn = $('.ghinda-volume-button', $video_container);

  9. $video_controls.hide(); // keep the controls hidden
复制代码
这里我们通过className方式获取,先让工具条隐藏直到所有资源加载完成,现在来实现播放/暂停按钮:
  1. var gPlay = function() {
  2.         if($gVideo.attr('paused') == false) {
  3.                 $gVideo[0].pause();                                        
  4.         } else {                                        
  5.                 $gVideo[0].play();                                
  6.         }
  7. };

  8. $ghinda_play_btn.click(gPlay);
  9. $gVideo.click(gPlay);

  10. $gVideo.bind('play', function() {
  11.         $ghinda_play_btn.addClass('ghinda-paused-button');
  12. });

  13. $gVideo.bind('pause', function() {
  14.         $ghinda_play_btn.removeClass('ghinda-paused-button');
  15. });

  16. $gVideo.bind('ended', function() {
  17.         $ghinda_play_btn.removeClass('ghinda-paused-button');
  18. });
复制代码
大多数浏览器在右键点击视频时会提供一个独立的菜单,它也提供了视频控制功能,如果用户通过这个右键菜单控制视频那就会跟我们的自定义控件冲突,所以为了避免这一点我们需要绑定视频播放器自身的“播放”,“暂停”和“结束”事件,在事件处理函数中处理播放/暂停按钮,控制按钮的样式。
为了创建进度条的拖动块,我们使用了jQuery UI的Slider组件:
  1. var createSeek = function() {
  2.         if($gVideo.attr('readyState')) {
  3.                 var video_duration = $gVideo.attr('duration');
  4.                 $ghinda_video_seek.slider({
  5.                         value: 0,
  6.                         step: 0.01,
  7.                         orientation: "horizontal",
  8.                         range: "min",
  9.                         max: video_duration,
  10.                         animate: true,                                        
  11.                         slide: function(){                                                        
  12.                                 seeksliding = true;
  13.                         },
  14.                         stop:function(e,ui){
  15.                                 seeksliding = false;                                                
  16.                                 $gVideo.attr("currentTime",ui.value);
  17.                         }
  18.                 });
  19.                 $video_controls.show();                                        
  20.         } else {
  21.                 setTimeout(createSeek, 150);
  22.         }
  23. };

  24. createSeek();
复制代码
正如你所看到的,这里我们写了一个递归函数,通过循环比较video的readyState属性来判断视频是否已经准备好,否则我们就不能获得视频的时长也无法创建滑动块,当视频准备好后我们初始化滑动块并显示控制工具条,下一步我们通过绑定video元素的timeupdate事件实现计时器功能:
  1. var gTimeFormat=function(seconds){
  2.         var m=Math.floor(seconds/60)<10?"0"+Math.floor(seconds/60):Math.floor(seconds/60);
  3.         var s=Math.floor(seconds-(m*60))<10?"0"+Math.floor(seconds-(m*60)):Math.floor(seconds-(m*60));
  4.         return m+":"+s;
  5. };

  6. var seekUpdate = function() {
  7.         var currenttime = $gVideo.attr('currentTime');
  8.         if(!seeksliding) $ghinda_video_seek.slider('value', currenttime);
  9.         $ghinda_video_timer.text(gTimeFormat(currenttime));                                                        
  10. };

  11. $gVideo.bind('timeupdate', seekUpdate);
复制代码
这里我们用seekUpdate函数获取video的currentTime属性值然后调用gTimeFormat函数进行格式化后得到当前播放的时间点。
至于音量控制控件我们还是利用jQuery UI的Slider组件然后利用自定义函数实现静音和取消静音的功能:
  1. $ghinda_volume.slider({
  2.         value: 1,
  3.         orientation: "vertical",
  4.         range: "min",
  5.         max: 1,
  6.         step: 0.05,
  7.         animate: true,
  8.         slide:function(e,ui){
  9.                 $gVideo.attr('muted',false);
  10.                 video_volume = ui.value;
  11.                 $gVideo.attr('volume',ui.value);
  12.         }
  13. });

  14. var muteVolume = function() {
  15.         if($gVideo.attr('muted')==true) {
  16.                 $gVideo.attr('muted', false);
  17.                 $ghinda_volume.slider('value', video_volume);
  18.                 
  19.                 $ghinda_volume_btn.removeClass('ghinda-volume-mute');                                        
  20.         } else {
  21.                 $gVideo.attr('muted', true);
  22.                 $ghinda_volume.slider('value', '0');
  23.                 
  24.                 $ghinda_volume_btn.addClass('ghinda-volume-mute');
  25.         };
  26. };

  27. $ghinda_volume_btn.click(muteVolume);
复制代码
最后当我们自己的自定义视频控制工具条构造完成后需要移除<video>标签的controls属性,这样浏览器默认的工具条就被去掉了。
好了,我们的插件功能已经全部完成了,调用方法:
  1. $('video').gVideo();
复制代码
这会将我们的插件应用到页面上每一个video元素上。

外观和体验
好的,现在到了比较有意思的部分,也就是播放器的外观和体验了。当插件功能已经完成后利用一点CSS就可以很容易地自定义样式了,我们将全部使用CSS3来实现。
首先,我们给播放器主容器加一些样式:
  1. .ghinda-video-player {
  2.         float: left;
  3.         padding: 10px;
  4.         border: 5px solid #61625d;
  5.                 
  6.         -moz-border-radius: 5px; /* FF1+ */
  7.         -ms-border-radius: 5px; /* IE future proofing */
  8.         -webkit-border-radius: 5px; /* Saf3+, Chrome */
  9.         border-radius: 5px; /* Opera 10.5, IE 9 */
  10.         
  11.         background: #000000;
  12.         background-image: -moz-linear-gradient(top, #313131, #000000); /* FF3.6 */
  13.         background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #313131),color-stop(1, #000000)); /* Saf4+, Chrome */
  14.         
  15.         box-shadow: inset 0 15px 35px #535353;
  16. }
复制代码
下一步,我们设置视频控制工具条左边浮动使它们水平对齐,利用CSS3的opacity和transitions我们给播放/暂停和静音/取消静音按钮添加了非常不错的悬浮效果:
  1. .ghinda-video-play {
  2.         display: block;
  3.         width: 22px;
  4.         height: 22px;
  5.         margin-right: 15px;
  6.         background: url(../images/play-icon.png) no-repeat;        
  7.         
  8.         opacity: 0.7;
  9.         
  10.         -moz-transition: all 0.2s ease-in-out; /* Firefox */
  11.         -ms-transition: all 0.2s ease-in-out; /* IE future proofing */
  12.         -o-transition: all 0.2s ease-in-out;  /* Opera */
  13.         -webkit-transition: all 0.2s ease-in-out; /* Safari and Chrome */
  14.         transition: all 0.2s ease-in-out; 
  15. }

  16. .ghinda-paused-button {
  17.         background: url(../images/pause-icon.png) no-repeat;
  18. }

  19. .ghinda-video-play:hover {        
  20.         opacity: 1;
  21. }
复制代码
如果您仔细看了前面那段根据视频播放状态(Playing/Paused)添加和移除播放/暂停按钮样式的JavaScript代码,就会明白为什么.
ghinda-paused-button为什么要重写.ghinda-video-play的背景属性了。
现在轮到滑动块了,我们进度条和音量控制的滑动块的实现都是利用了jQuery UI的Slider组件,这个组件它本身自带了样式,定义在jQuery UI对应的css文件中,但是为了使滑动块和播放器其他控件外观保持一致我们全部重写了它的样式:
  1. .ghinda-video-seek .ui-slider-handle {
  2.         width: 15px;
  3.         height: 15px;
  4.         border: 1px solid #333;
  5.         top: -4px;

  6.         -moz-border-radius:10px;
  7.         -ms-border-radius:10px;
  8.         -webkit-border-radius:10px;
  9.         border-radius:10px;        
  10.         
  11.         background: #e6e6e6;
  12.         background-image: -moz-linear-gradient(top, #e6e6e6, #d5d5d5);
  13.         background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #e6e6e6),color-stop(1, #d5d5d5));
  14.         
  15.         box-shadow: inset 0 -3px 3px #d5d5d5;        
  16. }

  17. .ghinda-video-seek .ui-slider-handle.ui-state-hover {
  18.         background: #fff;
  19. }

  20. .ghinda-video-seek .ui-slider-range {
  21.         -moz-border-radius:15px;
  22.         -ms-border-radius:15px;
  23.         -webkit-border-radius:15px;
  24.         border-radius:15px;
  25.         
  26.         background: #4cbae8;
  27.         background-image: -moz-linear-gradient(top, #4cbae8, #39a2ce);
  28.         background-image: -webkit-gradient(linear,left top,left bottom,color-stop(0, #4cbae8),color-stop(1, #39a2ce));
  29.         
  30.         box-shadow: inset 0 -3px 3px #39a2ce;
  31. }
复制代码
这时候音量控制的滑动块一直显示在音量按钮旁边,我们需要将它改成默认隐藏,当鼠标悬浮在音量按钮上再动态显示出来,使用transitions来实现这个效果会是个不错的的选择:
  1. .ghinda-volume-box {        
  2.         height: 30px;
  3.         
  4.         -moz-transition: all 0.1s ease-in-out; /* Firefox */
  5.         -ms-transition: all 0.1s ease-in-out; /* IE future proofing */
  6.         -o-transition: all 0.2s ease-in-out;  /* Opera */
  7.         -webkit-transition: all 0.1s ease-in-out; /* Safari and Chrome */
  8.         transition: all 0.1s ease-in-out; 
  9. }

  10. .ghinda-volume-box:hover {        
  11.         height: 135px;
  12.         padding-top: 5px;
  13. }

  14. .ghinda-volume-slider {        
  15.         visibility: hidden;
  16.         opacity: 0;
  17.         
  18.         -moz-transition: all 0.1s ease-in-out; /* Firefox */
  19.         -ms-transition: all 0.1s ease-in-out;  /* IE future proofing */
  20.         -o-transition: all 0.1s ease-in-out;  /* Opera */
  21.         -webkit-transition: all 0.1s ease-in-out; /* Safari and Chrome */
  22.         transition: all 0.1s ease-in-out; 
  23. }

  24. .ghinda-volume-box:hover .ghinda-volume-slider {
  25.         position: relative;
  26.         visibility: visible;
  27.         opacity: 1;
  28. }
复制代码
利用一些基础的CSS属性以及CSS3提供的新属性我们打造了一个全新的播放器外观,它看起来是这个样子:



自定义皮肤
可能您已经注意到,我们在编写插件的时候已经定义了一些默认选项,它们是theme和childtheme,可以在调用插件的时候根据需要方便的应用自定义皮肤。
这里解释下theme就是所有控件的一整套样式定义,childtheme就是在theme基础上重写某些样式,我们在调用插件的时候可以同时指定这两个选项或者其中的一个:
  1. $('video').gVideo({
  2.            childtheme:'smalldark'
  3. });
复制代码
我们写了一个示例的皮肤smalldark,它只重写了部分的样式,显示效果是这样的:


总结
利用HTML5 video,JavaScript和CSS3打造自定义的视频播放器真的非常容易,t实现工具条功能用
JavaScrip,外观和体验交给CSS3,我们得到了一个功能强大并且易于定制的解决方案!
enjoy!

分享到:
评论
3 楼 开发小菜 2013-12-02  
支持IE9以下的吗?
2 楼 wecbk 2011-10-28  
1 楼 huangxilove 2011-09-22  
   

相关推荐

    HTML+CSS+JavaScript+jQuery+Bootstrap等前端框架实现的前端案例.zip

    本文将深入探讨这些技术,并基于"HTML+CSS+JavaScript+jQuery+Bootstrap等前端框架实现的前端案例.zip"这个压缩包中的webdemo-master项目,分析它们在实际应用中的作用。 首先,HTML(HyperText Markup Language)...

    HTML5,css3,jQuery自制video播放器

    通过以上步骤,我们可以构建出一个功能完善的HTML5、CSS3和jQuery自定义video播放器。这个项目不仅展示了这些技术的实际应用,也锻炼了开发者在网页交互设计和用户体验优化方面的能力。在实际开发中,还可以根据需求...

    HTML5+CSS3+jQuery Mobile轻松构造APP与移动网站代码

    HTML5、CSS3和jQuery Mobile是现代Web开发的三大核心技术,它们共同为构建功能丰富的APP和移动网站提供了强大的工具集。HTML5作为超文本标记语言的最新版本,引入了诸多新特性,旨在提升网页的交互性和表现力;CSS3...

    <html5+css3+js>jquery基础

    在IT行业中,HTML5、CSS3和JavaScript是构建现代网页应用的基础,而jQuery则是JavaScript库中的佼佼者,极大地简化了DOM操作、事件处理、动画效果以及Ajax交互。本篇文章将深入探讨这些技术,尤其是jQuery的基础知识...

    HTML5+CSS3+jquery制作个性注册表单代码

    在这个“HTML5+CSS3+jQuery制作个性注册表单代码”项目中,开发者利用这些技术构建了一个功能完备且具有个性化设计的注册表单。 HTML5作为最新的超文本标记语言版本,引入了许多新特性,比如语义化元素(如、、和)...

    jQuery+CSS3+HTML5折叠卡片式下拉菜单特效

    **jQuery+CSS3+HTML5折叠卡片式下拉菜单特效详解** 在网页设计中,下拉菜单是一种常见的交互元素,用于展示多级导航结构。本特效利用jQuery的事件处理、DOM操作,结合CSS3的动画效果和HTML5的新特性,构建出一种...

    动态网页设计与制作(HTML5+CSS3+JavaScript)(第3版)-PPT课件.zip

    动态网页设计与制作是互联网开发领域中的核心技能之一,它涉及到HTML5、CSS3和JavaScript等关键技术。这些技术的结合使得网页不仅具有丰富的视觉效果,还能实现交互性和动态功能。以下将详细介绍这些知识点: HTML5...

    HTML5+CSS3设计网站模板

    在“HTML5+CSS3设计网站模板”中,这两者结合,可以实现动态效果、响应式布局以及丰富的交互性,使得网站在不同设备和浏览器上都能呈现出一致的优质用户体验。 首先,HTML5引入了新的元素,如、、、和等,这些元素...

    HTML5+CSS3视频播放器.zip

    这个“HTML5+CSS3视频播放器”项目显然展示了如何利用这两者来构建一个自定义的、功能完备的视频播放器。 HTML5引入了内置的媒体元素`&lt;video&gt;`,它允许开发者直接在网页上嵌入视频内容,而无需依赖Flash等外部插件...

    html+css+jsp+jQuery最全的网页开发中文帮助文档全部是.chm

    网页开发是互联网时代的核心技能之一,涵盖了HTML、CSS、JSP和jQuery等多个关键领域。这些技术结合使用,能够创建功能丰富、交互性强的动态网页。下面是对这些技术的详细解释和知识点总结: **HTML(超文本标记语言...

    html5+css3圆角图文展示卡片层叠滑动切换特效.zip

    在“html5+css3圆角图文展示卡片层叠滑动切换特效.zip”这个压缩包中,我们可以看到一个利用这两种技术实现的动态展示卡片的特效。这种特效通常用于产品展示、信息分类或者新闻滚动等场景,可以吸引用户注意力,提高...

    html5+css3图片幻灯片切换代码.zip

    在“html5+css3图片幻灯片切换代码.zip”这个压缩包中,我们可以预见到一个利用这两项技术实现的图片幻灯片切换效果。下面将详细介绍这个效果的实现原理和相关知识点。 首先,HTML5引入了一些新的元素,如`&lt;figure&gt;...

    15种html5+css3图片堆叠图片展示特效

    本资源提供了“15种html5+css3图片堆叠图片展示特效”,这是一种创新的图片展示方式,它将图片以扑克牌堆叠的形式呈现,初始状态仅显示一张图片,通过交互(如点击按钮)可以展开成多张,增强了用户体验和视觉吸引力...

    HTML5+CSS3图片选中列表选中

    在这个“HTML5+CSS3图片选中列表”项目中,结合JavaScript库jQuery,我们可以实现一个高效且用户体验良好的图片选中系统。以下是关于这个项目的一些关键知识点: 1. HTML5新特性: - `data-*`属性:用于在HTML元素...

    HTML5+CSS3+Bootstrap+Jquery网页设计个人独立大气官网模板.zip

    技术栈:html5+css3+jquery+bootstrap 网站特色: 100%流体响应 清洁代码 在真实设备上测试 灵活的布局 无限侧边栏 平面、现代和干净的设计。 清洁和注释代码 自定义字体支持 建立在Bootstrap5上 HTML5 和 CSS3 文件...

    HTML5+CSS3实现的列表式音乐播放器特效源码

    在这个"HTML5+CSS3实现的列表式音乐播放器特效源码"项目中,我们可以深入探讨这两者如何协同工作,构建出一个交互性强、功能全面的音乐播放器。 首先,HTML5(HyperText Markup Language第五版)是网页内容结构的...

    HTML5+CSS3超酷动态表单 HTML5+CSS3超酷动态表单网页特效.zip

    本资源"HTML5+CSS3超酷动态表单 HTML5+CSS3超酷动态表单网页特效.zip"显然是一个包含一系列使用这两种技术实现的创新表单设计和交互效果的集合。 首先,我们来详细了解一下HTML5在动态表单中的应用。HTML5引入了新...

    jQuery+css3水平悬停动画 jQuery+css3水平悬停动画网页特效.zip

    在"jQuery+css3水平悬停动画"中,HTML5元素可能用于构建布局和结构,使得动画能够正确地与页面内容结合。 JavaScript和jQuery的结合使用,使得开发者可以精确控制动画的执行时机和方式。例如,可以使用jQuery的`....

    Web端点餐系统(HTML5 + CSS3 + JS(jQuery)).zip

    "Web端点餐系统(HTML5 + CSS3 + JS(jQuery)).zip" 这个标题揭示了我们正在处理一个基于Web的在线点餐系统的实现,该系统利用了现代Web开发技术,包括HTML5、CSS3以及JavaScript的jQuery库。这个系统可能是作为毕业...

Global site tag (gtag.js) - Google Analytics