Skip to content

Commit 80df39e

Browse files
author
Yuri Brunetto
committed
complete wesbos#11
1 parent 9347631 commit 80df39e

3 files changed

Lines changed: 80 additions & 0 deletions

File tree

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 type="button" name="fullscreen" class="player__button">FS</button>
2223
</div>
2324
</div>
2425

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
// elements
2+
const player = document.querySelector('.player')
3+
const video = player.querySelector('.viewer')
4+
const progress = player.querySelector('.progress')
5+
const progressBar = player.querySelector('.progress__filled')
6+
const toggle = player.querySelector('.toggle')
7+
const skipButtons = player.querySelectorAll('[data-skip]')
8+
const ranges = player.querySelectorAll('.player__slider')
9+
const fullscreen = player.querySelector('button[name="fullscreen"]')
10+
11+
// functions
12+
function togglePlay() {
13+
const method = video.paused ? 'play' : 'pause'
14+
video[method]()
15+
}
16+
17+
function updateButton() {
18+
const icon = this.paused ? '►' : '❚ ❚'
19+
toggle.textContent = icon
20+
}
21+
22+
function skip() {
23+
video.currentTime += parseFloat(this.dataset.skip)
24+
}
25+
26+
function handleRangeUpdate() {
27+
video[this.name] = this.value
28+
}
29+
30+
function handleProgress() {
31+
const percent = (video.currentTime / video.duration) * 100
32+
progressBar.style.flexBasis = `${percent}%`
33+
}
34+
35+
function scrub(e) {
36+
const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration
37+
video.currentTime = scrubTime
38+
}
39+
40+
function handleFullscreen() {
41+
if (!document.mozFullScreen && !document.webkitFullScreen) {
42+
if (video.mozRequestFullScreen) {
43+
video.mozRequestFullScreen();
44+
} else {
45+
video.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT);
46+
}
47+
} else {
48+
if (document.mozCancelFullScreen) {
49+
document.mozCancelFullScreen();
50+
} else {
51+
document.webkitCancelFullScreen();
52+
}
53+
}
54+
}
55+
56+
// event listeners
57+
video.addEventListener('click', togglePlay)
58+
video.addEventListener('play', updateButton)
59+
video.addEventListener('pause', updateButton)
60+
video.addEventListener('timeupdate', handleProgress)
61+
62+
toggle.addEventListener('click', togglePlay)
63+
64+
skipButtons.forEach(button => button.addEventListener('click', skip))
65+
66+
ranges.forEach(range => range.addEventListener('change', handleRangeUpdate))
67+
ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate))
68+
69+
let mouseDown = false
70+
progress.addEventListener('click', scrub)
71+
progress.addEventListener('mousemove', (e) => mouseDown && scrub(e))
72+
progress.addEventListener('mousedown', () => mouseDown = true)
73+
progress.addEventListener('mouseup', () => mouseDown = false)
74+
75+
fullscreen.addEventListener('click', handleFullscreen)

11 - Custom Video Player/style.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ body {
2929
.player__video {
3030
width: 100%;
3131
}
32+
.player__video:-webkit-full-screen {
33+
width: 100%;
34+
height: 100%;
35+
}
3236

3337
.player__button {
3438
background:none;

0 commit comments

Comments
 (0)