Skip to content

Commit 5ba7238

Browse files
authored
Add all files
0 parents  commit 5ba7238

File tree

4 files changed

+529
-0
lines changed

4 files changed

+529
-0
lines changed

favicon.png

1.95 KB
Loading

index.html

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Custom Video Player</title>
7+
<link rel="icon" type="image/png" href="favicon.png">
8+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.10.2/css/all.min.css"/>
9+
<link rel="stylesheet" href="style.css">
10+
</head>
11+
<body>
12+
<!-- Car Racing (1080P)-->
13+
<!-- https://pixabay.com/videos/download/video-41758_source.mp4?attachment -->
14+
<!-- Lake (4K) -->
15+
<!-- https://pixabay.com/videos/download/video-28745_source.mp4?attachment -->
16+
<!-- Ocean (720P)-->
17+
<!-- https://pixabay.com/videos/download/video-31377_tiny.mp4?attachment -->
18+
<div class="player">
19+
<video class="video" src='https://pixabay.com/videos/download/video-31377_tiny.mp4?attachment' playsinline></video>
20+
<div class="show-controls">
21+
<div class="controls-container">
22+
<!-- Progress Bar -->
23+
<div class="progress-range" title="Seek">
24+
<div class="progress-bar"></div>
25+
</div>
26+
<div class="control-group">
27+
<!-- Left Controls -->
28+
<div class="controls-left">
29+
<!-- Play/Pause -->
30+
<div class="play-controls">
31+
<i class="fas fa-play" title="Play" id="play-btn"></i>
32+
</div>
33+
<!-- Volume -->
34+
<div class="volume">
35+
<div class="volume-icon">
36+
<i class="fas fa-volume-up" title="Mute" id="volume-icon"></i>
37+
</div>
38+
<div class="volume-range" title="Change Volume">
39+
<div class="volume-bar"></div>
40+
</div>
41+
</div>
42+
</div>
43+
<!-- Right Controls -->
44+
<div class="controls-right">
45+
<!-- Speed -->
46+
<div class="speed" title="Playback Rate">
47+
<select name="playbackRate" class="player-speed">
48+
<option value="0.5">0.5 x</option>
49+
<option value="0.75">0.75 x</option>
50+
<option value="1" selected>1.0 x</option>
51+
<option value="1.5">1.5 x</option>
52+
<option value="2">2.0 x</option>
53+
</select>
54+
</div>
55+
<!-- Time -->
56+
<div class="time">
57+
<span class="time-elapsed">00:00 / </span>
58+
<span class="time-duration">02:49</span>
59+
</div>
60+
<!-- Fullscreen -->
61+
<div class="fullscreen">
62+
<i class="fas fa-expand"></i>
63+
</div>
64+
</div>
65+
</div>
66+
</div>
67+
</div>
68+
</div>
69+
<!-- Script -->
70+
<script src="script.js"></script>
71+
</body>
72+
</html>

