



์์ ์ด ์ฌ์์ค์ผ๋๋ง ๊ณก ์ ๋ณด(์ ๋ชฉ, ํ๋ก๊ทธ๋ ์ค๋ฐ)๊ฐ ํ์๋๋ ๋ฎค์ง ํ๋ ์ด์ด
๋คํฌ๋ชจ๋์์ ์ด๋ป๋ณด์ด๋๋ก ๋ ธ์ ์์์ผ๋ก ๋ฐฐ๊ฒฝ์ ๋ฃ์ด ์ฃผ์๋ค.
์์ ๋ฐ๋ ๋๋ง๋ค ํ๋ ์๊น์ด ๋ฐ๋๊ฒ ์ค์ ํด ๋ณด๋ ์ด์๋ค!
๋น๋ฉ์ด๋ ๋ฌ์ ๋ฌด๋ฃ svg ์ฌ์ดํธ์์ ๊ฐ์ ธ์์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
CSS ๋ก ํฌ๊ธฐ์ ์์น ์กฐ์ ํด์ ์ํ๋ ๊ณณ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ๋ธ๋ก๊ทธ์์ ๊ตฌ๊ธ ์ ๋์ผ์ค๋ ๊ด๊ณ ๋ก ์์ต ์ฐฝ์ถํ์๋ ๋ถ๋ค์ ๋ฐฐ๊ฒฝ์์ ์ ์์ ํด ์ฃผ์ธ์
์์ ์ ๋ชฉ์ ์ผ๋ก ๋ธ๊ธ ์ฐ์๋ฉด ๋ ธ๋ ธ๋ ธ
[html ์ฝ๋]
<div class="music-body">
<div class="music-container" id="music-container">
<div class="music-info">
<h2 id="title" class="title"></h2>
<div class="progress-container" id="progress-container">
<div class="progress" id="progress"></div>
</div>
</div>
<audio src=""
id="audio"></audio>
<div class="img-container">
<img decoding="async" src=""
alt="music-cover"
id="cover" />
</div>
<div class="navigation">
<button id="prev" class="action-btn">
<i class="fas fa-backward"></i>
</button>
<button id="play" class="action-btn action-btn-big">
<i class="fas fa-play"></i>
</button>
<button id="next" class="action-btn">
<i class="fas fa-forward"></i>
</button>
</div>
<div class="buildings-container">
<img class="buildings" src="./images/moonbuildings.png" alt="">
</div>
</div>
</div>
[์๋ฐ์คํฌ๋ฆฝํธ ์์ค]
<!-- ๋ฎค์งํ๋ ์ด์ด js (24.12.03) -->
<script>
const musicBody = document.querySelector(".music-body");
const musicContainer = document.getElementById("music-container");
const playButton = document.getElementById("play");
const prevButton = document.getElementById("prev");
const nextButton = document.getElementById("next");
const audio = document.getElementById("audio");
const progress = document.getElementById("progress");
const progressContainer = document.getElementById("progress-container");
const title = document.getElementById("title");
const cover = document.getElementById("cover");
// ๊ฐ๋ณ ํ์ผ ๊ฒฝ๋ก์ ์ด๋ฆ ์ง์
const songs = [
{
title: "์์
์ ๋ชฉ1",
audioPath: "์์
๊ฒฝ๋ก1",
imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก1",
bgColor: "๋ฐฐ๊ฒฝ์1"
},
{
title: "์์
์ ๋ชฉ2",
audioPath: "์์
๊ฒฝ๋ก2",
imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก2",
bgColor: "๋ฐฐ๊ฒฝ์2"
},
{
title: "์์
์ ๋ชฉ3",
audioPath: "์์
๊ฒฝ๋ก3",
imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก3",
bgColor: "์ด๋ฏธ์ง๊ฒฝ๋ก3"
},
];
let songIndex = 0; // ๊ธฐ๋ณธ์ผ๋ก ์ฒซ ๋ฒ์งธ ๊ณก ์ค์
// ๋
ธ๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์
function loadSong(song) {
title.innerText = song.title; // ์ ๋ชฉ ์ค์
audio.src = song.audioPath; // ์ค๋์ค ๊ฒฝ๋ก ์ค์
cover.src = song.imagePath; // ์ด๋ฏธ์ง ๊ฒฝ๋ก ์ค์
musicBody.style.background = song.bgColor;
}
// ๋
ธ๋ ์ฌ์
function playSong() {
musicContainer.classList.add("play");
playButton.querySelector("i.fas").classList.remove("fa-play");
playButton.querySelector("i.fas").classList.add("fa-pause");
audio.play();
}
// ๋
ธ๋ ์ผ์ ์ ์ง
function pauseSong() {
musicContainer.classList.remove("play");
playButton.querySelector("i.fas").classList.remove("fa-pause");
playButton.querySelector("i.fas").classList.add("fa-play");
audio.pause();
}
// ์ด์ ๊ณก์ผ๋ก ์ด๋
function prevSong() {
songIndex--;
if (songIndex < 0) songIndex = songs.length - 1;
loadSong(songs[songIndex]);
playSong();
}
// ๋ค์ ๊ณก์ผ๋ก ์ด๋
function nextSong() {
songIndex++;
if (songIndex > songs.length - 1) songIndex = 0;
loadSong(songs[songIndex]);
playSong();
}
// ์งํ ๋ฐ ์
๋ฐ์ดํธ
function updateProgress(e) {
const { duration, currentTime } = e.srcElement;
const progressPercent = (currentTime / duration) * 100;
progress.style.width = `${progressPercent}%`;
}
// ์งํ ๋ฐ ํด๋ฆญ ์ ์์น ์ค์
function setProgress(e) {
const width = this.clientWidth;
const clickX = e.offsetX;
const duration = audio.duration;
audio.currentTime = (clickX / width) * duration;
}
// ์ด๋ฒคํธ ๋ฆฌ์ค๋
playButton.addEventListener("click", () => {
const isPlaying = musicContainer.classList.contains("play");
isPlaying ? pauseSong() : playSong();
});
prevButton.addEventListener("click", prevSong);
nextButton.addEventListener("click", nextSong);
audio.addEventListener("timeupdate", updateProgress);
progressContainer.addEventListener("click", setProgress);
audio.addEventListener("ended", nextSong);
// ์ฒซ ๊ณก ๋ก๋
loadSong(songs[songIndex]);
</script>
<!-- ๋ฎค์งํ๋ ์ด์ด js (24.12.03) ๋ -->
[CSS]๋ ๋น๊ณต๊ฐ >_<
'BlogCustom' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ




