<!DOCTYPE html>
<html lang="en">
<head>
<!-- --------------------- Created By InCoder --------------------- -->
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Music Player - InCoderWeb</title>
<link rel="stylesheet" href="main.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" />
</head>
<body>
<div class="musicPlayerMainContainer">
<div class="musicListArea">
<div class="topOptions">
<div class="topOptionsIcon">
<i class="fa-solid fa-arrow-left"></i>
</div>
<div class="title">Music Player</div>
<div class="topOptionsIcon">
<i class="fa-solid fa-ellipsis"></i>
</div>
</div>
<div class="albumDetails">
<div class="outerBox">
<img src="https://drive.google.com/uc?id=1mcO92astAN3SUYh0JTUzjqAv7p2sm07c&export=download" alt="Ablum Cover" class="albumCover" />
<button class="playAlbum"><i class="fa-solid fa-play"></i></button>
</div>
<p>My Album</p>
</div>
<div class="songsList">
</div>
</div>
<div class="mainPlayer">
<div class="musicPlayerArea">
<div class="topOptions">
<div class="topOptionsIcon backToAlbumBtn">
<i class="fa-solid fa-arrow-left"></i>
</div>
<div class="title">Now Playing</div>
<div class="topOptionsIcon">
<i class="fa-regular fa-heart"></i>
</div>
</div>
<div class="albumDetails">
<div class="outerBox">
<img src="Images/albumCover.jpg" alt="Ablum Cover" class="albumCover" />
</div>
<audio src="" id="mainAudio"></audio>
<div class="title"></div>
<div class="artist"></div>
</div>
<div class="playerButtons">
<div class="mainButtons">
<button class="prevBtn"><i class="fa-solid fa-backward-step"></i></button>
<button class="playSongBtn"><i class="fa-solid fa-pause"></i></button>
<button class="nextBtn"><i class="fa-solid fa-forward-step"></i></button>
</div>
<div class="progressBar">
<input type="range" name="" id="songTime" />
<div class="songTimings">
<div id="currentTime">00:00</div>
<div id="totalDuration">00:00</div>
</div>
</div>
<div class="secondaryButtons">
<button class="repeatBtn on"><i class="fa-solid fa-repeat"></i></button>
<button class="shuffleBtn" disabled><i class="fa-solid fa-shuffle"></i></button>
<button class="muteNUnmuteBtn"><i class="fa-solid fa-volume-high"></i></button>
<button class="returnToAlbumBtn"><i class="fa-solid fa-bars"></i></button>
</div>
</div>
</div>
</div>
</div>
<script src="songsList.js"></script>
<script src="script.js"></script>
</body>
</html>
@import url("https://fonts.googleapis.com/css2?family=Ubuntu:ital,wght@0,300;0,400;0,500;0,700;1,300;1,400;1,500;1,700&display=swap");
/* --------------------- Created By InCoder --------------------- */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: "Ubuntu", sans-serif;
}
:root{
--progressWidth: 0%;
}
body {
display: flex;
height: 100vh;
align-items: center;
justify-content: center;
background-color: #3c4569;
}
.musicPlayerMainContainer {
width: 19rem;
height: 35rem;
overflow: hidden;
position: relative;
border-radius: 2rem;
background-color: #515e8f;
}
.musicListArea::-webkit-scrollbar {
width: 0px;
}
.musicListArea {
height: 100% !important;
overflow-y: scroll;
}
.musicListArea,
.musicListArea .topOptions {
width: 100%;
height: 8rem;
/* display: none; */
position: relative;
background: #262b42;
}
.topOptions {
display: flex;
padding: 1.5rem 1rem;
justify-content: space-between;
}
.topOptions .title {
color: #fff;
font-size: 1.2rem;
}
.topOptionsIcon {
width: 2.2rem;
height: 2.2rem;
display: flex;
cursor: pointer;
color: #515e8f;
font-size: 1.3rem;
align-items: center;
border-radius: 5rem;
justify-content: center;
transition: all 0.3s cubic-bezier(0, 0.61, 1, 1);
}
.topOptionsIcon:hover {
color: #fff;
background-color: #555e90;
}
.albumDetails .outerBox {
top: 5rem;
width: 5.5rem;
left: 1.5rem;
height: 5.5rem;
display: flex;
position: absolute;
align-items: center;
border-radius: 0.8rem;
justify-content: center;
background-color: #515e8f;
box-shadow: #3d476b 0 0 15px 2px;
}
.albumDetails .albumCover {
width: 5rem;
height: 4.3rem;
max-width: 4rem;
border-radius: 0.8rem;
}
.albumDetails p {
top: 5.9rem;
left: 8rem;
color: #fff;
font-weight: 700;
font-size: 1.5rem;
position: absolute;
}
.playAlbum {
right: -0.5rem;
bottom: -0.5rem;
border: none;
color: #fff;
width: 2.5rem;
height: 2.5rem;
cursor: pointer;
font-size: 1rem;
border-radius: 50%;
position: absolute;
backdrop-filter: blur(0.5px);
background-color: #404664;
transition: all 0.3s cubic-bezier(0, 0.61, 1, 1);
}
.playAlbum:hover {
box-shadow: #282b42 0 0 8px -3px;
}
.songsList {
margin-top: 4.5rem;
padding: 0rem 1rem;
padding-bottom: 4rem;
}
.songsList .song {
display: flex;
margin-bottom: 1rem;
align-items: center;
padding: 0.8rem 1rem;
border-radius: 1.2rem;
backdrop-filter: blur(0.5px);
background-color: #7e84a76b;
transition: transform 0.3s ease;
}
.songsList .song:hover {
transform: translateY(-0.2rem);
}
.songsList .song .icon {
border: none;
display: flex;
color: #fff;
width: 2.5rem;
height: 2.5rem;
cursor: pointer;
font-size: 1rem;
border-radius: 50%;
align-items: center;
margin-right: 0.5rem;
justify-content: center;
backdrop-filter: blur(0.5px);
background-color: #404664;
transition: all 0.3s cubic-bezier(0, 0.61, 1, 1);
}
.songsList .song .icon:hover {
box-shadow: #282b42 0 0 8px -3px;
}
.songsList .song .details .info {
display: flex;
color: #ffffff96;
width: 12rem;
justify-content: space-between;
}
.songsList .song .details .info .artist {
font-size: 0.75rem;
margin-top: 0.1rem;
}
.songsList .song .details .info .duration {
font-size: 0.75rem;
}
.songsList .song .details .title {
color: #fff;
font-size: 1.2rem;
}
/* --------------------- Music Player Code --------------------- */
.musicPlayerArea {
width: 100%;
height: 12rem;
position: relative;
background: #262b42;
}
.mainPlayer {
top: 91%;
width: 100%;
height: 100%;
position: absolute;
transition: all .5s ease-in-out;
backdrop-filter: blur(1px);
background-color: #515e8f;
}
.mainPlayer.active {
top: 0%;
}
.musicPlayerArea .topOptions {
padding-top: 3rem;
position: relative;
}
.songTimings{
display: flex;
color: #ffffff94;
justify-content: space-between;
}
.musicPlayerArea .topOptions::before {
left: 41%;
content: "";
top: 1.5rem;
cursor: grab;
width: 3.5rem;
height: 0.3rem;
border-radius: 1rem;
position: absolute;
background-color: #fff;
}
.musicPlayerArea .albumDetails .outerBox {
top: 6rem;
left: 3.2rem;
display: flex;
width: 12.5rem;
height: 11.5rem;
position: absolute;
align-items: center;
border-radius: 0.8rem;
justify-content: center;
background-color: #515e8f;
box-shadow: #3d476b 0 0 15px 2px;
}
.musicPlayerArea .albumDetails .albumCover {
width: 11rem;
height: 10rem;
max-width: 100%;
border-radius: 0.8rem;
}
.musicPlayerArea .albumDetails .title {
color: #fff;
font-size: 1.6rem;
margin-top: 12rem;
text-align: center;
}
.musicPlayerArea .albumDetails .artist {
font-size: 0.8rem;
margin-top: 0.2rem;
color: #ffffff94;
text-align: center;
}
.playerButtons {
margin-top: 2rem;
}
.mainButtons,
.secondaryButtons {
display: flex;
justify-content: space-around;
}
.mainButtons button,
.secondaryButtons button {
color: #fff;
border: none;
width: 2.5rem;
height: 2.5rem;
cursor: pointer;
border-radius: 50%;
outline-offset: 1px;
background-color: #262b42;
transition: all 0.3s cubic-bezier(0, 0.61, 1, 1);
}
.mainButtons button:hover {
box-shadow: #282b42 0 0 8px -3px;
}
.mainButtons button:nth-child(1) {
margin-top: 0.4rem;
}
.mainButtons button:nth-child(3) {
margin-top: 0.4rem;
}
.mainButtons button:nth-child(2) {
width: 3.5rem;
height: 3.5rem;
font-size: 1.5rem;
}
.mainButtons button:focus,
.secondaryButtons button.on {
outline: 2px solid #262b42;
}
.secondaryButtons button:disabled{
background-color: #262b426b!important;
}
#songTime {
width: 100%;
margin-bottom: .5rem;
}
.progressBar{
margin: 1.5rem 1.4rem;
margin-top: .5rem;
margin-bottom: .8rem;
}
input[type="range"] {
-webkit-appearance: none;
appearance: none;
cursor: pointer;
position: relative;
border-radius: 1rem;
}
input[type="range"]::-webkit-slider-runnable-track {
background: #ffffff94;
height: 0.2rem;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
margin-top: -7px;
border-radius: 1rem;
background-color: #262b42;
height: 1rem;
width: 1rem;
}
input[type="range"]:focus::-webkit-slider-thumb {
outline-offset: 1px;
outline: 1px solid #262b42;
}
input[type="range"]::before {
content: "";
top: 0;
left: 0%;
width: var(--progressWidth);
height: 150%;
position: absolute;
border-radius: 2px;
background-color: #262b42;
}
const allSongs = [
{
id: "1",
name: "Falling Down",
artist: "Alex Skrindo",
image: "https://drive.google.com/uc?id=15bTbmGwT0ufWFIJ-pi2wXm3E5_mhLkB4&export=download",
src: "https://drive.google.com/uc?id=1AErADbHUjFwlJYEykZh5VfHvaZGOuacD&export=download",
},
{
id: "2",
name: "Everything",
artist: "JJL. Malarkey",
image: "https://drive.google.com/uc?id=1k9l98chcAjFCSBoF1A-mpUFm08BqGdzI&export=download",
src: "https://drive.google.com/uc?id=1xjCQsCQt6WNWDjX7T7ov6nIheit49hZx&export=download",
},
{
id: "3",
name: "Dreamer",
artist: "Alan Walker",
image: "https://drive.google.com/uc?id=1iYN0uTd9nLcy2O_qlrTAKR1bWpq5Vbyl&export=download",
src: "https://drive.google.com/uc?id=1WJRLLBPXf6VxwwkNhBTBoXs5-XhFcga_&export=download",
},
{
id: "4",
name: "094",
artist: "JOXION",
image: "https://drive.google.com/uc?id=16FkUQPPuZ-cli6_JjLBzyCc-f30N5YTo&export=download",
src: "https://drive.google.com/uc?id=1cEsAs0JQfY_0e32c2Ic8RIDQJuqFUh11&export=download",
},
{
id: "5",
name: "Immortal",
artist: "CITYWLKR",
image: "https://drive.google.com/uc?id=1Dh2N46sgkKJ1dV6kA6JAzJbjYKcK4nhp&export=download",
src: "https://drive.google.com/uc?id=1ht0O21NIodPWNkMOl4ny3fQp9IWovnpL&export=download",
},
]
const mainPlayBtn = document.querySelector('.playAlbum')
backToAlbumBtn = document.querySelector('.backToAlbumBtn')
songsList = document.querySelector('.songsList')
music = document.querySelector('#mainAudio')
playNPauseBtn = document.querySelector('.playSongBtn')
muteNUnmuteBtn = document.querySelector('.muteNUnmuteBtn')
returnToAlbumBtn = document.querySelector('.returnToAlbumBtn')
prevBtn = document.querySelector('.prevBtn')
nextBtn = document.querySelector('.nextBtn')
songTime = document.querySelector('#songTime')
repeatBtn = document.querySelector('.repeatBtn')
shuffleBtn = document.querySelector('.shuffleBtn')
mainPlayer = document.querySelector('.mainPlayer');
mainPlayBtn.addEventListener('click', (e) => {
mainPlayer.classList.add('active')
})
backToAlbumBtn.addEventListener('click', (e) => {
mainPlayer.classList.remove('active')
})
const loadMusic = (index) => {
document.querySelector('.musicPlayerArea .albumDetails .title').innerText = allSongs[index - 1].name
document.querySelector('.musicPlayerArea .albumDetails .artist').innerText = allSongs[index - 1].artist
document.querySelector('.musicPlayerArea .albumDetails .albumCover').src = allSongs[index - 1].image
music.setAttribute('data-currentIndex', index)
music.src = allSongs[index - 1].src
}
const openPlayer = (index) => {
mainPlayer.classList.add('muted', 'active', 'paused')
if (mainPlayer.classList.contains("paused")) {
playNPauseBtn.querySelector("i").classList.remove('fa-play')
playNPauseBtn.querySelector("i").classList.add('fa-pause')
}
loadMusic(index)
music.play()
}
const playMusic = () => {
mainPlayer.classList.add('paused')
playNPauseBtn.querySelector("i").classList.remove('fa-play')
playNPauseBtn.querySelector("i").classList.add('fa-pause')
music.play()
}
const pauseMusic = () => {
mainPlayer.classList.remove('paused')
playNPauseBtn.querySelector("i").classList.remove('fa-pause')
playNPauseBtn.querySelector("i").classList.add('fa-play')
music.pause()
}
playNPauseBtn.addEventListener('click', () => {
const isMusicPaused = mainPlayer.classList.contains("paused")
isMusicPaused ? pauseMusic() : playMusic()
})
const mute = () => {
mainPlayer.classList.remove('muted')
muteNUnmuteBtn.querySelector("i").classList.remove('fa-volume-high')
muteNUnmuteBtn.querySelector("i").classList.add('fa-volume-xmark')
music.volume = 0;
}
const unmute = () => {
mainPlayer.classList.add('muted')
muteNUnmuteBtn.querySelector("i").classList.remove('fa-volume-xmark')
muteNUnmuteBtn.querySelector("i").classList.add('fa-volume-high')
music.volume = 1;
}
muteNUnmuteBtn.addEventListener('click', () => {
const isMuted = mainPlayer.classList.contains("muted")
isMuted ? mute() : unmute()
})
returnToAlbumBtn.addEventListener('click', () => {
mainPlayer.classList.remove('active')
})
mainPlayBtn.addEventListener('click', () => {
openPlayer(1)
})
prevBtn.addEventListener('click', () => {
let currentIndex = music.getAttribute('data-currentIndex')
if ((currentIndex - 1) <= 0) {
loadMusic(1)
} else {
loadMusic(currentIndex - 1)
}
mainPlayer.classList.add('paused')
music.play()
})
nextBtn.addEventListener('click', () => {
let currentIndex = music.getAttribute('data-currentIndex')
if ((parseInt(currentIndex) + 1) >= allSongs.length) {
loadMusic(allSongs.length)
} else {
loadMusic(parseInt(currentIndex) + 1);
}
mainPlayer.classList.add('paused')
music.play()
})
music.addEventListener("timeupdate", (e) => {
const currentTime = e.target.currentTime;
const duration = e.target.duration;
let progressWidth = (currentTime / duration) * 100;
songTime.value = progressWidth
document.documentElement.style.cssText = `--progressWidth: ${progressWidth}%`;
let musicCurrentTime = document.querySelector('#currentTime');
musicDuration = document.querySelector('#totalDuration');
music.addEventListener("loadeddata", (e) => {
totalMin = Math.floor(music.duration / 60);
totalSec = Math.floor(music.duration % 60);
if (totalSec < 10) {
totalSec = `0${totalSec}`
}
musicDuration.innerHTML = `${totalMin}:${totalSec}`;
})
let currentMin = Math.floor(currentTime / 60);
currentSec = Math.floor(currentTime % 60);
if (currentSec < 10) {
currentSec = `0${currentSec}`
}
musicCurrentTime.innerHTML = `${currentMin}:${currentSec}`;
})
songTime.addEventListener('click', (e) => {
let progressWidthVal = songTime.clientWidth
clickedOffsetX = e.offsetX
songDuration = music.duration
music.currentTime = (clickedOffsetX / progressWidthVal) * songDuration
})
repeatBtn.addEventListener('click', () => {
if(repeatBtn.classList.contains("on")){
repeatBtn.classList.remove("on")
shuffleBtn.removeAttribute("disabled")
}else{
repeatBtn.classList.add("on")
shuffleBtn.setAttribute("disabled", "disabled")
shuffleBtn.classList.remove("on")
}
})
shuffleBtn.addEventListener('click', () => {
if(shuffleBtn.classList.contains("on")){
shuffleBtn.classList.remove("on")
repeatBtn.removeAttribute("disabled")
}else{
shuffleBtn.classList.add("on")
repeatBtn.setAttribute("disabled", "disabled")
repeatBtn.classList.remove("on")
}
})
music.addEventListener("ended", () => {
if(repeatBtn.classList.contains("on")){
music.currentTime = 0
music.play()
}
if(shuffleBtn.classList.contains("on")){
let randomIndex = Math.floor((Math.random() * allSongs.length) + 1)
console.log(randomIndex);
loadMusic(randomIndex)
music.play()
}
})
allSongs.forEach((song) => {
songsList.innerHTML += `<div class="song">
<div class="icon" onClick="openPlayer(${song.id})"><i class="fa-solid fa-play"></i></div>
<div class="details">
<div class="title">${song.name}</div>
<div class="info">
<div class="artist">${song.artist}</div>
</div>
</div>
</div>`;
})
This Pen doesn't use any external CSS resources.
This Pen doesn't use any external JavaScript resources.