利用 <video>
標籤,實作影片播放器的基礎功能
<video>
(MDN) 對照文字事件會比較清楚,分別有用到 controls
, currenTime
, duration
, paused
, playbackRate
, valume
, Methods : pause()
, play()
, Events : play
, pause
。
function
拆分為不同功能,並依事件去觸發行為,日後維護與擴展會比較好找方向。中括號
取值的可以借此機會加深對這部分的理解。。function
控制影片開始與暫停
利用三元運算子判斷 paused
,再用中括號取 key
值,之後直接呼叫
function toggleHandler() {
const method = video.paused ? 'play' : 'pause';
video[method]();
}
修改按鈕開始和暫停的樣式
影片往前/倒退
利用 data-set
傳值給 currentTime
改變影片時間
function skipHandler() {
video.currentTime += parseFloat(this.dataset.skip); // 轉數值parseFloat
}
控制聲音與影片速度
在 input
放了 name
屬性,透過中括號來設定對應屬性的值
function rangeUpdateHandler() {
video[this.name] = this.value;
}
更新影片進度條
計算影片長度:利用 currentTime
(現在時間)/ duration
(總時間) * 100 得到長度的百分比
修改預設寬度:把得到的百分比給 flexBasis
(預設寬度)
function progressHandler() {
const percent = (video.currentTime / video.duration) * 100;
progressBar.style.flexBasis = `${percent}%`;
}
點擊進度條更新影片時間
計算影片時間:利用 e.offsetX
(點擊到x的座標)/ offsetWidth
(整個長度) * duration
(總時間)
修改影片時間:把得到的百分比給 currentTime
function scrubHandler(e) {
const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration;
video.currentTime = scrubTime;
}
滑鼠移動時更新進度條
利用 mousemove
來觸發更新進度條,&&
等於前面是對的,就會往後做
progress.addEventListener('mousemove', (e) => mousedown && scrubHandler(e));// && 等於前面是對的,就會往後做
progress.addEventListener('mousedown', () => mousedown = true);
progress.addEventListener('mouseup', () => mousedown = false);
控制影片開始/暫停
// 開始暫停控制
video.addEventListener('click', toggleHandler);
toggle.addEventListener('click', toggleHandler);
// 被觸發的開始暫停事件
video.addEventListener('play', updateButton);
video.addEventListener('pause', updateButton)
更新進度條
video.addEventListener('timeupdate', progressHandler);
影片往前或倒退
skipBtns.forEach(btn => btn.addEventListener("click", skipHandler));
控制聲音與影片速度
ranges.forEach(range => range.addEventListener("change", rangeUpdateHandler));
ranges.forEach(range => range.addEventListener("mousemove", rangeUpdateHandler));
控制進度條
let mousedown = false;
progress.addEventListener('click', scrubHandler);
progress.addEventListener('mousemove', (e) => mousedown && scrubHandler(e)); // && 等於兩個 T 才回傳,所以第一個是 F 就不會觸發
progress.addEventListener('mousedown', () => mousedown = true);
progress.addEventListener('mouseup', () => mousedown = false);
<video>
:裡面有 controls
可以加,加了就有基礎功能了 XD&&
:前面是對的就會往後做||
:前面是錯的就會往後做