Skip to content

Commit f60d85e

Browse files
committed
1 parent 9f6661a commit f60d85e

File tree

3 files changed

+77
-0
lines changed

3 files changed

+77
-0
lines changed

11 - Custom Video Player/index.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
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 class="player__button fullscreen"></button>
2223
</div>
2324
</div>
2425

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
const player = document.querySelector('.player');
2+
const video = player.querySelector('.viewer');
3+
const progress = player.querySelector('.progress');
4+
const progressBar = player.querySelector('.progress__filled');
5+
const toggle = player.querySelector('.toggle');
6+
const skipButtons = player.querySelectorAll('[data-skip]');
7+
const ranges = player.querySelectorAll('.player__slider');
8+
const fullscreen = player.querySelector('.fullscreen');
9+
10+
// play/pause
11+
function toggleVideo() {
12+
if (video.paused) {
13+
video.play();
14+
} else {
15+
video.pause();
16+
}
17+
}
18+
video.addEventListener('click', toggleVideo);
19+
toggle.addEventListener('click', toggleVideo);
20+
21+
function updateButton() {
22+
if (video.paused) {
23+
toggle.innerHTML = '🎭';
24+
} else {
25+
toggle.innerHTML = '✋';
26+
}
27+
}
28+
updateButton();
29+
video.addEventListener('pause', updateButton);
30+
video.addEventListener('play', updateButton);
31+
32+
// skip buttons
33+
function skip() {
34+
video.currentTime += parseFloat(this.dataset.skip);
35+
}
36+
skipButtons.forEach(e => e.addEventListener('click', skip));
37+
38+
// progress bar
39+
function handleProgress() {
40+
const pct = video.currentTime / video.duration;
41+
progressBar.style.flexBasis = (pct * 100).toString() + '%';
42+
}
43+
video.addEventListener('timeupdate', handleProgress);
44+
45+
let scrollOn = false;
46+
function scrubTo(e) {
47+
if (scrollOn) {
48+
const pct = e.offsetX / progress.offsetWidth;
49+
video.currentTime = pct * video.duration;
50+
}
51+
}
52+
progress.addEventListener('mousedown', () => { scrollOn = true; });
53+
progress.addEventListener('mouseup', () => { scrollOn = false; });
54+
progress.addEventListener('mouseout', () => { scrollOn = false; });
55+
progress.addEventListener('mousemove', scrubTo);
56+
progress.addEventListener('click', scrubTo);
57+
58+
// range slider (volume & speed)
59+
function rangeUpdate() {
60+
video[this.name] = this.value;
61+
}
62+
ranges.forEach(e => e.addEventListener('change', rangeUpdate));
63+
64+
// fullscreen
65+
function toggleFullscreen() {
66+
video.classList.toggle('player__video__fullscreen');
67+
}
68+
fullscreen.addEventListener('click', toggleFullscreen);

11 - Custom Video Player/style.css

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@ body {
3030
width: 100%;
3131
}
3232

33+
.player__video__fullscreen {
34+
position: fixed; right: 0; bottom: 0;
35+
min-width: 100%; min-height: 100%;
36+
width: auto; height: auto; z-index: -100;
37+
background: url(polina.jpg) no-repeat;
38+
background-size: cover;
39+
}
40+
3341
.player__button {
3442
background:none;
3543
border:0;

0 commit comments

Comments
 (0)