JS30 day11 - Custom HTML5 Video Player
作業內容
今天要做出客制化的 video player,包括播放鍵 / 可以拉動影片進度條等等…
學到什麼
-
CSS
.player:fullscreen
這只有在全螢幕的時候會有用
-
JS
- 影片有個屬性叫做
paused
,影片播放或暫停的方法叫做play()
跟pause()
,很直觀
1
2
3
4
5
6
7function togglePlay(){
if(video.paused){
video.play();
}else{
video.pause();
}
}- 影片有個屬性叫做現在播放的時間
currentTime
,JS 裡面把字串轉數字使用parseFloat
,稍微查了一下發現還可以使用Number()
,但是他有時候會出現 NaN,所以用 parse 比較安全
參考資料:https://gomakethings.com/converting-strings-to-numbers-with-vanilla-javascript/
1
2
3function skip(){
video.currentTime += parseFloat(this.dataset.skip)
}- 如果要改變影片屬性,可以很直觀地像下面這樣使用,在這次例子中,可以用同一行使用在音量或者播放速度上面
1
2
3function handleRangeUpdate(){
video[this.name] = this.value
}- 這個例子中的進度條,使用 flexbasis 這個 CSS 屬性改變鄉端寬度,日後可以參考,另外影片的 duration 屬性代表這個影片的全長
1
2
3
4function handleProgress(){
const percent = (video.currentTime / video.duration) * 100;
progressBar.style.flexBasis = `${percent}%`;
}- 這裏的
progress.offsetWidth
代表這個物件的總寬度
1
2
3
4function scrub(e){
const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration
video.currentTime = scrubTime
}- 在 JS 裡面的物件都是 hash 的形式,因此下面兩個方法是一樣的,
video.play
拿到的屬性等於video[play]
拿到的屬性,只是這個屬性是一個方法
1
2
3
4
5
6
7
8
9
10
11
12function togglePlay(){
if(video.paused){
video.play();
}else{
video.pause();
}
}
// 效果等同於下面的
function togglePlay(){
const method = video.paused ? 'play' : 'pause';
video[method]();
}- 因為想做出可以拉動影片長度的效果,所以除了監聽
mousemove
事件之外,還要有mousedown
才會觸動事件,因此寫成下面這樣
1
2
3
4
5
6
7
8
9let mousedown = false;
progress.addEventListener('click', scrub)
progress.addEventListener('mousemove', (e)=>{
if(mousedown){
scrub(e);
}
})
progress.addEventListener('mousedown', () => mousedown = true)
progress.addEventListener('mouseup', () => mousedown = false)- 同時監聽
mousedown
跟mousemove
又可以寫成下面那種樣子,如果 mousedown 是 true 就會觸發scrub()
function
1
2
3
4
5
6
7progress.addEventListener('mousemove', (e)=>{
if(mousedown){
scrub(e);
}
})
// 效果等同於下面的
progress.addEventListener('mousemove', (e) => mousedown && scrub(e)) - 影片有個屬性叫做
參考資料:
https://github.com/wesbos/JavaScript30
code 內容:
HTML:
1 | <div class="player"> |
CSS:
1 | html { |
JS:
1 | // get element |