๋ด ํ์์ ์ฌ์ฉ์ค์ธ ๋ฎค์ง ํ๋ ์ด์ด
๋ง์ฐ์ค ๋๋๊ทธ๋ก ์ด๋ ๊ฐ๋ฅ / ์ฌ์์ค์ธ ์์ ๋๊ธฐ์ง ์์ / ๋ชจ๋ฐ์ผ ์ง์
css ์์ ๋์์ธ ์ถ๊ฐ ๋ฐ ํธ์ง ๋ง๋๋ฃจ ํ์ธ์ ์ ๋ ๋ค๋ฅธ ์ฌ๋๋ค๊บผ ๋ณด๊ณ ์ฐธ๊ณ ํด์ ๋ง๋ ๊ฑฐ๊ธฐ ๋๋ฌธ์...
See the Pen Untitled by 123 (@123-the-scripter) on CodePen.
์ด๋ณด์๋ฅผ ์ํ ๋ณต๋ถ ๊ฐ์ด๋
ํด๋น ์ฝ๋๋ธ๋ญ ๋ด์ฉ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ํฐ์คํ ๋ฆฌ ์คํจ ํธ์ง > htmlํธ์ง ํด๋ฆญ > ๋น ๊ณณ ์๋ฌด๋ฐ๋ (๋งจ ์๋ ์ถ์ฒ) ๋ถ์ฌ๋ฃ๊ธฐ
์ด๊ฒ๋ง ์ ์ฉํ์๋ฉด ๋ชป์๊ธด๊ฒ ๋ ๋ค๋๋๋ค ์๋ CSS๊น์ง ์ ์ฉํด์ผ ๋ฉ๋๋ค
** 'song1.mp3', 'song2.mp3', 'song3.mp3' ์ด์๋ฆฌ์ ํ์ฅ์๋ช .mp3์ธ ํ์ผ์ ์ง์ด๋ฃ์ผ๋ฉด ์ฌ์๋ฉ๋๋ค
ํฐ์คํ ๋ฆฌ ๊ธ์ฐ๊ธฐ > ๋ฃ๊ณ ์ถ์ ์์ ํ์ผ mp3ํ์ผ ์ฝ์ > ํด๋น ํ์ผ์ ๋งํฌ ๋ณต์ฌ > songN.mp3 ์๋ฆฌ์ ๋ถ์ฌ๋ฃ๊ธฐ
<!-- MP3 Player -->
<div class="mp3-player" id="music-player">
<button class="mp3-player-btn" id="prev">|โ</button>
<button class="mp3-player-btn" id="play-pause">โถ</button>
<button class="mp3-player-btn" id="next">โท|</button>
</div>
<!-- MP3 Player JavaScript -->
<script>
const audioFiles = [
'song1.mp3',
'song2.mp3',
'song3.mp3'
];
let currentTrackIndex = parseInt(localStorage.getItem('currentTrackIndex')) || 0;
let isPlaying = localStorage.getItem('isPlaying') === 'true';
const audio = new Audio(audioFiles[currentTrackIndex]);
if (isPlaying) {
audio.play().catch(() => {
console.log('Auto-play blocked by browser policy.');
});
}
const playPauseButton = document.getElementById('play-pause');
const prevButton = document.getElementById('prev');
const nextButton = document.getElementById('next');
const musicPlayer = document.getElementById('music-player');
const updatePlayPauseButton = () => {
playPauseButton.textContent = isPlaying ? 'โโ' : 'โถ';
};
const playTrack = () => {
audio.play().then(() => {
isPlaying = true;
localStorage.setItem('isPlaying', 'true');
updatePlayPauseButton();
}).catch((err) => {
console.error('Playback failed:', err);
});
};
const pauseTrack = () => {
audio.pause();
isPlaying = false;
localStorage.setItem('isPlaying', 'false');
updatePlayPauseButton();
};
const switchTrack = (index) => {
audio.pause();
currentTrackIndex = (index + audioFiles.length) % audioFiles.length;
localStorage.setItem('currentTrackIndex', currentTrackIndex);
audio.src = audioFiles[currentTrackIndex];
if (isPlaying) {
audio.play().catch(() => {
console.log('Auto-play blocked.');
});
}
};
playPauseButton.addEventListener('click', () => {
isPlaying ? pauseTrack() : playTrack();
});
prevButton.addEventListener('click', () => {
switchTrack(currentTrackIndex - 1);
});
nextButton.addEventListener('click', () => {
switchTrack(currentTrackIndex + 1);
});
updatePlayPauseButton();
// ์ด์ ์ฌ์ ์๊ฐ ๋ถ๋ฌ์ค๊ธฐ
window.addEventListener('beforeunload', () => {
localStorage.setItem('currentTime', audio.currentTime);
});
const savedTime = localStorage.getItem('currentTime');
if (savedTime) audio.currentTime = parseFloat(savedTime);
// ๋๋๊ทธ ๊ธฐ๋ฅ
let isDragging = false;
let offsetX, offsetY;
const savePlayerPosition = () => {
const rect = musicPlayer.getBoundingClientRect();
localStorage.setItem('playerPosition', JSON.stringify({ top: rect.top, left: rect.left }));
};
const loadPlayerPosition = () => {
const position = JSON.parse(localStorage.getItem('playerPosition'));
if (position) {
musicPlayer.style.top = `${position.top}px`;
musicPlayer.style.left = `${position.left}px`;
musicPlayer.style.right = 'auto';
musicPlayer.style.bottom = 'auto';
}
};
musicPlayer.addEventListener('mousedown', (e) => {
isDragging = true;
offsetX = e.clientX - musicPlayer.getBoundingClientRect().left;
offsetY = e.clientY - musicPlayer.getBoundingClientRect().top;
});
document.addEventListener('mousemove', (e) => {
if (isDragging) {
musicPlayer.style.left = `${e.clientX - offsetX}px`;
musicPlayer.style.top = `${e.clientY - offsetY}px`;
musicPlayer.style.right = 'auto';
musicPlayer.style.bottom = 'auto';
}
});
document.addEventListener('mouseup', () => {
if (isDragging) {
isDragging = false;
savePlayerPosition();
}
});
loadPlayerPosition();
</script>
ํด๋น ์ฝ๋๋ธ๋ญ ๋ด์ฉ์ ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ํฐ์คํ ๋ฆฌ ์คํจ ํธ์ง > htmlํธ์ง ํด๋ฆญ > ์ต์๋จ์ CSS ํด๋ฆญ > ๋น ๊ณณ ์๋ฌด๋ฐ๋ (๋งจ ์๋ ์ถ์ฒ) ๋ถ์ฌ๋ฃ๊ธฐ
์ฝ๊ฒ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ์์
- .mp3-player์ height (ํ๋ ์ด์ด ๋ฐ์ค ๋์ด) width (ํ๋ ์ด์ด ๋ฐ์ค ๋์ด)
- mp3-player์ background-color(ํ๋ ์ด์ด ๋ฐ์ค ์์) : html ์์์ฝ๋ ์ฌ์ดํธ์์ ์ํ๋ ์์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
- mp3-player์ box-shadow (๊ทธ๋ฆผ์ ์ค์ ) : rgb๊ฐ ์กฐ์ ํ์ฌ ์์ ๋ณ๊ฒฝ + ํฌ๋ช ๋ ์กฐ์ ๊ฐ๋ฅ
- mp3-player button์ font-size(์ฌ์/์ผ์์ ์ง ๋ค๋ก๊ฐ๊ธฐ ์์ผ๋ก๊ฐ๊ธฐ ํฌ๊ธฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ)
- mp3-player button:hover์ color(๋ง์ฐ์ค ์ฌ๋ ธ์ ๋ ๋ฒํผ ์์ ๋ณํ)
.mp3-player {
position: fixed;
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
height: 40px;
width: 120px;
border-radius: 10px;
background-color: #f0f0f0;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
z-index: 9999;
cursor: grab;
}
.mp3-player:active {
cursor: grabbing;
}
.mp3-player button {
background: none;
border: none;
font-size: 15px;
cursor: pointer;
}
.mp3-player button:focus {
outline: none;
}
.mp3-player button:hover {
color: #ccc;
}
CSS๋ฅผ <style>๋ก ๋ฌถ์ด์ html์ ํ๋ฒ์ ์ง์ด๋ฃ๋ ๋ฐฉ๋ฒ๋ ์๋๋ฐ ๊ทธ๋ ๊ฒ ํ๋ฉด ์ค์ ๊ฐ์ด em์ธ ์ ๋ค์ ํฌ๊ธฐ๊ฐ ๋ค์ฅ๋ ์ฅํด์ง๋๋ผ๊ณ ์ ๊ทธ๋๋ ๋๋ ์ด๋ ค์์ ๋ชปํ๊ฒ ๋ค ํ์๋ ๋ถ๋ค์ ์ํด HTML ํตํฉ ์ฝ๋๋ ๋ฌ์๋์ต๋๋ค
<div id="music-player-wrapper">
<div class="mp3-player" id="music-player">
<button class="mp3-player-btn" id="prev">|โ</button>
<button class="mp3-player-btn" id="play-pause">โถ</button>
<button class="mp3-player-btn" id="next">โท|</button>
</div>
</div>
<style>
.mp3-player {
position: fixed;
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
height: 40px;
width: 120px;
border-radius: 10px;
background-color: #f0f0f0;
box-shadow: 0px 4px 6px rgba(0, 0, 0, 0.1);
z-index: 9999;
cursor: grab;
}
.mp3-player:active {
cursor: grabbing;
}
.mp3-player button {
background: none;
border: none;
font-size: 15px;
cursor: pointer;
}
.mp3-player button:focus {
outline: none;
}
.mp3-player button:hover {
color: #ccc;
}
</style>
<!-- MP3 Player JavaScript -->
<script>
const audioFiles = [
'song1.mp3',
'song2.mp3',
'song3.mp3'
];
let currentTrackIndex = parseInt(localStorage.getItem('currentTrackIndex')) || 0;
let isPlaying = localStorage.getItem('isPlaying') === 'true';
const audio = new Audio(audioFiles[currentTrackIndex]);
if (isPlaying) {
audio.play().catch(() => {
console.log('Auto-play blocked by browser policy.');
});
}
const playPauseButton = document.getElementById('play-pause');
const prevButton = document.getElementById('prev');
const nextButton = document.getElementById('next');
const musicPlayer = document.getElementById('music-player');
const updatePlayPauseButton = () => {
playPauseButton.textContent = isPlaying ? 'โโ' : 'โถ';
};
const playTrack = () => {
audio.play().then(() => {
isPlaying = true;
localStorage.setItem('isPlaying', 'true');
updatePlayPauseButton();
}).catch((err) => {
console.error('Playback failed:', err);
});
};
const pauseTrack = () => {
audio.pause();
isPlaying = false;
localStorage.setItem('isPlaying', 'false');
updatePlayPauseButton();
};
const switchTrack = (index) => {
audio.pause();
currentTrackIndex = (index + audioFiles.length) % audioFiles.length;
localStorage.setItem('currentTrackIndex', currentTrackIndex);
audio.src = audioFiles[currentTrackIndex];
if (isPlaying) {
audio.play().catch(() => {
console.log('Auto-play blocked.');
});
}
};
playPauseButton.addEventListener('click', () => {
isPlaying ? pauseTrack() : playTrack();
});
prevButton.addEventListener('click', () => {
switchTrack(currentTrackIndex - 1);
});
nextButton.addEventListener('click', () => {
switchTrack(currentTrackIndex + 1);
});
updatePlayPauseButton();
// ์ด์ ์ฌ์ ์๊ฐ ๋ถ๋ฌ์ค๊ธฐ
window.addEventListener('beforeunload', () => {
localStorage.setItem('currentTime', audio.currentTime);
});
const savedTime = localStorage.getItem('currentTime');
if (savedTime) audio.currentTime = parseFloat(savedTime);
// ๋๋๊ทธ ๊ธฐ๋ฅ
let isDragging = false;
let offsetX, offsetY;
const savePlayerPosition = () => {
const rect = musicPlayer.getBoundingClientRect();
localStorage.setItem('playerPosition', JSON.stringify({ top: rect.top, left: rect.left }));
};
const loadPlayerPosition = () => {
const position = JSON.parse(localStorage.getItem('playerPosition'));
if (position) {
musicPlayer.style.top = `${position.top}px`;
musicPlayer.style.left = `${position.left}px`;
musicPlayer.style.right = 'auto';
musicPlayer.style.bottom = 'auto';
}
};
musicPlayer.addEventListener('mousedown', (e) => {
isDragging = true;
offsetX = e.clientX - musicPlayer.getBoundingClientRect().left;
offsetY = e.clientY - musicPlayer.getBoundingClientRect().top;
});
document.addEventListener('mousemove', (e) => {
if (isDragging) {
musicPlayer.style.left = `${e.clientX - offsetX}px`;
musicPlayer.style.top = `${e.clientY - offsetY}px`;
musicPlayer.style.right = 'auto';
musicPlayer.style.bottom = 'auto';
}
});
document.addEventListener('mouseup', () => {
if (isDragging) {
isDragging = false;
savePlayerPosition();
}
});
loadPlayerPosition();
</script>