๊ฒ์ ์ดํํธ 01
์ด๋ฒ ์๊ฐ์๋ ๊ทธ ๋์ ๋ฐฐ์ ๋ JavaScript๋ฅผ ์ด์ฉํ์ฌ ๊ฒ์ ์ดํํธ๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ปดํจํฐ ๋ฐํํ๋ฉด๊ณผ ์๋๋๋ ๋ฎค์ง ํ๋ ์ด์ด๋ฅผ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
HTML ์์ค ๋ณด๊ธฐ
HTML ๊ตฌ์ฑ์ ํค๋(์ ๋ชฉ, ์๊ฐ)์ ๋ฉ์ธ(๋ฐํํ๋ฉด ์์ด์ฝ), ํธํฐ(agent, ์์ค ๋ณด๊ธฐ), ๋ฎค์ง ํ๋ ์ด์ด๋ก ๊ตฌ์ฑ๋๋ค.
<body>
<div class="mouse__cursor"></div>
<!-- png ํ์์ผ๋ก ๋ง์ฐ์ค ์ปค์๋ฅผ ์ ์ฉํ ๋์ ํ์ํจ, cur ํ์ผ ์ ์ฉ์ ๊ฒฝ์ฐ ๋ถํ์ -->
<header id="header">
<h1>Coding Note's Game World</h1>
<div class="time"></div>
</header>
<!-- // header -->
<main id="main">
<div class="icon_box">
<div class="icon0">
<img src="../assets/img/icon0.png" alt="๋์คํฌ">
<span>๋์คํฌ</span>
</div>
<div class="icon1">
<img src="../assets/img/icon1.png" alt="๋ฎค์ง">
<span>๋ฎค์ง ๋ฃ๊ธฐ</span>
</div>
<div class="icon2">
<img src="../assets/img/icon2.png" alt="์ต ํด๋">
<span>์ต ํด๋</span>
</div>
<div class="icon3">
<img src="../assets/img/icon3.png" alt="๋์์">
<span>๋์์</span>
</div>
<div class="icon4">
<img src="../assets/img/icon4.png" alt="ํ์ผ">
<span>ํ์ผ</span>
</div>
<div class="icon5">
<img src="../assets/img/icon5.png" alt="FIGMA">
<span>FIGMA</span>
</div>
</div>
</main>
<!-- // main -->
<footer id="footer">
<div class="agent">agent</div>
<div class="modal__wrap">
<div class="modal__btn">
<label for="btn">์์ค ๋ณด๊ธฐ</label>
</div>
<div class="modal__cont">
<div class="modal__close">
<span class="close">
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true" focusable="false">
<path d="M12.5 3.5L3.5 12.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
<path d="M12.5 12.5L3.5 3.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"></path>
</svg>
</span>
</div>
<div class="t_iframe">
<iframe src="https://github1s.com/kde66034/coding" frameborder="0"></iframe>
</div>
</div>
</div>
</footer>
<!-- // footer -->
<!-- ๋ฎค์ง ํ๋ ์ด์ด -->
<div class="music__wrap">
<div class="music__inner">
<div class="music__header">
<div>***</div>
<h2>MUSIC PLAYER</h2>
<div>***</div>
</div>
<div class="music__contents">
<div class="volume__wrap">
<img class="volume_icon" src="../assets/img/volume.svg" alt="๋ณผ๋ฅจ" />
<img class="volumeOff_icon" src="../assets/img/volumeoff.svg" alt="๋ณผ๋ฅจ" />
<div class="volume_bar">
<input type="range" id="volume-control" min="0" max="10" />
</div>
</div>
<div class="music__view">
<div class="img">
<img src="../assets/img/music-1.png" alt="">
</div>
<div class="title">
<h3>Kazoom - Quincas Moreira</h3>
<p>YouTube Music</p>
</div>
</div>
<div class="music__control">
<div class="progress">
<div class="bar">
<audio id="main-audio" src="../assets/audio/music-1.mp3"></audio>
</div>
<div class="timer">
<span class="current">0:00</span>
<span class="duration">4:00</span>
</div>
</div>
<div class="control">
<i title="์ ์ฒด ๋ฐ๋ณต" class="repeat" id="control-repeat"></i>
<!-- <i title="ํ๊ณก ๋ฐ๋ณต" class="repeat_one"></i>
<i title="๋๋ค ์ฌ์" class="shuffle"></i> -->
<i title="์ด์ ๊ณก ์ฌ์" class="prev" id="control-prev"></i>
<i title="์ฌ์" class="play" id="control-play"></i>
<i title="์ ์ง" class="stop" id="control-stop"></i>
<i title="๋ค์๊ณก ์ฌ์" class="next" id="control-next"></i>
<i title="์ฌ์๋ชฉ๋ก" class="list" id="control-list"></i>
</div>
</div>
</div>
<div class="music__footer">
<div class="music__list close">
<h3><span class="list">๋ฎค์ง ๋ฆฌ์คํธ</span> <span class="close-btn" id="control-close"></span></h3>
<ul>
<!-- <li>
<strong>์ ๋ชฉ</strong>
<em>์ํฐ์คํธ</em>
<span>์ฌ์์๊ฐ</span>
</li> -->
</ul>
</div>
</div>
</div>
</div>
</body>
JavaScript ์์ค ๋ณด๊ธฐ : ํค๋(์๋จ๋ฐ)์ ์๊ฐ ํ์ํ๊ธฐ
์๊ฐ, ๋ ์ง๋ฅผ ์ ์ฅํ ์์์ ์, ๋ถ, ์ด๋ฅผ ์ ์ฅํ ๋ณ์๋ฅผ ์์ฑํ ๋ค์ if๋ฌธ์ ์ด์ฉํ์ฌ ์๊ฐ์ ๋ํ๋ด๋ ์คํฌ๋ฆฝํธ๋ฅผ ์ง๋๋ก ํ๋ค.
function printTime(){
const clock = document.querySelector(".time");
const now = new Date();
let nowHours = now.getHours();
let nowMins = now.getMinutes();
let nowSecs = now.getSeconds();
if(nowHours > 12) {
nowHours = `${nowHours - 12}`
} else if(nowHours >= 0 && nowHours<=9){
nowHours = `0${nowHours}`
};
if(nowMins < 10) nowMins = `0${nowMins}`;
if(nowSecs < 10) nowSecs = `0${nowSecs}`;
let nowMonth = now.getMonth() + 1;
let nowDate = now.getDate();
if(nowMonth < 10 ) nowMonth = `0${nowMonth}`
if(nowDate < 10 ) nowDate = `0${nowDate}`
const nowTime = `${now.getFullYear()}๋
${(now.getMonth()+1)}์ ${now.getDate()}์ผ ${nowHours}์ ${nowMins}๋ถ ${nowSecs}์ด`;
clock.innerText = nowTime;
setTimeout("printTime()", 1000);
}
JavaScript ์์ค ๋ณด๊ธฐ : Agent
ํ๋จ ํธํฐ ์์ญ์ ํ์ฌ ์ฌ์ฉํ๊ณ ์๋ ๊ธฐ๊ธฐ์ ํ๋ฉด ํฌ๊ธฐ๋ฅผ ํ์์ํค๊ธฐ ์ํ ์คํฌ๋ฆฝํธ์ด๋ค. agent, os๋ผ๋ ์์๋ฅผ ๋ง๋ค๊ณ agent ์์ญ์ innerText๋ก os ์ ๋ณด๋ฅผ ์ถ๋ ฅ์ํจ๋ค. if, else if๋ฌธ์ ์ด์ฉํ์ฌ ๊ฐ๊ฐ ์ด์์ฒด์ ๋ณ๋ก ์ถ๋ ฅ์ํฌ ๋ฌธ๊ตฌ๋ฅผ ์คํฌ๋ฆฝํธ๋ก ์ง ๋ค.
function printAgent() {
const agent = document.querySelector(".agent");
const os = navigator.userAgent.toLocaleLowerCase();
agent.innerText = os;
if(os.indexOf("window") >= 0){
agent.innerText = "ํ์ฌ Windows๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ํ๋ฉด ํฌ๊ธฐ๋ "+ screen.width +"x"+ screen.height + "์
๋๋ค.";
document.querySelector("body").classList.add("window");
} else if(os.indexOf("macintosh") >= 0){
agent.innerText = "ํ์ฌ Mac์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ํ๋ฉด ํฌ๊ธฐ๋ "+ screen.width +"x"+ screen.height + "์
๋๋ค.";
document.querySelector("body").classList.add("mac");
} else if(os.indexOf("iphone") >= 0){l
agent.innerText = "ํ์ฌ iPhone์ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ํ๋ฉด ํฌ๊ธฐ๋ "+ screen.width +"x"+ screen.height + "์
๋๋ค.";
document.querySelector("body").cassList.add("iphone");
} else if(os.indexOf("android") >= 0){
agent.innerText = "ํ์ฌ Android๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ํ๋ฉด ํฌ๊ธฐ๋ "+ screen.width +"x"+ screen.height + "์
๋๋ค.";
document.querySelector("body").classList.add("android");
}
}
window.onload = function() {
printTime();
printAgent();
}
JavaScript ์์ค ๋ณด๊ธฐ : ์์ด์ฝ๊ณผ ๋ฎค์ง ํ๋ ์ด์ด๋ฅผ ์์ ์์ฌ๋ก ๋๋๊ทธ
์์ด์ฝ๊ณผ ๋ฎค์ง ํ๋ ์ด์ด๋ฅผ ์์ ์์ฌ๋ก ๋๋๊ทธํ์ฌ ์์น ์ด๋์ ๊ฐ๋ฅํ๊ฒ ํ๋๋ก ํ๋ ์คํฌ๋ฆฝํธ์ด๋ค. jQuery๋ฅผ ์ค์นํ์ฌ์ผ ํ๋ฉฐ ์์ ์์ฌ ๋๋๊ทธ๋ฅผ ์์ผ์ฃผ๊ณ ์ ํ๋ div์ ํด๋์ค๊ฐ์ .draggable๋ฅผ ๋ถ์ด๋ฉด ๋๋ค.
$( function() {
$(".icon0").draggable();
$(".icon1").draggable();
$(".icon2").draggable();
$(".icon3").draggable();
$(".icon4").draggable();
$(".icon5").draggable();
$(".music__wrap").draggable({
});
} );
JavaScript ์์ค ๋ณด๊ธฐ : ๋ฎค์ง ํ๋ ์ด์ด
allMusic ์์์๋ ์์ ์ ๋ณด(๊ณก๋ช , ์ํฐ์คํธ, ์ด๋ฏธ์ง, ์ค๋์ค ํ์ผ๋ช )๋ฅผ ๋ด๊ณ , ํ์ํ ๋งํผ์ ์์๋ฅผ ์ ์ธํ๋ค. ํ์ฌ ์์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์ฒ์์๋ 1๋ก ์ค์ ํ๋ค. ๊ทธ๋ฐ ๋ค์์ ์์ ์ฌ์, ์ฌ์ ๋ฒํผ, ์ ์ง ๋ฒํผ, ์ด์ ๊ณก ๋ฃ๊ธฐ ๋ฒํผ, ๋ค์ ๊ณก ๋ฃ๊ธฐ ๋ฒํผ ์คํฌ๋ฆฝํธ๋ฅผ ์ง ๋ค์ ๋ฒํผ์ ํด๋ฆญํ์ ๋ ํด๋น ์คํฌ๋ฆฝํธ๋ค์ด ์คํ๋ ์ ์๋๋ก addEventListener๋ฅผ ์ด์ฉํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ง๋๋ก ํ๋ค. ๊ทธ ์ธ์๋ ๋ฎค์ง ๋ฆฌ์คํธ ๊ตฌํ, ๋ฎค์ง ์งํ๋ฐ, ์ค๋์ค๊ฐ ๋๋ฌ์ ๋, ๋ฒํผ ๋ฐ๊ฟ์ฃผ๊ธฐ ๋ฑ์ ์คํฌ๋ฆฝํธ๊ฐ ์์ผ๋ฉฐ ์๋ ์ฝ๋์ ์ฃผ์ ์ฒ๋ฆฌ๋ ์ค๋ช ๋ฌธ์ ์ฐธ๊ณ ํ๋๋ก ํ๋ค.
๋ฎค์ง ํ๋ ์ด์ด JS ์์ค ๋ณด๊ธฐ
const allMusic = [
{
name: "1. Kazoom",
artist: "Quincas Moreira",
img: "music-1",
audio: "music-1"
},
{
name: "2. Calimba",
artist: "E's Jammy Jams",
img: "music-2",
audio: "music-2"
},
{
name: "3. This Old Man (instrumental)",
artist: "The Green Orbs",
img: "music-3",
audio: "music-3"
},
{
name: "4. This Old Man (vocal)",
artist: "The Green Orbs",
img: "music-4",
audio: "music-4"
},
{
name: "5. The Farmer In The Dell",
artist: "The Green Orbs",
img: "music-5",
audio: "music-5"
},
{
name: "6. The Farmer In The Dell (Instrumental)",
artist: "The Green Orbs",
img: "music-6",
audio: "music-6"
},
{
name: "7. Snack Time",
artist: "The Green Orbs",
img: "music-7",
audio: "music-7"
},
{
name: "8. Sand Castles",
artist: "The Green Orbs",
img: "music-8",
audio: "music-8"
},
{
name: "9. Rock-a-bye Baby",
artist: "The Green Orbs",
img: "music-9",
audio: "music-9"
},
{
name: "10. A Walk Into Space",
artist: "Topher Mohr and Alex Elena",
img: "music-10",
audio: "music-10"
},
]
const musicWrap = document.querySelector(".music__wrap");
const musicView = musicWrap.querySelector(".music__view .img img");
const musicName = musicWrap.querySelector(".music__view .title h3");
const musicArtist = musicWrap.querySelector(".music__view .title p");
const musicAudio = musicWrap.querySelector("#main-audio");
const musicPlay = musicWrap.querySelector("#control-play");
const musicPrevBtn = musicWrap.querySelector("#control-prev");
const musicNextBtn = musicWrap.querySelector("#control-next");
const musicProgress = musicWrap.querySelector(".progress");
const musicProgressBar = musicWrap.querySelector(".progress .bar");
const musicProgressCurrent = musicWrap.querySelector(".progress .timer .current");
const musicProgressDuration = musicWrap.querySelector(".progress .timer .duration");
const musicRepeat = musicWrap.querySelector("#control-repeat");
const musicListBtn = musicWrap.querySelector("#control-list");
const musicList = musicWrap.querySelector(".music__list");
const musicListUl = musicList.querySelector(".music__list ul");
let musicIndex = 1; // ํ์ฌ ์์
์ธ๋ฑ์ค
// ์์
์ฌ์
function loadMusic(num){
musicName.innerText = allMusic[num-1].name; // ๋ฎค์ง ์ด๋ฆ ๋ก๋
musicArtist.innerText = allMusic[num-1].artist; // ๋ฎค์ง ์ํฐ์คํธ ๋ก๋
musicView.src = `../assets/img/${allMusic[num-1].img}.png`; // ๋ฎค์ง ์ด๋ฏธ์ง ๋ก๋
musicView.alt = allMusic[num-1].name; // ๋ฎค์ง ์ด๋ฏธ์ง alt ํ๊ทธ ๋ก๋
musicAudio.src = `../assets/audio/${allMusic[num-1].audio}.mp3`; // ๋ฎค์ง ํ์ผ ๋ก๋
}
musicAudio.play();
// ์ฌ์ ๋ฒํผ
function playMusic() {
musicWrap.classList.add("paused");
musicPlay.setAttribute("title", "์ ์ง");
musicPlay.setAttribute("class", "stop");
musicAudio.play();
}
// ์ ์ง ๋ฒํผ
function pauseMusic() {
musicWrap.classList.remove("paused");
musicPlay.setAttribute("title", "์ฌ์");
musicPlay.setAttribute("class", "play");
musicAudio.pause();
}
// ์ด์ ๊ณก ๋ฃ๊ธฐ ๋ฒํผ
function prevMusic() {
// musicIndex --
musicIndex == 1 ? musicIndex = allMusic.length : musicIndex--;
loadMusic(musicIndex);
playMusic();
playListMusic(); // ์ฌ์๋ชฉ๋ก ์
๋ฐ์ดํธ
}
// ๋ค์ ๊ณก ๋ฃ๊ธฐ ๋ฒํผ
function nextMusic() {
// musicIndex ++
musicIndex == allMusic.length ? musicIndex = 1 : musicIndex++;
loadMusic(musicIndex);
playMusic();
playListMusic(); // ์ฌ์๋ชฉ๋ก ์
๋ฐ์ดํธ
}
// ํ๋ ์ด ๋ฒํผ ํด๋ฆญ
musicPlay.addEventListener("click", () => {
const isMusicPaused = musicWrap.classList.contains("paused"); // ์์
์ด ์ฌ์์ค
isMusicPaused ? pauseMusic() : playMusic();
});
// ์ด์ ๊ณก ๋ฒํผ ํด๋ฆญ
musicPrevBtn.addEventListener("click", () => {
prevMusic();
});
// ๋ค์๊ณก ๋ฒํผ ํด๋ฆญ
musicNextBtn.addEventListener("click", () => {
nextMusic();
});
// ๋ฎค์ง ๋ฆฌ์คํธ ๋ฒํผ
musicListBtn.addEventListener("click", () => {
musicList.classList.add("show");
});
// ๋ฎค์ง ๋ฆฌ์คํธ ๊ตฌํํ๊ธฐ
for(let i=0; i<allMusic.length; i++){
let li = `
<li data-index="${i+1}">
<strong>${allMusic[i].name}</strong>
<em>${allMusic[i].artist}</em>
<audio class="${allMusic[i].audio}" src="../assets/audio/${allMusic[i].audio}.mp3"></audio>
<span class="audio-duration" id="${allMusic[i].audio}">์ฌ์์๊ฐ</span>
</li>
`;
// musicListUl.innerHTML += li; // ๋งจ ๋ง์ง๋ง ๊ณก์ ์๊ฐ๋ง ํ์๋๋ ๋ฌธ์ ๆ
musicListUl.insertAdjacentHTML("beforeend", li); // ๋ฌธ์ ํด๊ฒฐ : ๋ชจ๋ ๊ณก์ ์๊ฐ์ ํ์ ๊ฐ๋ฅ
// ๋ฆฌ์คํธ์ ์์
์๊ฐ ๋ถ๋ฌ์ค๊ธฐ
let liAudioDuration = musicListUl.querySelector(`#${allMusic[i].audio}`); // ๋ฆฌ์คํธ์์ ์๊ฐ์ ํ์ํ ์ ํ์๋ฅผ ๊ฐ์ ธ์ด
let liAudio = musicListUl.querySelector(`.${allMusic[i].audio}`); // ๋ฆฌ์คํธ์์ ์ค๋์ค๋ฅผ ๊ฐ์ ธ์ด
liAudio.addEventListener("loadeddata", () => {
let audioDuration = liAudio.duration; // ์ค๋์ค ์ ์ฒด ๊ธธ์ด
let totalMin = Math.floor(audioDuration / 60); // ์ ์ฒด ๊ธธ์ด๋ฅผ ๋ถ ๋จ์๋ก ์ชผ๊ฐฌ
let totalSec = Math.floor(audioDuration % 60); // ์ด ๊ณ์ฐ
if(totalSec < 10) totalSec = `0${totalSec}`; // ์ ์๋ฆฌ์ 0 ์ถ๊ฐ
liAudioDuration.innerText = `${totalMin}:${totalSec}`; // ๋ฌธ์์ด ์ถ๋ ฅ
liAudioDuration.setAttribute("data-duration", `${totalMin}:${totalSec}`); // ์์ฑ์ ์ค๋์ค ๊ธธ์ด ๊ธฐ๋ก
});
}
// ๋ฎค์ง ๋ฆฌ์คํธ๋ฅผ ํด๋ฆญํ๋ฉด ์ฌ์
function playListMusic(){
const musicListAll = musicListUl.querySelectorAll("li"); // ๋ฎค์ง ๋ฆฌ์คํธ ๋ชฉ๋ก ๊ฐ์ ธ์ค๊ธฐ
for(let i=0; i<musicListAll.length; i++){
let audioTag = musicListAll[i].querySelector(".audio-duration");
if(musicListAll[i].classList.contains("playing")){
musicListAll[i].classList.remove("playing"); // ํด๋์ค ์กด์ฌ์ ์ญ์
let adDuration = audioTag.getAttribute("data-duration"); // ์ค๋์ค ๊ธธ์ด๊ฐ ๊ฐ์ ธ์ค๊ธฐ
audioTag.innerText = adDuration; // ์ค๋์ค ๊ธธ์ด๊ฐ ์ถ๋ ฅ
}
if(musicListAll[i].getAttribute("data-index") == musicIndex){ // ํ์ฌ ๋ฎค์ง์ธ๋ฑ์ค๋ ๋ฆฌ์คํธ ์ธ๋ฑ์ค ๊ฐ์ด ๊ฐ๋ค๋ฉด
musicListAll[i].classList.add("playing"); // ํด๋์ค playing ์ถ๊ฐ
audioTag.innerText = "์ฌ์์ค"; // ์ฌ์์ค์ผ ๊ฒฝ์ฐ ์ฌ์์ค ๋ฉํธ ์ถ๊ฐ
}
musicListAll[i].setAttribute("onclick", "clicked(this)");
}
}
// ๋ฎค์ง ๋ฆฌ์คํธ๋ฅผ ํด๋ฆญํ๋ฉด
function clicked(el){
let getLiIndex = el.getAttribute("data-index"); // ํด๋ฆญํ ๋ฆฌ์คํธ์ ์ธ๋ฑ์ค ๊ฐ์ ์ ์ฅ
musicIndex = getLiIndex; // ํด๋ฆญํ ์ธ๋ฑ์ค ๊ฐ์ ๋ฎค์ง ์ธ๋ฑ์ค์ ์ ์ฅ
loadMusic(musicIndex); // ํด๋น ์ธ๋ฑ์ค ๋ฎค์ง ๋ก๋
playMusic(); // ์์
์ฌ์
playListMusic(); // ์์
๋ฆฌ์คํธ ์
๋ฐ์ดํธ
}
// ๋ฎค์ง ์งํ๋ฐ
musicAudio.addEventListener("timeupdate", e => {
// console.log(e);
const currentTime = e.target.currentTime; // ํ์ฌ ์ฌ์๋๋ ์๊ฐ
const duration = e.target.duration; // ์ค๋์ค์ ์ด ๊ธธ์ด
let progressWidth = (currentTime/duration) * 100; // ์ ์ฒด๊ธธ์ด์์ ํ์ฌ ์งํ๋๋ ์๊ฐ์ ๋ฐฑ๋ถ์๋ก ๋๋
musicProgressBar.style.width = `${progressWidth}%`;
// ์ ์ฒด ์๊ฐ
musicAudio.addEventListener("loadeddata", () => {
let audioDuration = musicAudio.duration;
let totalMin = Math.floor(audioDuration / 60); // ์ ์ฒด์๊ฐ์ ๋ถ๋จ์๋ก ์ชผ๊ฐฌ
let totalSec = Math.floor(audioDuration % 60); // ๋จ์ ์ด๋ฅผ ์ ์ฅ
if(totalSec < 10) totalSec = `0${totalSec}`; // ์ด๊ฐ ํ์๋ฆฌ์์ผ๋ ์ผ์ ์๋ฆฌ์ ์์ 0์ ๋ถ์
musicProgressDuration.innerText = `${totalMin}:${totalSec}`; // ์์ฑ๋ ์๊ฐ ๋ฌธ์์ด
});
// ์งํ ์๊ฐ
let currentMin = Math.floor(currentTime / 60);
let currentSec = Math.floor(currentTime % 60);
if(currentSec < 10) currentSec = `0${currentSec}`;
musicProgressCurrent.innerText = `${currentMin}:${currentSec}`;
});
// ์งํ ๋ฒํผ ํด๋ฆญ
musicProgress.addEventListener("click", (e) => {
let progressWidth = musicProgress.clientWidth; // ์งํ๋ฐ ์ ์ฒด ๊ธธ์ด
let clickedOffsetX = e.offsetX; // ์งํ๋ฐ ๊ธฐ์ค์ผ๋ก ์ธก์ ๋๋ X์ขํ๊ฐ
let songDuration = musicAudio.duration; // ์ค๋์ค ์ ์ฒด ๊ธธ์ด
musicAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration; // ๋ฐฑ๋ถ์๋ก ๋๋ ์ซ์์ ๋ค์ ์ ์ฒด ๊ธธ์ด๋ฅผ ๊ณฑํด์ ํ์ฌ ์ฌ์๊ฐ์ผ๋ก ๋ฐ๊ฟ
});
// ๋ฐ๋ณต ๋ฒํผ ํด๋ฆญ
musicRepeat.addEventListener("click", () => {
let getAttr = musicRepeat.getAttribute("class");
switch(getAttr){
case "repeat" :
musicRepeat.setAttribute("class", "repeat_one");
musicRepeat.setAttribute("title", "ํ๊ณก ๋ฐ๋ณต");
break;
case "repeat_one" :
musicRepeat.setAttribute("class", "shuffle");
musicRepeat.setAttribute("title", "๋๋ค ์ฌ์");
break;
case "shuffle" :
musicRepeat.setAttribute("class", "repeat");
musicRepeat.setAttribute("title", "์ ์ฒด ๋ฐ๋ณต");
break;
}
});
// ์ค๋์ค๊ฐ ๋๋๋ฉด
musicAudio.addEventListener("ended", () => {
let getAttr = musicRepeat.getAttribute("class");
switch(getAttr) {
case "repeat" :
nextMusic();
break;
case "repeat_one" :
playMusic();
break;
case "shuffle" :
let randomIndex = Math.floor(Math.random() * allMusic.length + 1); // ๋๋ค ์ธ๋ฑ์ค ์์ฑ
do {
randomIndex = Math.floor(Math.random() * allMusic.length + 1);
} while ( musicIndex == randomIndex )
musicIndex = randomIndex; // ํ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋๋ค ์ธ๋ฑ์ค๋ก ๋ณ๊ฒฝ
loadMusic(musicIndex); // ๋๋ค ์ธ๋ฑ์ค๊ฐ ๋ฐ์๋ ํ์ฌ ์ธ๋ฑ์ค ๊ฐ์ผ๋ก ์์
์ ๋ค์ ๋ก๋
playMusic(); // ๋ก๋ํ ์์
์ ์ฌ์
break;
}
playListMusic(); // ์ฌ์๋ชฉ๋ก ์
๋ฐ์ดํธ
});
// ๋ฒํผ ๋ฐ๊ฟ์ฃผ๊ธฐ
const btnPlay = document.querySelector("#control-play");
const btnStop = document.querySelector("#control-stop");
btnStop.style.display = "none";
btnPlay.addEventListener("click", () => {
playMusic();
btnStop.style.display = "block";
btnPlay.style.display = "none";
});
btnStop.addEventListener("click", () => {
pauseMusic();
btnStop.style.display = "none";
btnPlay.style.display = "block";
});
// ๋ก๋
window.addEventListener("load", () => {
loadMusic(musicIndex); // ์์
์ฌ์
playListMusic(); // ๋ฆฌ์คํธ ์ด๊ธฐํ
});
// ๋ฎค์ง ํ๋ ์ด์ด ๋ฆฌ์คํธ ๋ซ๊ธฐ ๋ฒํผ ๋๋ฅด๋ฉด
const musicListList = document.querySelector(".music__list");
const musicListCloseBtn = document.querySelector("#control-close");
musicListCloseBtn.addEventListener("click", () => {
musicListList.classList.add("close");
});
// ๋ฎค์ง ํ๋ ์ด์ด ๋ฆฌ์คํธ ๋ฒํผ ๋๋ฅด๋ฉด
const musicControlListBtn = document.querySelector(".music__control .list");
musicControlListBtn.addEventListener("click", () => {
musicListList.classList.remove("close");
});
// ๋ณผ๋ฅจ ์กฐ์
const audio = document.getElementById("main-audio");
const audioVolume = document.getElementById("volume-control");
const volumeIcon = document.querySelector(".volume_icon");
const volumeOffIcon = document.querySelector(".volumeOff_icon");
audioVolume.addEventListener("change", function (e) {
audio.volume = this.value / 10;
if (this.value == 0) {
volumeIcon.classList.add("hide");
volumeOffIcon.classList.add("show");
} else {
volumeIcon.classList.remove("hide");
volumeOffIcon.classList.remove("show");
}
});
๋๊ธ