自定义简单好用的<video>播放条样式

这几天在写公司的h5视频播放页面,收获了不少东西。

首先,我需要支持flv和mp4格式的视频。本来想用开源插件flv.js把flv的转换成手机浏览器mp4格式视频,结果不幸的是,两月以前各大手机浏览器更新了内核,不支持flv.js这个插件了(除了chrome浏览器)。但PC端还是可用的。

下面说重点,怎么自定义播放条样式。

首先放出成品图:

html代码:

<video  data-icon="0" src="" data-state="a" style="width:100%;height:13.1875rem;" id="videoBox" webkit-playsinline playsinline></video>//video标签
<div class="btnPlay"><img class="left" src="images/playBagin.png" alt="" data-icon="0"><p class="progressTime left">0:00</p></div>//开始按钮div
<div class="progressBox" id="progressBox_special">
<div class="progressBar"></div>//蓝条进度条div
<div class="imgBox"><img id="progressImg" src="images/progressPointer.png" alt=""></div></div>//进度条拖拉图片divBox
<div class="biggerBtn" data-icon="0"><img class="right" src="images/allBigger.png" alt=""><p class="allTime right"></p></div></div>//全屏div

注:<video>标签之所以加上webkit-playsinline,playsinline两个属性,就是为了保证不同浏览器支持视频在h5页面中播放,不用手机浏览器自动托管视频

css一些问题:

由于<video>标签默认层级最高,可设置播放条div的z-index在最上面。

用的还是jQuery库,下面放js代码:

<video>标签的API还是很全面的,不过需要通过dom本身调用。

视频总时间和播放的时间:

var  video  =  document.getElementById("video");
var video2 = $("#video");
//视频总时间
video2.on(‘loadedmetadata‘, function() {
   var time = video.duration;
   $(‘.allTime‘).text(time.toFixed(2));
});
//视频进度时间
video2.on(‘timeupdate‘, function() {
   var time = video.currentTime,alltime = video.duration;
   var percentage = 100 *(time / alltime);
   $(‘.progressTime‘).text(time.toFixed(2));
   $(‘.progressBar‘).css({‘width‘:percentage + ‘%‘});
   $(‘.stateBox .progressBox .imgBox img‘).css({‘margin-left‘:percentage +‘%‘});
   if(time == alltime){
          $(‘.btnPlay img‘).attr(‘src‘,‘images/playBagin.png‘); //如果播放时间到总时间播放按钮图片换成停止图片
   }
});

点击播放按钮:

//视频开始按钮事件
$(‘.btnPlay img‘).on(‘touchend‘,function(){
        if(video.paused) {
        video.play();
        $(this).attr(‘src‘,‘images/pause_btn.png‘);
        }else {
        video.pause();
        $(this).attr(‘src‘,‘images/playBagin.png‘);
        }
        return false;
        }) 

拖拉进度条:

//拖拉函数
function changeBar(item){
   var progress = $(‘.progressBox‘);
   var maxduration = video.duration; //视频总时间
   var barIcon = $(‘.nav .biggerBtn‘).attr(‘data-icon‘),position,percentage;
   if(barIcon == 0){
        position = item - progress.offset().left; //横屏模式
   }else{
        position = item - progress.offset().top; //全屏竖屏模式
   }
   percentage = 100 * (position / progress.width());
   if(percentage > 100) {
      percentage = 100;
   }
   if(percentage < 0) {
      percentage = 0;
   }
   $(‘.progressBar‘).css(‘width‘, percentage+‘%‘);
   $(‘.stateBox .progressBox .imgBox img‘).css({‘margin-left‘:percentage +‘%‘});
   video.currentTime = maxduration * (percentage / 100);//视频进度时间传给当前时间
   video.play();
   $(‘.btnPlay img‘).attr(‘src‘,‘images/pause_btn.png‘);
}
//视频拖拉按钮事件
var progressBox = document.getElementById(‘progressBox_special‘);
progressBox.addEventListener(‘touchstart‘, progressBox_item, false);
function progressBox_item(e){
         var barIcon = $(‘.nav .biggerBtn‘).attr(‘data-icon‘);
         var point = fristPoint(e);
         if(barIcon == 0){
            changeBar(point.pageX);
         }else{
              changeBar(point.pageY);
         }
};//拖拉按钮var statePic = document.getElementById(‘progressImg‘);
statePic.addEventListener(‘touchmove‘, itemMove, false);//发现h5的touchmove行为要通过addEventListener注册
function itemMove(e){
    e.stopPropagation();//阻止默认行为
    var barIcon = $(‘.nav .biggerBtn‘).attr(‘data-icon‘);
    var point = fristPoint(e);
      if(barIcon == 0){
            changeBar(point.pageX);//横屏
         }else{
              changeBar(point.pageY); //全屏竖屏
         }
};
//第一个手指为准
function fristPoint(e){
        return e.touches ? e.touches[0] : e;
}

