Skip to content

Commit dc496ed

Browse files
committed
Complete Day 11 - Custom Video Player
1 parent 0941d86 commit dc496ed

4 files changed

Lines changed: 78 additions & 64 deletions

File tree

11 - Custom Video Player/index.html

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,13 @@
1414
<div class="player__controls">
1515
<div class="progress">
1616
<div class="progress__filled"></div>
17+
<div class="scroll"></div>
1718
</div>
1819
<button class="player__button toggle" title="Toggle Play"></button>
1920
<input type="range" name="volume" class="player__slider" min="0" max="1" step="0.05" value="1">
21+
<p class="text"> Volume: <span id="volume-display">1</span></p>
2022
<input type="range" name="playbackRate" class="player__slider" min="0.5" max="2" step="0.1" value="1">
23+
<p class="text"> playbackRate: <span id="playbackRate-display">1</span></p>
2124
<button data-skip="-10" class="player__button">« 10s</button>
2225
<button data-skip="25" class="player__button">25s »</button>
2326
</div>

11 - Custom Video Player/scripts-FINISHED.js

Lines changed: 0 additions & 55 deletions
This file was deleted.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/* Get Our 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 skipBottons = player.querySelectorAll('[data-skip]');
8+
const ranges = player.querySelectorAll('.player__slider');
9+
10+
/* Build out functions */
11+
function togglePlay() {
12+
const method = video.paused ? 'play' : 'pause' ;
13+
video[method]();
14+
}
15+
16+
function updateButton() {
17+
const icon = this.paused ? '\u25BA' : '\u275A \u275A';
18+
console.log(icon);
19+
toggle.textContent = icon;
20+
}
21+
22+
function skip() {
23+
console.log(this.dataset.skip);
24+
video.currentTime += parseFloat(this.dataset.skip);
25+
}
26+
27+
function handleRangeUpdate() {
28+
video[this.name] = this.value;
29+
document.getElementById(`${this.name}-display`).textContent = parseFloat(this.value).toFixed(1);
30+
}
31+
32+
function handleProgress() {
33+
const percent = (video.currentTime / video.duration) * 100;
34+
progressBar.style.flexBasis = `${percent}%`;
35+
}
36+
37+
function scrub(e) {
38+
const scrubTime = (e.offsetX / progress.offsetWidth) * video.duration;
39+
video.currentTime = scrubTime;
40+
}
41+
42+
/* Hook up the event listners */
43+
video.addEventListener('click', togglePlay);
44+
video.addEventListener('play', updateButton);
45+
video.addEventListener('pause', updateButton);
46+
video.addEventListener('timeupdate', handleProgress);
47+
48+
49+
50+
toggle.addEventListener('click', togglePlay);
51+
skipBottons.forEach(button => button.addEventListener('click', skip));
52+
ranges.forEach(range => range.addEventListener('change', handleRangeUpdate));
53+
ranges.forEach(range => range.addEventListener('mousemove', handleRangeUpdate));
54+
55+
let mousedown = false;
56+
progress.addEventListener('click', scrub);
57+
progress.addEventListener('mousemove', (e) => mousedown && scrub (e));
58+
progress.addEventListener('mousedown', () => mousedown = true);
59+
progress.addEventListener('mouseup', () => mousedown = false);

11 - Custom Video Player/style.css

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,9 @@ body {
1010
margin: 0;
1111
padding: 0;
1212
display: flex;
13-
background: #7A419B;
13+
background: #34528a;
1414
min-height: 100vh;
15-
background: linear-gradient(135deg, #7c1599 0%,#921099 48%,#7e4ae8 100%);
15+
background: linear-gradient(135deg, #34528a 0%,#577dc4 48%,#9bd0f0 100%);
1616
background-size: cover;
1717
align-items: center;
1818
justify-content: center;
@@ -27,6 +27,13 @@ body {
2727
overflow: hidden;
2828
}
2929

30+
.text{
31+
color: white;
32+
font-size: 12px;
33+
font-family:'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;
34+
margin: auto;
35+
}
36+
3037
/* This css is only applied when fullscreen is active. */
3138
.player:fullscreen {
3239
max-width: none;
@@ -55,7 +62,7 @@ body {
5562
}
5663

5764
.player__button:focus {
58-
border-color: #ffc600;
65+
border-color: #6200ff;
5966
}
6067

6168
.player__slider {
@@ -98,10 +105,10 @@ body {
98105
}
99106

100107
.progress__filled {
101-
width: 50%;
102-
background: #ffc600;
108+
width: 0%;
109+
background: #6200ff;
103110
flex: 0;
104-
flex-basis: 50%;
111+
flex-basis: 0%;
105112
}
106113

107114
/* unholy css to style input type="range" */
@@ -131,15 +138,15 @@ input[type=range]::-webkit-slider-thumb {
131138
height: 15px;
132139
width: 15px;
133140
border-radius: 50px;
134-
background: #ffc600;
141+
background: #6200ff;
135142
cursor: pointer;
136143
-webkit-appearance: none;
137144
margin-top: -3.5px;
138145
box-shadow:0 0 2px rgba(0,0,0,0.2);
139146
}
140147

141148
input[type=range]:focus::-webkit-slider-runnable-track {
142-
background: #bada55;
149+
background: #4ce3f1;
143150
}
144151

145152
input[type=range]::-moz-range-track {
@@ -157,6 +164,6 @@ input[type=range]::-moz-range-thumb {
157164
height: 15px;
158165
width: 15px;
159166
border-radius: 50px;
160-
background: #ffc600;
167+
background: #6200ff;
161168
cursor: pointer;
162169
}

0 commit comments

Comments
 (0)