์์ ์ด ์ฌ์์ค์ผ๋๋ง ๊ณก ์ ๋ณด(์ ๋ชฉ, ํ๋ก๊ทธ๋ ์ค๋ฐ)๊ฐ ํ์๋๋ ๋ฎค์ง ํ๋ ์ด์ด
๋คํฌ๋ชจ๋์์ ์ด๋ป๋ณด์ด๋๋ก ๋ ธ์ ์์์ผ๋ก ๋ฐฐ๊ฒฝ์ ๋ฃ์ด ์ฃผ์๋ค.
์์ ๋ฐ๋ ๋๋ง๋ค ํ๋ ์๊น์ด ๋ฐ๋๊ฒ ์ค์ ํด ๋ณด๋ ์ด์๋ค!
๋น๋ฉ์ด๋ ๋ฌ์ ๋ฌด๋ฃ svg ์ฌ์ดํธ์์ ๊ฐ์ ธ์์ ๋ฃ์ด์ฃผ์์ต๋๋ค.
CSS ๋ก ํฌ๊ธฐ์ ์์น ์กฐ์ ํด์ ์ํ๋ ๊ณณ์ ์ถ๊ฐํ๋ฉด ๋๋ค.
์ฐธ๊ณ ๋ก ๋ธ๋ก๊ทธ์์ ๊ตฌ๊ธ ์ ๋์ผ์ค๋ ๊ด๊ณ ๋ก ์์ต ์ฐฝ์ถํ์๋ ๋ถ๋ค์ ๋ฐฐ๊ฒฝ์์ ์ ์์ ํด ์ฃผ์ธ์
์์ ์ ๋ชฉ์ ์ผ๋ก ๋ธ๊ธ ์ฐ์๋ฉด ๋ ธ๋ ธ๋ ธ
[html ์ฝ๋]
<div class="music-body"> <div class="music-container" id="music-container"> <div class="music-info"> <h2 id="title" class="title"></h2> <div class="progress-container" id="progress-container"> <div class="progress" id="progress"></div> </div> </div> <audio src="" id="audio"></audio> <div class="img-container"> <img decoding="async" src="" alt="music-cover" id="cover" /> </div> <div class="navigation"> <button id="prev" class="action-btn"> <i class="fas fa-backward"></i> </button> <button id="play" class="action-btn action-btn-big"> <i class="fas fa-play"></i> </button> <button id="next" class="action-btn"> <i class="fas fa-forward"></i> </button> </div> <div class="buildings-container"> <img class="buildings" src="./images/moonbuildings.png" alt=""> </div> </div> </div>
[์๋ฐ์คํฌ๋ฆฝํธ ์์ค]
<!-- ๋ฎค์งํ๋ ์ด์ด js (24.12.03) --> <script> const musicBody = document.querySelector(".music-body"); const musicContainer = document.getElementById("music-container"); const playButton = document.getElementById("play"); const prevButton = document.getElementById("prev"); const nextButton = document.getElementById("next"); const audio = document.getElementById("audio"); const progress = document.getElementById("progress"); const progressContainer = document.getElementById("progress-container"); const title = document.getElementById("title"); const cover = document.getElementById("cover"); // ๊ฐ๋ณ ํ์ผ ๊ฒฝ๋ก์ ์ด๋ฆ ์ง์ const songs = [ { title: "์์
์ ๋ชฉ1", audioPath: "์์
๊ฒฝ๋ก1", imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก1", bgColor: "๋ฐฐ๊ฒฝ์1" }, { title: "์์
์ ๋ชฉ2", audioPath: "์์
๊ฒฝ๋ก2", imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก2", bgColor: "๋ฐฐ๊ฒฝ์2" }, { title: "์์
์ ๋ชฉ3", audioPath: "์์
๊ฒฝ๋ก3", imagePath: "์ด๋ฏธ์ง๊ฒฝ๋ก3", bgColor: "์ด๋ฏธ์ง๊ฒฝ๋ก3" }, ]; let songIndex = 0; // ๊ธฐ๋ณธ์ผ๋ก ์ฒซ ๋ฒ์งธ ๊ณก ์ค์ // ๋
ธ๋ ์ ๋ณด๋ฅผ ๋ถ๋ฌ์ค๋ ํจ์ function loadSong(song) { title.innerText = song.title; // ์ ๋ชฉ ์ค์ audio.src = song.audioPath; // ์ค๋์ค ๊ฒฝ๋ก ์ค์ cover.src = song.imagePath; // ์ด๋ฏธ์ง ๊ฒฝ๋ก ์ค์ musicBody.style.background = song.bgColor; } // ๋
ธ๋ ์ฌ์ function playSong() { musicContainer.classList.add("play"); playButton.querySelector("i.fas").classList.remove("fa-play"); playButton.querySelector("i.fas").classList.add("fa-pause"); audio.play(); } // ๋
ธ๋ ์ผ์ ์ ์ง function pauseSong() { musicContainer.classList.remove("play"); playButton.querySelector("i.fas").classList.remove("fa-pause"); playButton.querySelector("i.fas").classList.add("fa-play"); audio.pause(); } // ์ด์ ๊ณก์ผ๋ก ์ด๋ function prevSong() { songIndex--; if (songIndex < 0) songIndex = songs.length - 1; loadSong(songs[songIndex]); playSong(); } // ๋ค์ ๊ณก์ผ๋ก ์ด๋ function nextSong() { songIndex++; if (songIndex > songs.length - 1) songIndex = 0; loadSong(songs[songIndex]); playSong(); } // ์งํ ๋ฐ ์
๋ฐ์ดํธ function updateProgress(e) { const { duration, currentTime } = e.srcElement; const progressPercent = (currentTime / duration) * 100; progress.style.width = `${progressPercent}%`; } // ์งํ ๋ฐ ํด๋ฆญ ์ ์์น ์ค์ function setProgress(e) { const width = this.clientWidth; const clickX = e.offsetX; const duration = audio.duration; audio.currentTime = (clickX / width) * duration; } // ์ด๋ฒคํธ ๋ฆฌ์ค๋ playButton.addEventListener("click", () => { const isPlaying = musicContainer.classList.contains("play"); isPlaying ? pauseSong() : playSong(); }); prevButton.addEventListener("click", prevSong); nextButton.addEventListener("click", nextSong); audio.addEventListener("timeupdate", updateProgress); progressContainer.addEventListener("click", setProgress); audio.addEventListener("ended", nextSong); // ์ฒซ ๊ณก ๋ก๋ loadSong(songs[songIndex]); </script> <!-- ๋ฎค์งํ๋ ์ด์ด js (24.12.03) ๋ -->
[CSS]๋ ๋น๊ณต๊ฐ >_<