点击全屏:

 //点击全屏
var itemHeight = document.documentElement.clientHeight;//获取手机高度
var itemWidth = document.documentElement.clientWidth;//手机宽度
$(‘.biggerBtn img‘).on(‘touchend‘,function(event){
        event.stopPropagation();
        var dataIcon = $(this).parent().attr(‘data-icon‘);
        if(dataIcon == 0){
                        $(‘.nav‘).css({‘-webkit-transform‘:‘rotate(90deg)‘});//直接把视频旋转90°,给video高度宽度重新赋值。
                        $(‘.nav video‘).css({‘width‘:itemHeight,‘height‘:itemWidth});
                        $(‘.stateBox‘).css({‘width‘:itemHeight});
                        $(‘.biggerBtn‘).attr(‘data-icon‘,‘1‘);
                        $(‘.nav video‘).attr(‘data-icon‘,‘1‘);
                }else{
                        $(‘.nav‘).css({‘-webkit-transform‘:‘rotate(0deg)‘});
                        $(‘.nav video‘).css({‘width‘:itemWidth,‘height‘:‘13.1875rem‘});
                        $(‘.stateBox‘).css({‘width‘:itemWidth});
                        $(‘.biggerBtn‘).attr(‘data-icon‘,‘0‘);
                        $(‘.nav video‘).attr(‘data-icon‘,‘0‘);
                }
});
时间: 2024-12-31 14:55:32

自定义简单好用的<video>播放条样式的相关文章

最简单的android自定义进度条样式

一.自定义圆形进度条样式 1.在安卓项目drawable目录下新建一个xml文件如下:<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:pivotX="50%" android:pivotY="50%" andro

模拟video播放器

本以为写一个video播放器不难,可写着写着坑就越挖越大了. 先看一下播放器大概是长这样的: 在开发过程中这几个问题深深地困扰着我: 1.各机器兼容问题 2.关于视频播放过程中进度条显示情况 3.关于改变播放进度和音量大小的操作问题 1.各机器兼容问题 除了chrome很乖支持良好外,其中UC获取不到duration属性,也就获取不到视频的总长度了,但这部分可以由后台传参数解决,但是不能禁用系统播放器这个就不太好了.... 抛开其它浏览器,来看看腾讯X5内核的浏览器的支持情况:http://x5

android 自定义view+属性动画实现充电进度条

近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和自定义view的方式来完成这个功能,将它开源出来,供有需要的人了解一下相关的内容. 本次实现的功能类似下面的效果: 接下来便详细解析一下如何完成这个功能,了解其中的原理,这样就能举一反三,实现其他类似的动画效果了. 详细代码请看大屏幕 https://github.com/crazyandcoder

Android自定义进度条样式

最近在做一个widget,上面需要一个progressbar,产品经理和设计师给出来的东西是要实现一个圆角的progress和自定义的颜色,研究一小下,分享出来给大家哦. 测试于:Android4.0+ 操作步骤: 1.创建你的layout文件引用progressbar如下,标红处引用你自定的样式: <ProgressBar android:id="@+id/progressDownload" style="?android:attr/progressBarStyleH

Android 自定义Adapter 但listview 只显示第一条数据

楼主让这个问题郁闷了一晚上.....在logcat里明明显示adapter的getview方法里的list大于一条数据 ,但posotion却一直是0.....运行后也只显示list[0]里面的数据....最后的最后原来错误出在布局文件上 我以前的是这样的; <ScrollView android:layout_width="fill_parent" android:layout_height="wrap_content" > <!-- listv

我的Android进阶之旅------&gt;Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢daimajia的开源奉献! 第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/deta

自定义水平进度条样式:黑色虚线

布局layout中使用: 1 <ProgressBar 2 android:id="@+id/progress_bar" 3 style="?android:attr/progressBarStyleHorizontal" <!--必须设置为水平--> 4 android:progressDrawable="@drawable/myprogress" <!--此处用自定义样式--> 5 android:layout_

javascript自定义简单map对象功能

这里介绍一种js创建简单map对象的方法: function Map() { //创建object对象, 并给object对象添加key和value属性 var obj1=new Object(); var obj2=new Object(); obj1.key="zhangsan" ; obj1.value=23; obj2.key="lisi"; obj2.value=25; //创建一个数组,将创建的object对象放如到数组中去 var map=new Ar

CodePush自定义更新弹框及下载进度条

CodePush 热更新之自定义更新弹框及下载进度 先来几张弹框效果图 非强制更新场景 image 强制更新场景 image 更新包下载进度效果 image 核心代码 这里的热更新Modal框,是封装成一个功能独立的组件来使用的,需不需要更新以及是否为强制更新等逻辑均在组件内实现 image UpdateComp 热更新组件核心代码如下: /** * Created by guangqiang on 2018/3/29. */ import React, {Component} from 're