基于JavaScript構(gòu)建高級視頻播放器
前言
在當(dāng)今數(shù)字化的時(shí)代,視頻內(nèi)容在我們的日常生活中扮演著至關(guān)重要的角色。無論是在線教育、娛樂還是信息傳播,一個(gè)能夠滿足用戶需求的播放器都能極大地提升用戶體驗(yàn)。
html部分
首先我們頁面是這樣的。
視頻上方有一個(gè)文件輸入框,視頻居中在頁面上。視頻的右邊有一個(gè)滑塊,用來控制視頻的播放速度;滑塊上的數(shù)值為播放速率。
<main class="container"> <label for="file-upload" class="custom-file-upload"> <input type="file" id="file-upload" accept="video/*"> 上傳視頻 </label> <div id="video-container"> <div class="wrapper"> <!-- 行內(nèi)塊元素 --> <video src="" width="765" height="430" controls id="video"></video> <div class="speed"> <div class="speed-bar">1x</div> </div> </div> </div> </main>
思路
首先我們用wrapper盒子包括視頻和滑塊,再用container盒子包括wrapper盒子和文件輸入框。這樣我們就有大概的html框架思路。
- container盒子的標(biāo)簽我們使用main而不使用div,是因?yàn)閙ian更具有語義化,表示這個(gè)頁面的主體內(nèi)容。
- label標(biāo)簽用于將表單中的輸入元素(如文本輸入框、單選按鈕、復(fù)選框等)與相關(guān)的文本描述關(guān)聯(lián)起來。label標(biāo)簽通過將 for 屬性值設(shè)置為輸入元素的 id 屬性值,建立與輸入元素的關(guān)聯(lián)。
- 在input標(biāo)簽中type="file"表示該輸入框?yàn)槲募斎肟颉ccept="video/*"表示該文件輸入框只接收視頻文件。
- video標(biāo)簽的controls表示顯示視頻控制器。
css部分
首先在寫css代碼的第一步就是清除所有標(biāo)簽的默認(rèn)內(nèi)邊距和外邊距。
* { margin: 0; padding: 0; }
然后我們?yōu)榱俗屛覀兊捻撁娓每?,我們可以添加頁面背景,我們要將背景添加到body標(biāo)簽中才能覆蓋整個(gè)頁面。
body { background-image: url(./11.jpg); background-size: 100%; }
我們看wrapper盒子里的css樣式。
.wrapper { /* 固定定位,以瀏覽器屏幕(可視窗口)為參考系 */ position: fixed; /* 相對于瀏覽器屏幕向左移動百分之五十 */ left: 50%; top: 50%; transform: translate(-50%, -50%); display: flex; }
為了讓將 .wrapper元素固定在瀏覽器窗口的中央位置。
- 首先給.wrapper元素相對于瀏覽器窗口進(jìn)行定位
- 將元素的左側(cè)和頂部定位到窗口的 50% 位置
- 使用 translate 方法將元素在水平和垂直方向上各移動自身寬度和高度的 50%,以實(shí)現(xiàn)居中效果。
display: flex; 將元素設(shè)置為 Flex 布局,允許在該元素內(nèi)進(jìn)行靈活的子元素排列。
滑塊的css樣式
.speed { width: 50px; height: 430px; background-color: #fff; border-radius: 50px; /* 允許內(nèi)容溢出并隱藏 */ overflow: hidden; } .speed-bar { width: 100%; height: 16%; background: linear-gradient(to bottom, #2376ae, #c16ecf); display: flex; justify-content: center; align-items: center; cursor: pointer; }
.speed-bar元素生成了一個(gè)從頂部的#2376ae 到底部的#c16ecf 的線性漸變。
background: linear-gradient(to bottom, #2376ae, #c16ecf);
使用 flex 布局,使子元素在水平和垂直方向上居中對齊。
display: flex; justify-content: center; align-items: center;
設(shè)置鼠標(biāo)指針為指針樣式
cursor: pointer;
JavaScript部分
我們現(xiàn)在還不知道要視頻的URL,我們要獲得視頻的URL并且賦值給id為"video"的video標(biāo)簽的src屬性。
const fileUpload = document.getElementById('file-upload'); const video = document.getElementById('video'); fileUpload.addEventListener('change', function (e) { const file = e.target.files[0]; const reader = new FileReader(); reader.onload = function (e2) { video.src = e2.target.result; } reader.readAsDataURL(file) })
首先我們是思路是這樣:
- 首先我們創(chuàng)建一個(gè)fileUpload對象獲取#file-upload元素,創(chuàng)建一個(gè)video對象獲取#video元素
- 對fileUpload對象添加一個(gè)change事件監(jiān)聽,實(shí)現(xiàn)當(dāng)用戶更改上傳文件時(shí),觸發(fā)事件處理函數(shù)function(e)實(shí)現(xiàn)讀取文件并且使video標(biāo)簽獲取視頻的URL。
- function(e)里的function(e2)函數(shù)是在讀取完文件后使video標(biāo)簽獲取視頻的URL。
接下來我們要通過JavaScript實(shí)現(xiàn)當(dāng)鼠標(biāo)在 .speed元素上移動時(shí),實(shí)時(shí)根據(jù)鼠標(biāo)的位置來調(diào)整 .speed-bar 元素的高度,并同步更新視頻的播放速度。
var speed = document.querySelector('.speed') var speedBar = document.querySelector('.speed-bar') speed.addEventListener('mousemove', function (e) { var y = e.pageY - speed.getBoundingClientRect().top var percent = y / speed.offsetHeight var height = Math.round(percent * 100) + '%' speedBar.style.height = height var min = 0.4 var max = 4 var palySpeed = percent * (max - min) + min speedBar.textContent = palySpeed.toFixed(2) + 'x' video.playbackRate = palySpeed })
首先獲取頁面上具有 .speed'類和.speed-bar的元素
為 speed 元素添加鼠標(biāo)移動事件監(jiān)聽器
- 獲取鼠標(biāo)在 speed 元素上的垂直位置(相對于元素頂部)
- 計(jì)算垂直位置占 speed 元素高度的百分比
- 將百分比轉(zhuǎn)換為實(shí)際的高度值,并取整后加上 '%' 符號
- 使用 JavaScript 修改 speedBar 元素的高度為計(jì)算得到的高度
- 設(shè)置最小和最大播放速度范圍,根據(jù)百分比計(jì)算實(shí)際的播放速度,將播放速度顯示在 speedBar 元素的文本內(nèi)容中
- 將視頻的播放速度設(shè)置為計(jì)算得到的播放速度
效果展示
快動手制作一個(gè)屬于自己的視頻播放器吧。
到此這篇關(guān)于基于JavaScript構(gòu)建高級視頻播放器的文章就介紹到這了,更多相關(guān)JavaScript視頻播放器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Js實(shí)現(xiàn)網(wǎng)頁鍵盤控制翻頁的方法
這篇文章主要介紹了Js實(shí)現(xiàn)網(wǎng)頁鍵盤控制翻頁的方法,較為詳細(xì)的分析了Js實(shí)現(xiàn)網(wǎng)頁鍵盤控制翻頁的原理與具體實(shí)現(xiàn)方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-10-10如何用js實(shí)現(xiàn)判斷是否是小數(shù)
這篇文章主要給大家介紹了關(guān)于如何用js實(shí)現(xiàn)判斷是否是小數(shù)的相關(guān)資料,文中介紹了如何通過使用isNaN()函數(shù)和使用正則表達(dá)式來解決,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2024-04-04JavaScript中offsetWidth的bug及解決方法
這篇文章主要為大家詳細(xì)介紹了JavaScript中offsetWidth的bug及解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05js實(shí)現(xiàn)鍵盤Enter鍵提交表單的方法
這篇文章主要介紹了js實(shí)現(xiàn)鍵盤Enter鍵提交表單的方法,涉及javascript鍵盤事件的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05SOSO地圖API使用(一)在地圖上畫圓實(shí)現(xiàn)思路與代碼
最近在做SOSO地圖相關(guān)開發(fā),遇到相關(guān)畫圓知識,特此簡單記錄下來,接下來講解如何在在地圖上畫圓,感興趣的朋友可以了解下2013-01-01setInterval 和 setTimeout會產(chǎn)生內(nèi)存溢出
jscript 5.7 發(fā)布修復(fù)了不少ie javascript內(nèi)存泄露的問題。但是leak依然存在。當(dāng)我們頻繁使用 setInterval 和 setTimeout 時(shí)就會每幾秒鐘出現(xiàn)32k leak...2008-02-02JS+AJAX實(shí)現(xiàn)省市區(qū)的下拉列表聯(lián)動
這篇文章主要為大家詳細(xì)介紹了JS+AJAX實(shí)現(xiàn)省市區(qū)的下拉列表聯(lián)動,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09