Visitar URL original
11 finis · wesbos/JavaScript30@27f2544 · GitHub
Skip to content

Commit 27f2544

Browse files
committed
11 finis
1 parent 0ea26f2 commit 27f2544

1 file changed

Lines changed: 82 additions & 2 deletions

File tree

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,86 @@
11
/* get the elements */
2+
const player = document.querySelector('video');
3+
const controls = document.querySelector('.player__controls');
4+
const toggle = document.querySelector('button.player__button.toggle');
25

6+
const progressBar = document.querySelector('.progress__filled');
7+
const progressSlider = document.querySelector('.progress');
38

4-
/* make the functions */
9+
const ranges = document.querySelectorAll('.player__slider');
10+
const skipButtons = document.querySelectorAll('[data-skip]');
511

6-
/* hook up with event listeners */
12+
let mouseActive = false;
13+
14+
/* Build out the functions */
15+
16+
// stop/play the video
17+
function togglePlay(video) {
18+
const method = video.paused ? 'play' : 'pause';
19+
video[method]();
20+
}
21+
22+
// update play button icon based on video play state
23+
function updatePlayButton(video, button) {
24+
const icon = video.paused ? '►' : '❚ ❚';
25+
button.textContent = icon;
26+
}
27+
28+
// update progress bar based on current video state
29+
function handleProgress(video, bar) {
30+
const percent = (video.currentTime / video.duration) * 100;
31+
bar.style.flexBasis = `${percent}%`;
32+
}
33+
34+
// update video based on progress bar scrubbing
35+
function scrub(e, video, range) {
36+
if (mouseActive) {
37+
const scrubTime = (e.offsetX / range.offsetWidth) * video.duration;
38+
video.currentTime = scrubTime;
39+
}
40+
}
41+
42+
// slide volume or playback speed
43+
function handleRangeUpdate(slider, video) {
44+
if (mouseActive) {
45+
video[slider.name] = slider.value;
46+
}
47+
}
48+
49+
// skip back or forward on the video
50+
function skip(video) {
51+
video.currentTime += parseFloat(this.dataset.skip);
52+
}
53+
54+
/* hook up event listeners */
55+
player.addEventListener('click', togglePlay.bind(null, player));
56+
toggle.addEventListener('click', togglePlay.bind(null, player));
57+
player.addEventListener('play', updatePlayButton.bind(null, player, toggle));
58+
player.addEventListener('pause', updatePlayButton.bind(null, player, toggle));
59+
60+
// can also use event called 'progress'
61+
player.addEventListener('timeupdate', handleProgress.bind(null, player, progressBar));
62+
progressSlider.addEventListener('click', (e) => {
63+
mouseActive = true;
64+
scrub(e, player, progressSlider);
65+
});
66+
progressSlider.addEventListener('mousemove', (e) => {
67+
scrub(e, player, progressSlider);
68+
});
69+
progressSlider.addEventListener('mousedown', () => mouseActive = true);
70+
progressSlider.addEventListener('mouseup', () => mouseActive = false);
71+
progressSlider.addEventListener('mouseout', () => mouseActive = false);
72+
73+
ranges.forEach(range => range.addEventListener('change', () => {
74+
mouseActive = true;
75+
handleRangeUpdate.bind(range, player);
76+
}));
77+
ranges.forEach(range => range.addEventListener('mousedown', () => mouseActive = true));
78+
ranges.forEach(range => range.addEventListener('click', () => {
79+
mouseActive = true;
80+
handleRangeUpdate.call(null, range, player);
81+
}));
82+
ranges.forEach(range => range.addEventListener('mouseup', () => mouseActive = false));
83+
ranges.forEach(range => range.addEventListener('mouseout', () => mouseActive = false));
84+
ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate.bind(null, range, player)));
85+
86+
skipButtons.forEach(button => button.addEventListener('click', skip.bind(button, player)));

0 commit comments

Comments
 (0)