H5移動端自定義video播放控件controls(帶播放暫停怀跛,進(jìn)度條拖拽)

效果圖如下

GIF.gif

html結(jié)構(gòu)部分

<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,//鼠標(biāo)相對于拖拽圓點的偏移距離
    //滑塊寬度的一半
    cirW = durationIcon.offsetWidth/2,
    rate,
    total_time,//視頻總時長
    current_time; //現(xiàn)在時間
//當(dāng)瀏覽器能夠開始播放指定的視頻時      
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;
    //顯示當(dāng)前播放時間
    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;
        //顯示當(dāng)前播放進(jìn)度條
        var new_width = (current_time/total_time)*progress.offsetWidth;
        duration.style.width = new_width + "px";
        durationIcon.style.left = (new_width - cirW) + 'px';    
    })
    //播放結(jié)束時
    video.addEventListener("ended",function(){
        playBtn.classList.remove('pause');
    })
    //移動端進(jìn)度條拖動
    durationIcon.addEventListener('touchstart',function(e){
        var ev = e || window.event;
        var touch = ev.targetTouches[0];        
        oL = touch.clientX - durationIcon.offsetLeft - progress.offsetLeft;//鼠標(biāo)相對于拖拽圓點的偏移距離     
    })
    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;
        }       
        //拖動實時改變進(jìn)度條
        durationIcon.style.left = oLeft + 'px'; 
        duration.style.width = durationWidth + 'px';
        rate = durationWidth/progress.offsetWidth * 100;                
        video.currentTime = (rate * total_time) / 100;
    })
    //拖動結(jié)束時的處理
    durationIcon.addEventListener('touchend', function() {
        document.removeEventListener("touchmove", function(e){
            e.preventDefault();
        });
    });
})

說明:video不支持本地視頻的進(jìn)度拖動,會出現(xiàn)拖動就重頭播放的情況相叁,視頻鏈接是網(wǎng)上隨便找的遵绰,可能會出現(xiàn)請求不成功的情況。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末增淹,一起剝皮案震驚了整個濱河市椿访,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埠通,老刑警劉巖赎离,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異端辱,居然都是意外死亡梁剔,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門舞蔽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來荣病,“玉大人,你說我怎么就攤上這事渗柿「雠瑁” “怎么了脖岛?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颊亮。 經(jīng)常有香客問我柴梆,道長,這世上最難降的妖魔是什么终惑? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任绍在,我火速辦了婚禮,結(jié)果婚禮上雹有,老公的妹妹穿的比我還像新娘偿渡。我一直安慰自己,他們只是感情好霸奕,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布溜宽。 她就那樣靜靜地躺著,像睡著了一般质帅。 火紅的嫁衣襯著肌膚如雪适揉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天临梗,我揣著相機(jī)與錄音涡扼,去河邊找鬼。 笑死盟庞,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的汤善。 我是一名探鬼主播什猖,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼红淡!你這毒婦竟也來了不狮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤在旱,失蹤者是張志新(化名)和其女友劉穎摇零,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體桶蝎,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡驻仅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了登渣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片噪服。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖胜茧,靈堂內(nèi)的尸體忽然破棺而出粘优,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布雹顺,位于F島的核電站丹墨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嬉愧。R本人自食惡果不足惜贩挣,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望英染。 院中可真熱鬧揽惹,春花似錦、人聲如沸四康。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闪金。三九已至疯溺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哎垦,已是汗流浹背囱嫩。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留漏设,地道東北人墨闲。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像郑口,于是被迫代替她去往敵國和親鸳碧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355