前言
本文為「JavaScript 30」教學影片的學習筆記。
目標
學習對 HTML Video 進行操作。
筆記
首先取得所有的表單元素。
1 2 3 4 5 6 7
| const player = document.querySelector('.player'); const video = player.querySelector('.viewer'); const progress = player.querySelector('.progress'); const progressBar = player.querySelector('.progress__filled'); const toggle = player.querySelector('.toggle'); const skipButtons = player.querySelectorAll('[data-skip]'); const ranges = player.querySelectorAll('.player__slider');
|
設定一個 togglePlay()
函式,以允許在滑鼠點擊影片時播放或暫停。
1 2 3 4 5 6
| function togglePlay() { const method = video.paused ? 'play' : 'pause'; video[method](); }
video.addEventListener('click', togglePlay);
|
設定一個 updateButton()
函式,以切換播放按鈕。
1 2 3 4 5 6 7
| function updateButton() { const icon = this.paused ? '►' : '❚ ❚'; toggle.textContent = icon; }
video.addEventListener('play', updateButton); video.addEventListener('pause', updateButton);
|
設定一個 skip()
函式,以快轉或倒帶影片。
1 2 3 4 5 6
| function skip() { console.log(this.dataset); video.currentTime += parseFloat(this.dataset.skip); }
skipButtons.forEach(button => button.addEventListener('click', skip));
|
- 用
dataset.skip
取得已經設定好的 data-skip
數値。
設定一個 handleRangeUpdate()
函式,以調整音量或播放速度。
1 2 3 4 5 6
| function handleRangeUpdate() { video[this.name] = this.value; }
ranges.forEach(range => range.addEventListener('change', handleRangeUpdate)); ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate));
|
volume
屬性用來設置音量。
playbackRate
屬性用來設置播放速度。
設定一個 handleProgress()
函式,以允許用滑鼠點擊的方式更改影片播放位置。
1 2 3 4 5 6
| function handleProgress() { const percent = (video.currentTime / video.duration) * 100; progressBar.style.flexBasis = `${percent}%`; }
video.addEventListener('timeupdate', handleProgress);
|
duration
屬性代表影片長度。
flexBasis
屬性用來設置項目長度。
設定一個 scrub()
函式,以允許用滑鼠拖曳的方式更改影片播放位置。
1 2 3 4 5 6 7 8 9 10 11
| function scrub(e) { const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration; video.currentTime = scrubTime; }
let mousedown = false; progress.addEventListener('mousedown', () => mousedown = true); progress.addEventListener('mousemove', (e) => mousedown && scrub(e)); progress.addEventListener('mouseup', () => mousedown = false); progress.addEventListener('click', scrub);
|
e.offsetX
屬性代表事件物件在 X 軸上的偏移量。
offsetWidth
屬性代表元素的可見寬度。