Skip to content

Commit bb7582e

Browse files
committed
Ex11 - Video player
1 parent 21b0813 commit bb7582e

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

11 - Custom Video Player/index.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
<div class="progress__filled"></div>
1616
</div>
1717
<button class="player__button toggle" title="Toggle Play"></button>
18-
<input type="range" name="volume" class="player__slider" min=0 max="1" step="0.05" value="1">
18+
<input type="range" name="volume" class="player__slider" min="0" max="1" step="0.05" value="1">
1919
<input type="range" name="playbackRate" class="player__slider" min="0.5" max="2" step="0.1" value="1">
2020
<button data-skip="-10" class="player__button">« 10s</button>
2121
<button data-skip="25" class="player__button">25s »</button>
22+
<button id="fullscreen" class="player__button">[full]</button>
2223
</div>
2324
</div>
2425

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
'use strict';
2+
3+
// grab the elements
4+
const player = document.querySelector('.player');
5+
const video = player.querySelector('video');
6+
const progress = player.querySelector('.progress');
7+
const progressBar = player.querySelector('.progress__filled');
8+
const toggle = player.querySelector('.toggle');
9+
const ranges = player.querySelectorAll('[type="range"]');
10+
const skipButtons = player.querySelectorAll('[data-skip]');
11+
12+
13+
// functions
14+
function togglePlay() {
15+
if (video.paused) {
16+
video.play();
17+
} else {
18+
video.pause();
19+
}
20+
}
21+
22+
function togglePlayIfSpace(event) {
23+
if (event.keyCode === 32) {
24+
togglePlay();
25+
}
26+
}
27+
28+
function updateButton() {
29+
const icon = this.paused ? '►' : '❚❚';
30+
toggle.textContent = icon;
31+
}
32+
33+
function skip() {
34+
const time = Number.parseFloat(this.dataset.skip);
35+
video.currentTime += time;
36+
}
37+
38+
function handleRangeUpdate() {
39+
video[this.name] = this.value;
40+
}
41+
42+
function handleProgress() {
43+
const percentage = video.currentTime / video.duration * 100;
44+
progressBar.style.flexBasis = percentage + '%';
45+
}
46+
47+
function scrub(event) {
48+
const scrubTime = event.offsetX / progress.offsetWidth * video.duration;
49+
video.currentTime = scrubTime;
50+
}
51+
52+
// hook up the event listeners
53+
video.addEventListener('click', togglePlay);
54+
toggle.addEventListener('click', togglePlay);
55+
document.addEventListener('keydown', togglePlayIfSpace);
56+
57+
video.addEventListener('play', updateButton);
58+
video.addEventListener('pause', updateButton);
59+
video.addEventListener('timeupdate', handleProgress);
60+
61+
skipButtons.forEach(button => button.addEventListener('click', skip));
62+
ranges.forEach(range => range.addEventListener('change', handleRangeUpdate));
63+
ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate));
64+
65+
let mouseDown = false;
66+
progress.addEventListener('click', scrub);
67+
progress.addEventListener('mousemove', (event) => mouseDown && scrub(event));
68+
progress.addEventListener('mousedown', () => {mouseDown = true;});
69+
progress.addEventListener('mouseup', () => mouseDown = false);
70+
71+
72+
const fullScreenButton = document.querySelector('button#fullscreen');
73+
74+
function toggleFullScreen() {
75+
console.log(window.innerWidth, window.innerHeight);
76+
video.style.width = `${window.innerWidth}px`;
77+
video.style.height = `${window.innerHeight}px`;
78+
}
79+
80+
fullScreenButton.addEventListener('click', toggleFullScreen);

0 commit comments

Comments
 (0)