iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
0
自我挑戰組

前端新手的學習筆記系列 第 26

Day26:每天一個小練習 - JS30-11-Custom Video Player

  • 分享至 

  • xImage
  •  

參考資料:
Alex老師的教學
PJCHENder筆記
一起挑戰 JavaScript 30 吧!

自訂影片播放器。


如果沒有特殊的畫面要求,可以使用最簡單用法,HTML的<video>加上 controls,就會自動產生控制列。

<video class="player__video viewer" src="影片位置" controls>
</video>

但這個題目就是用來練習的,讓我們繼續看下去。


先放入節點

const player = document.querySelector('.player'); 
const video = player.querySelector('.viewer'); //video
const progress = player.querySelector('.progress'); //進度條-影片
const progressBar = player.querySelector('.progress__filled'); //影片進度條進度
const toggle = player.querySelector('.toggle'); //開始按鈕
const skipButtons = player.querySelectorAll('.skip'); //時間前進後退按鈕
const ranges = player.querySelectorAll('.player__slider'); //進度條-聲音,速度

開始和停止

let togglePlay = () => {
    // video.play();//開始
    // video.pause();//暫停

    // 先確認是play還是pause
    const method = video.paused ? 'play' : 'pause';
    video[method](); //使用中括號取物件屬性,並直接呼叫

    // 效果和以下相同
    // if (video.paused) {
    //     video.play();
    // } else {
    //     video.pause();
    // }
};
video.addEventListener('click', togglePlay); //點擊影片本身
toggle.addEventListener('click', togglePlay); //點擊按鈕

按鈕要跟隨影片狀態

// 跟隨影片啟動或暫停的按鈕圖案
function updateBtn() {
    const icon = this.paused ? '►' : '❚ ❚';
    toggle.textContent = icon;
}
video.addEventListener('play', updateBtn);
video.addEventListener('pause', updateBtn);

影片進度條

let processHandler = () => {
    // console.log(video.currentTime);//以秒為單位回傳當前播放時間
    // console.log(video.duration);//以秒為單位的總長度
    const percent = (video.currentTime / video.duration) * 100;
    // console.log(percent);
    progressBar.style.flexBasis = `${percent}%`;
    // flex-basis
};
video.addEventListener('timeupdate', processHandler);
//當 video.currentTime 改變時觸發

點擊改變影片進度

let progressChang = e => {
    const changeTime = (e.offsetX / progress.offsetWidth) * video.duration;
    // console.log(e.offsetX); //在x軸上的移動
    // console.log(progress.offsetWidth);//進度條寬度
    // console.log(changeTime);
    video.currentTime = changeTime;
};
// 點擊改變進度條
progress.addEventListener('click', progressChang);
// 拖曳改變進度條
let mouseDown = false;
progress.addEventListener('mousemove', e => {
    mouseDown && progressChang(e);
});
progress.addEventListener('mousedown', () => {
    mouseDown = true;
});
progress.addEventListener('mouseup', () => {
    mouseDown = false;
});

快轉或後退

function skip() {
    video.currentTime += parseFloat(this.dataset.skip);
}
skipButtons.forEach(item => {
     item.addEventListener('click', skip);
});

音量和播放速度

function rangeUpdateHandler(e) {
    video[this.name] = this.value;
    //  video[e.target.name] = e.target.value;//這樣寫也一樣
    // console.log(this.value);
    // console.log(e.target.value);
}
ranges.forEach(item => {
    item.addEventListener('input', rangeUpdateHandler);
});
// 當元素的value改變,input事件都會被觸發

連結


上一篇
Day25:每天一個小練習 - JS30-10-Hold Shift and Check Checkboxes
下一篇
Day27:每天一個小練習 - JS30-12-Key Sequence Detection
系列文
前端新手的學習筆記32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言