H5移动端自定义video播放控件controls(带播放暂停,进度条拖拽)

效果图如下

GIF.gif

html结构部分

<div class="player">
    <video id="video" muted poster="images/video_poster.png">
        <source src="https://video.pearvideo.com/mp4/adshort/20190702/cont-1572578-14079299_adpkg-ad_sd.mp4">
    </video>
    <!--播放控件-->
    <div class="controls">
        <div class="playBtn"></div>
        <div class="progress">
            <div class="duration"></div>
            <i></i>
        </div>
        <div class="time">
            <span class="current">00:00</span>/<span class="totle">00:30</span>
        </div>
    </div>
</div>

JS部分

var playBtn = document.querySelector('.playBtn'),
    video = document.querySelector('#video'),
    duration = document.querySelector('.duration'),
    durationIcon = document.querySelector('.progress i'),
    progress = document.querySelector('.progress'),
    total = document.querySelector('.time .totle'),
    current = document.querySelector('.time .current'),
    cw = document.body.clientWidth ||document.documentElement.clientWidth,//屏幕宽度 
    oL,//鼠标相对于拖拽圆点的偏移距离
    //滑块宽度的一半
    cirW = durationIcon.offsetWidth/2,
    rate,
    total_time,//视频总时长
    current_time; //现在时间
//当浏览器能够开始播放指定的视频时      
video.addEventListener('canplay',function(){    
    //播放暂停按钮切换
    playBtn.onclick = function(){
        this.classList.toggle('pause');
        if(video.paused){
            video.play();
        }else{
            video.pause();
        }
    }       
    //显示总时长
    total_time = video.duration;//视频总时长
    var m = parseInt(total_time/60); //分
    var s = parseInt(total_time%60); //秒
    m = m >= 10 ? m : "0"+m;
    s = s >= 10 ? s : "0"+s;
    total.innerHTML = m + ":" + s;
    //显示当前播放时间
    video.addEventListener('timeupdate',function(){
        current_time = this.currentTime;
        var _m = parseInt(current_time/60); //分
        var _s = parseInt(current_time%60); //秒
        _m = _m >= 10 ? _m : "0"+_m;
        _s = _s >= 10 ? _s : "0"+_s;
        current.innerHTML = _m + ":" + _s;
        //显示当前播放进度条
        var new_width = (current_time/total_time)*progress.offsetWidth;
        duration.style.width = new_width + "px";
        durationIcon.style.left = (new_width - cirW) + 'px';    
    })
    //播放结束时
    video.addEventListener("ended",function(){
        playBtn.classList.remove('pause');
    })
    //移动端进度条拖动
    durationIcon.addEventListener('touchstart',function(e){
        var ev = e || window.event;
        var touch = ev.targetTouches[0];        
        oL = touch.clientX - durationIcon.offsetLeft - progress.offsetLeft;//鼠标相对于拖拽圆点的偏移距离     
    })
    durationIcon.addEventListener('touchmove',function(e){
        e.preventDefault();
        var ev = e || window.event;
        var touch = ev.targetTouches[0];
        var oLeft = touch.clientX - progress.offsetLeft - oL ; //滑块最左端距离父元素最左端的距离
        var durationWidth = oLeft + cirW;
        //拖动边界检测
        if(oLeft<-cirW){
            oLeft = -cirW;
            durationWidth = 0;
            
        }else if(oLeft>progress.offsetWidth- cirW){
            oLeft = progress.offsetWidth - cirW;
            durationWidth = progress.offsetWidth;
        }       
        //拖动实时改变进度条
        durationIcon.style.left = oLeft + 'px'; 
        duration.style.width = durationWidth + 'px';
        rate = durationWidth/progress.offsetWidth * 100;                
        video.currentTime = (rate * total_time) / 100;
    })
    //拖动结束时的处理
    durationIcon.addEventListener('touchend', function() {
        document.removeEventListener("touchmove", function(e){
            e.preventDefault();
        });
    });
})

说明:video不支持本地视频的进度拖动,会出现拖动就重头播放的情况,视频链接是网上随便找的,可能会出现请求不成功的情况。

参考api: http://www.w3school.com.cn/tags/html_ref_audio_video_dom.asp

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 230,431评论 6 544
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 99,637评论 3 429
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 178,555评论 0 383
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 63,900评论 1 318
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 72,629评论 6 412
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 55,976评论 1 328
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 43,976评论 3 448
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 43,139评论 0 290
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 49,686评论 1 336
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 41,411评论 3 358
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 43,641评论 1 374
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 39,129评论 5 364
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 44,820评论 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 35,233评论 0 28
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 36,567评论 1 295
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 52,362评论 3 400
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 48,604评论 2 380