国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > HTML > 正文

從零實(shí)現(xiàn)一個(gè)自定義html5播放器的示例代碼

2024-08-26 00:19:50
字體:
供稿:網(wǎng)友

本次的分享是一個(gè)基于HTML5標(biāo)簽實(shí)現(xiàn)的一個(gè)自定義視頻播放器。其中實(shí)現(xiàn)了播放暫停、進(jìn)度拖拽、音量控制及全屏等功能。

效果預(yù)覽

html5自定義播放器,html自定義音樂播放器,html自定義播放器

點(diǎn)我查看 源碼倉庫 。

核心思路

我相信一定會(huì)有些沒有接觸過制作自定義播放器的童鞋對(duì)于 標(biāo)簽的認(rèn)識(shí)會(huì)停留在此。

<video controls="controls" autoplay="autoplay">  <source src="movie.ogg" type="video/ogg" /></video>

其中controls屬性經(jīng)過設(shè)定,會(huì)在界面中顯示一個(gè)瀏覽器自帶的控制條。如果對(duì)于UI沒有要求的需求,其內(nèi)置控制器已經(jīng)可以滿足大部分的需求。當(dāng)然了如果是這樣你們也不會(huì)看到這篇分享了=。=

隱藏控制條并模擬

那么實(shí)現(xiàn)一個(gè)自定義功能的播放器關(guān)鍵就在于,我們不使用原生的控制器,將其隱藏掉之后,在下方同樣的位置通過html、css來模擬所需樣式,同時(shí)通過js來調(diào)用vedio標(biāo)簽所暴露給我們的接口函數(shù)及屬性,以及檢測(cè)用戶的操作行為來同步的模擬UI與視頻播放數(shù)據(jù)的相應(yīng)變化。

幾個(gè)核心函數(shù)及屬性的用法

myVid=document.getElementById("video1");//控制視頻開關(guān)myVid.play() //播放myVid.pause() //暫停//模擬視頻進(jìn)度條myVid.currentTime=5; //返回或設(shè)定當(dāng)前視頻播放位置myVid.duration // 返回視頻總長(zhǎng)度//模擬視頻音量myVid.volume //音量//獲取視頻當(dāng)前狀態(tài)后判斷何時(shí)從loading切換為播放myVid.readyState//0 = HAVE_NOTHING - 沒有關(guān)于音頻/視頻是否就緒的信息//1 = HAVE_METADATA - 關(guān)于音頻/視頻就緒的元數(shù)據(jù)//2 = HAVE_CURRENT_DATA - 關(guān)于當(dāng)前播放位置的數(shù)據(jù)是可用的,但沒有足夠的數(shù)據(jù)來播放下一幀/毫秒//3 = HAVE_FUTURE_DATA - 當(dāng)前及至少下一幀的數(shù)據(jù)是可用的//4 = HAVE_ENOUGH_DATA - 可用數(shù)據(jù)足以開始播放

在所有實(shí)現(xiàn)中的關(guān)鍵點(diǎn),較為繁瑣的是對(duì)于進(jìn)度條的模擬。其中使用了video標(biāo)簽中的currentTime以及duration屬性,通過當(dāng)前播放時(shí)間與總播放時(shí)間的比值,就可以計(jì)算出進(jìn)度條相對(duì)于總長(zhǎng)的位置。同時(shí)用戶通過拖拽進(jìn)度條所最后設(shè)置的長(zhǎng)度也可以用來反向推算出此時(shí)視頻應(yīng)該播放的位置。

拖拽代碼思路

//核心代碼示例var dragDis = 0var processWidth = xxx //拖拽條總長(zhǎng)$('body').mousedown(function(e) {    startX = e.clientX    dragDis = startX - leftInit //leftInit為拖拽條起始點(diǎn)巨屏幕左側(cè)的距離    dragTarget.css({ //拖拽按鈕        left: dragDis    })    dragProcess.css({ //進(jìn)度條(藍(lán)色進(jìn)度條)        width: dragDis    }) // 令進(jìn)度條和拖拽按鈕渲染在同一位置    videoSource.pause()}).mousemove(function(e) {    moveX = e.clientX    disX = moveX - startX    var left = dragDis + disX    if(left > processWidth) {        left = processWidth    } else if(left < 0) {        left = 0    }    dragTarget.css({        left: left    })    dragProcess.css({        width: left    })}).mouseup(function(e) {    videoSource.play()    videoSource.currentTime = $('藍(lán)色拖拽條').width() / processWidth * duration //拖拽后計(jì)算視頻的正確播放位置})

同理音量的控制與其上行為基本一致,故在源碼中作者將音量與進(jìn)度部分通過不同元素進(jìn)行判斷是進(jìn)行進(jìn)度還是音量的拖拽控制。

通過查詢視頻流狀態(tài)控制播放前的加載動(dòng)畫

function ifState() {    var state = videoSource.readyState    if(state === 4) { //狀態(tài)為4即可播放        videoPlayer()    } else {        $('.play-sym-wrapper').remove()        $('body').append('<div class="play-sym-wrapper"><img class="play-sym" src="./images/loading.gif"></div>')        //添加loading動(dòng)畫        setTimeout(ifState, 10)    }}setTimeout(ifState, 10)

核心的控制部分已經(jīng)說完了,有興趣的同學(xué)可以去源碼的html中點(diǎn)擊播放,其中被迫有很多零碎的需求,比如點(diǎn)擊暫停,保存音量等等。整個(gè)視頻播放器的基礎(chǔ)功能實(shí)現(xiàn)的還算完善。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到HTML教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 高邮市| 英山县| 方城县| 夏河县| 鹤壁市| 刚察县| 临沭县| 团风县| 兴隆县| 北宁市| 双流县| 宝鸡市| 甘德县| 庆阳市| 锡林郭勒盟| 奈曼旗| 嘉义县| 威海市| 正蓝旗| 临桂县| 南岸区| 新乡县| 定南县| 虹口区| 和田县| 临高县| 常熟市| 千阳县| 芮城县| 确山县| 龙州县| 舞阳县| 凌源市| 读书| 威远县| 嘉鱼县| 新丰县| 阿拉善盟| 黎川县| 浮山县| 扶绥县|