script.js

Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
const player = document.querySelector('.player');
2+
const video = document.querySelector('.video');
3+
const progressRange = document.querySelector('.progress-range');
4+
const progressBar = document.querySelector('.progress-bar');
5+
const playBtn = document.getElementById('play-btn');
6+
const volumeIcon = document.getElementById('volume-icon');
7+
const volumeRange = document.querySelector('.volume-range');
8+
const volumeBar = document.querySelector('.volume-bar');
9+
const speed = document.querySelector('.player-speed');
10+
const currentTime = document.querySelector('.time-elapsed');
11+
const duration = document.querySelector('.time-duration');
12+
const fullscreenBtn = document.querySelector('.fullscreen');
13+
14+
// Play & Pause ----------------------------------- //
15+
16+
function showPlayIcon() {
17+
playBtn.classList.replace('fa-pause', 'fa-play');
18+
playBtn.setAttribute('title', 'Play');
19+
}
20+
21+
function togglePlay() {
22+
if (video.paused) {
23+
video.play();
24+
playBtn.classList.replace('fa-play', 'fa-pause');
25+
playBtn.setAttribute('title', 'Pause');
26+
} else {
27+
video.pause();
28+
showPlayIcon();
29+
}
30+
}
31+
32+
// On video end, show play button icon
33+
video.addEventListener('ended', showPlayIcon);
34+
35+
// Progress Bar ---------------------------------- //
36+
37+
// Format current time, duration
38+
function displayTime(time) {
39+
const minutes = Math.floor(time / 60);
40+
let seconds = Math.floor(time % 60);
41+
seconds = seconds > 9 ? seconds : `0${seconds}`;
42+
return `${minutes}:${seconds}`;
43+
}
44+
45+
// Update progress bar as video plays
46+
function updateProgress() {
47+
progressBar.style.width = `${(video.currentTime / video.duration) * 100}%`;
48+
currentTime.textContent = `${displayTime(video.currentTime)} /`;
49+
duration.textContent = `${displayTime(video.duration)}`;
50+
}
51+
52+
// Click to seek within the video
53+
function setProgress(e) {
54+
const newTime = e.offsetX / progressRange.offsetWidth;
55+
progressBar.style.width = `${newTime * 100}%`;
56+
video.currentTime = newTime * video.duration;
57+
}
58+
59+
// Volume Controls --------------------------- //
60+
61+
let lastVolume = 1;
62+
63+
// Mute
64+
function toggleMute() {
65+
volumeIcon.className = '';
66+
if (video.volume) {
67+
lastVolume = video.volume;
68+
video.volume = 0;
69+
volumeIcon.classList.add('fas', 'fa-volume-mute');
70+
volumeIcon.setAttribute('title', 'Unmute');
71+
volumeBar.style.width = 0;
72+
} else {
73+
video.volume = lastVolume;
74+
volumeIcon.classList.add('fas', 'fa-volume-up');
75+
volumeIcon.setAttribute('title', 'Mute');
76+
volumeBar.style.width = `${lastVolume * 100}%`;
77+
}
78+
}
79+
80+
// Volume Bar
81+
function changeVolume(e) {
82+
let volume = e.offsetX / volumeRange.offsetWidth;
83+
// Rounding volume up or down
84+
if (volume < 0.1) {
85+
volume = 0;
86+
}
87+
if (volume > 0.9) {
88+
volume = 1;
89+
}
90+
volumeBar.style.width = `${volume * 100}%`;
91+
video.volume = volume;
92+
// Change icon depending on volume
93+
volumeIcon.className = '';
94+
if (volume > 0.7) {
95+
volumeIcon.classList.add('fas', 'fa-volume-up');
96+
} else if (volume < 0.7 && volume > 0) {
97+
volumeIcon.classList.add('fas', 'fa-volume-down');
98+
} else if (volume === 0) {
99+
volumeIcon.classList.add('fas', 'fa-volume-off');
100+
}
101+
lastVolume = volume;
102+
}
103+
104+
// Change Playback Speed -------------------- //
105+
106+
function changeSpeed() {
107+
video.playbackRate = speed.value;
108+
}
109+
110+
// Fullscreen ------------------------------- //
111+
112+
/* View in fullscreen */
113+
function openFullscreen(element) {
114+
if (element.requestFullscreen) {
115+
element.requestFullscreen();
116+
} else if (element.mozRequestFullScreen) {
117+
/* Firefox */
118+
element.mozRequestFullScreen();
119+
} else if (element.webkitRequestFullscreen) {
120+
/* Chrome, Safari and Opera */
121+
element.webkitRequestFullscreen();
122+
} else if (element.msRequestFullscreen) {
123+
/* IE/Edge */
124+
element.msRequestFullscreen();
125+
}
126+
video.classList.add('video-fullscreen');
127+
}
128+
129+
/* Close fullscreen */
130+
function closeFullscreen() {
131+
if (document.exitFullscreen) {
132+
document.exitFullscreen();
133+
} else if (document.mozCancelFullScreen) {
134+
/* Firefox */
135+
document.mozCancelFullScreen();
136+
} else if (document.webkitExitFullscreen) {
137+
/* Chrome, Safari and Opera */
138+
document.webkitExitFullscreen();
139+
} else if (document.msExitFullscreen) {
140+
/* IE/Edge */
141+
document.msExitFullscreen();
142+
}
143+
video.classList.remove('video-fullscreen');
144+
}
145+
146+
let fullscreen = false;
147+
148+
// Toggle fullscreen
149+
function toggleFullscreen() {
150+
if (!fullscreen) {
151+
openFullscreen(player);
152+
} else {
153+
closeFullscreen();
154+
}
155+
fullscreen = !fullscreen;
156+
}
157+
158+
// Event Listeners
159+
playBtn.addEventListener('click', togglePlay);
160+
video.addEventListener('click', togglePlay);
161+
video.addEventListener('timeupdate', updateProgress);
162+
video.addEventListener('canplay', updateProgress);
163+
progressRange.addEventListener('click', setProgress);
164+
volumeRange.addEventListener('click', changeVolume);
165+
volumeIcon.addEventListener('click', toggleMute);
166+
speed.addEventListener('change', changeSpeed);
167+
fullscreenBtn.addEventListener('click', toggleFullscreen);

0 commit comments

Comments
 (0)