- ์Œ์•… ํ”Œ๋ ˆ์ด์–ด3

PC ์ตœ์ ํ™”๋ผ ๋ชจ๋ฐ”์ผ์—์„  ๋‚˜์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค!

์˜ˆ์‹œ / ํ”„๋ฆฐ๋‹˜, ์„œ๋‹˜cm

<!-- Font Awesome ํ˜ธ์ถœ -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<link href="https://fonts.googleapis.com/css2?family=DotGothic16&family=Coral+Pixels&display=swap" rel="stylesheet">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=New+Tegomin&display=swap" rel="stylesheet">
<div id="music-player-container">
    <div class="player-wrapper">
        
        <!-- 1. ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ (์™ผ์ชฝ) -->
        <div id="playlist-window" class="playlist-window">
            <div class="pl-header">Playlist</div>
            <div class="pl-body-box">
                <ul id="playlist-ul">
                    <li>๋…ธ๋ž˜ ์ œ๋ชฉ 1 - ๊ฐ€์ˆ˜</li>
                    <li>๋…ธ๋ž˜ ์ œ๋ชฉ 2 - ๊ฐ€์ˆ˜</li>
                </ul>
            </div>
        </div>
        <!-- 2. ๋ฉ”์ธ ํ”Œ๋ ˆ์ด์–ด ๋ณธ์ฒด (๋†’์ด ์กฐ์ ˆ๋จ) -->
        <div id="main-player-body" class="main-player">
            <!-- ์ ‘๊ธฐ ๋ฒ„ํŠผ (ใ…ก ๋ชจ์–‘) -->
            <div class="toggle-fold" onclick="toggleFold(event)">
                <i class="fa-solid fa-minus"></i>
            </div>
            <!-- ๊ธฐ๋ณธ ์บ๋ฆญํ„ฐ (๋ฐฐ์œจ ์œ ์ง€, ์œ„์น˜ ์žฌ์กฐ์ •) -->
            <div id="char-wrap" class="char-wrap" onclick="togglePlaylist()">
                <div id="song-bubble" class="song-bubble"></div>
                <img src="" id="main-char" class="character-img" alt="char">
            </div>
            
            <!-- ์žฌ์ƒ ๋ฐ” -->
            <div class="progress-container" id="p-container">
                <div class="progress-base">
                    <div class="progress-fill" id="p-bar">
                        <div class="progress-thumb"></div>
                    </div>
                </div>
            </div>
            <!-- ์ปจํŠธ๋กค ๋ฒ„ํŠผ -->
            <div class="control-btns">
                <div class="btn-circle" onclick="prevTrack()"><i class="fa-solid fa-backward-step"></i></div>
                <div class="btn-circle main-play" onclick="togglePlay()">
                    <i class="fa-solid fa-play" id="play-pause-icon"></i>
                </div>
                <div class="btn-circle" onclick="nextTrack()"><i class="fa-solid fa-forward-step"></i></div>
            </div>
            <!-- ๋ณผ๋ฅจ ํ™œ์„ฑํ™” ๋ฒ„ํŠผ -->
            <i class="fa-solid fa-volume-high vol-toggle-btn" onclick="toggleVolume()"></i>
        </div>
        <!-- 3. ๋ณผ๋ฅจ ๋ฐ” (์˜ค๋ฅธ์ชฝ ์˜†) -->
        <div id="vol-panel" class="vol-side-panel">
            <div class="vol-base">
                <input type="range" min="0" max="100" value="50" class="vol-range" id="vol-slider">
            </div>
        </div>
        <!-- 4. ์ ‘ํ˜”์„ ๋•Œ ์ „์šฉ ์บ๋ฆญํ„ฐ -->
        <div id="folded-mode-area" style="display: none;" onclick="toggleFold(event)">
            <div id="folded-bubble" class="song-bubble"></div>
            <img src="์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€ ์ฃผ์†Œ" id="folded-char" class="character-img" alt="folded-char">
        </div>
    </div>
</div>
<style>
    :root {
        --bg-main: #E4E4E4;
        --btn-bg: #B9B9B9;
        --icon-main: #7B7B7B;
        --bar-base: #CECECE;
        --bar-fill: #7B7B7B;
        --bar-thumb: #5C5C5C;
        --sub-icon: #ABABAB;
        --pl-box: #B9B9B9;
        --pl-text: #7F7F7F;
    }
    #music-player-container { position: fixed; bottom: 30px; left: 30px; z-index: 10000; font-family: 'Coral Pixels', 'New Tegomin', sans-serif; }
    .player-wrapper { display: flex; align-items: flex-end; gap: 12px; position: relative; }
    /* ๋ฉ”์ธ ํ”Œ๋ ˆ์ด์–ด - ๋ฐ˜ํˆฌ๋ช… ์ฒ˜๋ฆฌ */
    .main-player { width: 340px; height: 90px; background: rgba(228, 228, 228, 0.75); backdrop-filter: blur(8px); border-radius: 20px; 
                   padding: 10px 15px; box-sizing: border-box; display: flex; flex-direction: column; 
                   justify-content: flex-end; align-items: center; position: relative; }
    .char-wrap { 
        width: 80px; 
        position: absolute; 
        bottom: 64px;
        transform: translateX(-50%); 
        cursor: pointer; 
        transition: left 0.1s linear; 
        z-index: 10; 
    }
    /* src๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด ์ˆจ๊ฒจ์„œ ๊นœ๋นก์ž„ ๋ฐฉ์ง€ */
    .character-img { width: 100%; height: auto; display: block; pointer-events: none; }
    .character-img[src=""] { visibility: hidden; }
    /* ๋งํ’์„  ์Šคํƒ€์ผ */
    .song-bubble {
        position: absolute;
        bottom: 100%;
        left: 50%;
        transform: translateX(-50%);
        background: #fff;
        color: #555;
        font-size: 9px;
        font-weight: 600;
        padding: 4px 8px;
        border-radius: 8px;
        white-space: nowrap;
        box-shadow: 0 2px 8px rgba(0,0,0,0.12);
        margin-bottom: 6px;
        opacity: 0;
        pointer-events: none;
        transition: opacity 0.3s ease;
    }
    /* ๋งํ’์„  ๊ผฌ๋ฆฌ (์‚ผ๊ฐํ˜•) */
    .song-bubble::after {
        content: '';
        position: absolute;
        top: 100%;
        left: 50%;
        transform: translateX(-50%);
        border: 5px solid transparent;
        border-top-color: #fff;
    }
    .song-bubble.show { opacity: 1; }
    .char-wrap.jumping { animation: jumpAnimWrap 1.0s infinite ease-in-out; }
    @keyframes jumpAnimWrap { 0%, 100% { transform: translateX(-50%) translateY(0); } 50% { transform: translateX(-50%) translateY(-18px); } }
    .jumping { animation: jumpAnim 1.0s infinite ease-in-out; }
    @keyframes jumpAnim { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-18px); } }
    .progress-container { width: 92%; margin-bottom: 12px; cursor: pointer; }
    .progress-base { width: 100%; height: 5px; background: var(--bar-base); border-radius: 10px; position: relative; }
    .progress-fill { width: 0%; height: 100%; background: var(--bar-fill); border-radius: 10px; position: relative; }
    .progress-thumb { width: 10px; height: 10px; background: var(--bar-thumb); border-radius: 50%; 
                      position: absolute; right: -5px; top: 50%; transform: translateY(-50%); }
    .control-btns { display: flex; gap: 20px; align-items: center; justify-content: center; }
    .btn-circle { width: 30px; height: 30px; background: var(--btn-bg); border-radius: 50%; 
                  display: flex; justify-content: center; align-items: center; color: var(--icon-main); cursor: pointer; font-size: 12px; }
    .btn-circle.main-play { width: 36px; height: 36px; font-size: 16px; }
    .toggle-fold { position: absolute; left: 18px; bottom: 8px; cursor: pointer; color: var(--sub-icon); font-size: 12px; }
    .vol-toggle-btn { position: absolute; right: 18px; bottom: 12px; cursor: pointer; color: var(--sub-icon); font-size: 12px; line-height: 12px; }
    /* ๋ณผ๋ฅจ ํŒจ๋„ - ๋ฐ˜ํˆฌ๋ช… ์ฒ˜๋ฆฌ */
    .vol-side-panel { 
        width: 0; opacity: 0; height: 90px; background: rgba(228, 228, 228, 0.75); backdrop-filter: blur(8px); border-radius: 15px; 
        display: flex; justify-content: center; align-items: center; overflow: hidden; 
        transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1);
    }
    .vol-side-panel.active { width: 38px; opacity: 1; }
    .vol-base { width: 5px; height: 75%; background: var(--bar-base); border-radius: 10px; display: flex; justify-content: center; }
    .vol-range { appearance: slider-vertical; width: 4px; height: 100%; cursor: pointer; background: transparent; accent-color: var(--bar-fill); }
    .vol-range::-webkit-slider-thumb { -webkit-appearance: none; width: 10px; height: 10px; background: var(--bar-thumb); border-radius: 50%; cursor: pointer; }
    /* ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ - ๋ฐ˜ํˆฌ๋ช… ์ฒ˜๋ฆฌ */
    .playlist-window { width: 0; opacity: 0; height: 90px; background: rgba(228, 228, 228, 0.75); backdrop-filter: blur(8px); border-radius: 15px; 
                       overflow: hidden; transition: 0.4s cubic-bezier(0.4, 0, 0.2, 1); display: flex; flex-direction: column; }
    .playlist-window.active { width: 180px; opacity: 1; padding: 10px; margin-right: 8px; }
    .pl-header { font-weight: bold; color: var(--pl-text); font-style: italic; font-size: 13px; margin-bottom: 5px; }
    .pl-body-box { background: var(--pl-box); border-radius: 10px; flex-grow: 1; padding: 6px; color: var(--pl-text); font-size: 10px; overflow-y: auto; scrollbar-width: none; -ms-overflow-style: none; }
    .pl-body-box::-webkit-scrollbar { display: none; }
    .pl-body-box ul { list-style: none; padding: 0; margin: 0; }
    .pl-body-box ul li { padding: 4px 6px; border-radius: 6px; cursor: pointer; transition: background 0.2s; }
    .pl-body-box ul li:hover { background: rgba(255,255,255,0.3); }
    .pl-body-box ul li.active-track { background: rgba(255,255,255,0.45); font-weight: bold; }
    .folded-mode .main-player, .folded-mode .playlist-window, .folded-mode .vol-side-panel { display: none !important; }
    .folded-mode #folded-mode-area { display: block !important; width: 75px; cursor: pointer; position: relative; }
    /* ๋ชจ๋ฐ”์ผ์—์„œ ํ”Œ๋ ˆ์ด์–ด ์ˆจ๊น€ */
    @media screen and (max-width: 768px) {
        #music-player-container { display: none !important; }
    }
    /* ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ๊นœ๋นก์ž„ ๋ฐฉ์ง€ */
    #music-player-container { opacity: 0; transition: opacity 0.3s ease; }
    #music-player-container.ready { opacity: 1; }
</style>
<script>
    let isPlaying = false;
    let isFolded = false;
    let progress = 0;
    let ticker;
    let currentTrackIndex = 0;
    const mainChar = document.getElementById('main-char');
    const fChar = document.getElementById('folded-char');
    const pIcon = document.getElementById('play-pause-icon');
    const pBar = document.getElementById('p-bar');
    const charWrap = document.getElementById('char-wrap');
    const pContainer = document.getElementById('p-container');
    /* ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์„ค์ • */
    const charPlayImg = "์žฌ์ƒ ์ค‘ ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€";
    const charPauseImg = "์ •์ง€ ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€";
    /* ์ด๋ฏธ์ง€ ๋ฏธ๋ฆฌ ๋กœ๋“œ — ์žฌ์ƒ/์ •์ง€ ์ „ํ™˜ ์‹œ ๊นœ๋นก์ž„ ์™„์ „ ๋ฐฉ์ง€ */
    const preloadPlay = new Image();
    preloadPlay.src = charPlayImg;
    const preloadPause = new Image();
    preloadPause.src = charPauseImg;
    const tracks = [
        {
            title: "๋…ธ๋ž˜ ์ œ๋ชฉ",
            artist: "๊ฐ€์ˆ˜ ์ด๋ฆ„",
            src: "๊นƒํ—ˆ๋ธŒ ๋งํฌ"
        }
    ];
    const audio = new Audio();
    audio.volume = 0.5;
    function renderPlaylist() {
        const ul = document.getElementById('playlist-ul');
        ul.innerHTML = '';
        tracks.forEach((track, i) => {
            const li = document.createElement('li');
            li.textContent = track.title + ' - ' + track.artist;
            if (i === currentTrackIndex) li.classList.add('active-track');
            li.addEventListener('click', () => {
                currentTrackIndex = i;
                loadAndPlay();
            });
            ul.appendChild(li);
        });
    }
    function loadAndPlay() {
        if (tracks.length === 0) return;
        audio.src = tracks[currentTrackIndex].src;
        audio.load();
        progress = 0;
        drawUI();
        renderPlaylist();
        if (!isPlaying) togglePlay();
        else { audio.play(); updateBubble(); }
    }
    audio.addEventListener('ended', () => {
        nextTrack();
    });
    const songBubble = document.getElementById('song-bubble');
    /* ๋งํ’์„ ์— ํ˜„์žฌ ๊ณก ์ œ๋ชฉ ํ‘œ์‹œ/์ˆจ๊น€ (ํŽผ์นจ + ์ ‘ํž˜ ๋‘˜ ๋‹ค) */
    function updateBubble() {
        if (isPlaying && tracks.length > 0) {
            songBubble.textContent = tracks[currentTrackIndex].title;
            songBubble.classList.add('show');
            foldedBubble.textContent = tracks[currentTrackIndex].title;
            foldedBubble.classList.add('show');
        } else {
            songBubble.classList.remove('show');
            foldedBubble.classList.remove('show');
        }
    }
    const foldedArea = document.getElementById('folded-mode-area');
    const foldedBubble = document.getElementById('folded-bubble');
    function togglePlay() {
        isPlaying = !isPlaying;
        if (isPlaying) {
            pIcon.classList.replace('fa-play', 'fa-pause');
            charWrap.classList.add('jumping');
            mainChar.src = charPlayImg;
            foldedArea.classList.add('jumping');
            if (tracks.length > 0) {
                if (!audio.src || audio.src === location.href) {
                    audio.src = tracks[currentTrackIndex].src;
                    audio.load();
                }
                audio.play();
            }
        } else {
            pIcon.classList.replace('fa-pause', 'fa-play');
            charWrap.classList.remove('jumping');
            mainChar.src = charPauseImg;
            foldedArea.classList.remove('jumping');
            audio.pause();
        }
        updateBubble();
    }
    function drawUI() {
        pBar.style.width = progress + '%';
        const containerRect = pContainer.getBoundingClientRect();
        const barFillWidth = (progress / 100) * containerRect.width;
        charWrap.style.left = (pContainer.offsetLeft + barFillWidth) + 'px';
    }
    function prevTrack() {
        if (tracks.length === 0) return;
        if (audio.currentTime > 3) {
            audio.currentTime = 0;
            progress = 0;
            drawUI();
        } else {
            currentTrackIndex = (currentTrackIndex - 1 + tracks.length) % tracks.length;
            loadAndPlay();
        }
    }
    function nextTrack() {
        if (tracks.length === 0) return;
        currentTrackIndex = (currentTrackIndex + 1) % tracks.length;
        loadAndPlay();
    }
    function togglePlaylist() {
        if(!isFolded) {
            document.getElementById('vol-panel').classList.remove('active');
            document.getElementById('playlist-window').classList.toggle('active');
        }
    }
    function toggleVolume() {
        if(!isFolded) {
            document.getElementById('playlist-window').classList.remove('active');
            document.getElementById('vol-panel').classList.toggle('active');
        }
    }
    function toggleFold(event) {
        event.stopPropagation(); 
        const root = document.getElementById('music-player-container');
        isFolded = !isFolded;
        if (isFolded) {
            root.classList.add('folded-mode');
            document.getElementById('playlist-window').classList.remove('active');
            document.getElementById('vol-panel').classList.remove('active'); 
        } else {
            // ํŽผ์น  ๋•Œ ์บ๋ฆญํ„ฐ transition์„ ์ž ๊น ๋„๊ณ , ์œ„์น˜ ์žก์€ ๋’ค ๋‹ค์‹œ ์ผฌ
            charWrap.style.transition = 'none';
            root.classList.remove('folded-mode');
            requestAnimationFrame(() => {
                drawUI();
                // ์œ„์น˜๊ฐ€ ์žกํžŒ ํ›„ ๋‹ค์Œ ํ”„๋ ˆ์ž„์—์„œ transition ๋ณต์›
                requestAnimationFrame(() => {
                    charWrap.style.transition = 'left 0.1s linear';
                });
            });
        }
    }
    let isDragging = false;
    function seekToPosition(e) {
        const rect = pContainer.getBoundingClientRect();
        let ratio = (e.clientX - rect.left) / rect.width;
        ratio = Math.max(0, Math.min(1, ratio));
        progress = ratio * 100;
        if (audio.duration) {
            audio.currentTime = ratio * audio.duration;
        }
        drawUI();
    }
    pContainer.addEventListener('mousedown', (e) => {
        isDragging = true;
        seekToPosition(e);
    });
    document.addEventListener('mousemove', (e) => {
        if (isDragging) {
            seekToPosition(e);
        }
    });
    document.addEventListener('mouseup', () => {
        isDragging = false;
    });
    document.getElementById('vol-slider').addEventListener('input', (e) => {
        audio.volume = e.target.value / 100;
        saveState();
    });
    /* ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์žฌ์ƒ ์ƒํƒœ ์œ ์ง€ (localStorage) */
    function saveState() {
        localStorage.setItem('music_player_state', JSON.stringify({
            index: currentTrackIndex,
            time: audio.currentTime,
            paused: audio.paused,
            volume: audio.volume,
            progress: progress
        }));
    }
    function loadState() {
        const saved = localStorage.getItem('music_player_state');
        if (saved) {
            const state = JSON.parse(saved);
            currentTrackIndex = state.index || 0;
            audio.volume = state.volume !== undefined ? state.volume : 0.5;
            document.getElementById('vol-slider').value = audio.volume * 100;
            if (tracks.length > 0 && tracks[currentTrackIndex]) {
                audio.src = tracks[currentTrackIndex].src;
                audio.currentTime = state.time || 0;
                progress = state.progress || 0;
                drawUI();
                renderPlaylist();
                if (!state.paused) {
                    audio.play().then(() => {
                        isPlaying = true;
                        pIcon.classList.replace('fa-play', 'fa-pause');
                        charWrap.classList.add('jumping');
                        mainChar.src = charPlayImg;
                        foldedArea.classList.add('jumping');
                        updateBubble();
                    }).catch(() => {
                        mainChar.src = charPauseImg;
                    });
                } else {
                    mainChar.src = charPauseImg;
                }
            }
        } else {
            mainChar.src = charPauseImg;
            renderPlaylist();
        }
    }
    audio.addEventListener('timeupdate', function() {
        if (audio.duration) {
            progress = (audio.currentTime / audio.duration) * 100;
            drawUI();
        }
        saveState();
    });
    window.addEventListener('beforeunload', saveState);
    /* ์ดˆ๊ธฐํ™”: ์ด๋ฏธ์ง€๊ฐ€ ์ค€๋น„๋œ ํ›„ ํ”Œ๋ ˆ์ด์–ด ํ‘œ์‹œ */
    function initPlayer() {
        loadState();
        requestAnimationFrame(() => {
            drawUI();
            document.getElementById('music-player-container').classList.add('ready');
        });
    }
    // ๋ฉˆ์ถค ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€๊ฐ€ ๋กœ๋“œ ์™„๋ฃŒ๋˜๋ฉด ํ”Œ๋ ˆ์ด์–ด ํ‘œ์‹œ
    if (preloadPause.complete) {
        initPlayer();
    } else {
        preloadPause.onload = initPlayer;
        preloadPause.onerror = initPlayer;
    }
</script>

 

์ฝ”๋“œ๋Š” </body> ์œ„์— ๋„ฃ์œผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

 

- ์ปค์Šคํ…€ ์„ค๋ช…๋ฌธ

๋”๋ณด๊ธฐ

1. ์Œ์•… ์ถ”๊ฐ€ํ•˜๊ธฐ

๊ธฐ์กด ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ๋์— ์‰ผํ‘œ(,)๋ฅผ ์ฐ์–ด ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ๋ฅผ ๋งŒ๋“ค๊ณ , ๊ทธ ๋’ค์— ์ƒˆ ์ฝ”๋“œ๋ฅผ ๋ถ™์—ฌ๋„ฃ์œผ์„ธ์š”.

*์˜ˆ์‹œ

const tracks = [
    { title: "๋…ธ๋ž˜ ์ œ๋ชฉ", artist: "๊ฐ€์ˆ˜", src: "mp3 ์ฃผ์†Œ" },
    { title: "๋‘ ๋ฒˆ์งธ ๊ณก", artist: "๊ฐ€์ˆ˜", src: "mp3 ์ฃผ์†Œ" }// ← ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•œ ์ฝ”๋“œ (์‰ผํ‘œ X)
];

 

2. ์Œ์•… ์ œ๊ฑฐํ•˜๊ธฐ

์ง€์šฐ๊ณ  ์‹ถ์€ { ... } ๋ฉ์–ด๋ฆฌ๋ฅผ ํ†ต์งธ๋กœ ์‚ญ์ œํ•˜์„ธ์š”.
์ง€์šฐ๊ณ  ๋‚œ ๋’ค, ๋‚จ์•„์žˆ๋Š” ๋งˆ์ง€๋ง‰ ์ฝ”๋“œ ๋’ค์— ์‰ผํ‘œ(,)๊ฐ€ ๋ถ™์–ด์žˆ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ๊ฐ™์ด ์ง€์›Œ์ค˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

*์Œ์•…์€ ๊นƒํ—ˆ๋ธŒ์— ์—…๋กœ๋“œํ•ด์„œ ์Œ์•… ์ฃผ์†Œ๋ฅผ ๋ณต์‚ฌ, ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ–ˆ์Šต๋‹ˆ๋‹ค!*
(youtube ๋งํฌ๋Š” ๋˜๋Š”์ง€ ์•ˆ ๋˜๋Š”์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค... ๋˜๋„๋ก์ด๋ฉด ๊นƒํ—ˆ๋ธŒ์— ์—…๋กœ๋“œํ•ด์„œ ์“ฐ๋Š” ๊ฑธ ์ถ”์ฒœ๋“œ๋ฆฝ๋‹ˆ๋‹ค!)

3. ๊นƒํ—ˆ๋ธŒ์— ์Œ์•… ์—…๋กœ๋“œ ๋ฐฉ๋ฒ•


- ๊นƒํ—ˆ๋ธŒ ๊ฒ€์ƒ‰ > ํšŒ์›๊ฐ€์ž… > ๊นƒํ—ˆ๋ธŒ ํ™ˆ์—์„œ new ํด๋ฆญ 

Repository name (์ €์žฅ์†Œ ์ด๋ฆ„)
Description (์„ค๋ช…)

๋งจ ์•„๋ž˜ ์ดˆ๋ก ๋ฒ„ํŠผ ํด๋ฆญ

๋‹ค์‹œ ํ™ˆ์œผ๋กœ ๊ฐ€์„œ ์™ผ์ชฝ์— ์ƒ์„ฑ๋œ ์ €์žฅ์†Œ ํด๋ฆญ

 uploading an existing file ํด๋ฆญ ํ›„ mp3 ํŒŒ์ผ ์—…๋กœ๋“œ > ๋งจ ์•„๋ž˜ ์ดˆ๋ก ๋ฒ„ํŠผ ํด๋ฆญ

Raw ๋ฒ„ํŠผ ์˜ค๋ฅธ์ชฝ ํด๋ฆญ ํ›„ ๋งํฌ ์ฃผ์†Œ ๋ณต์‚ฌ
์œ„ ์ฝ”๋“œ url : " " ์•ˆ์— ๋งํฌ ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ›„,

 

https://github.com/์œ ์ €๋ช…/์ €์žฅ์†Œ๋ช…/raw/main/ํŒŒ์ผ๋ช….mp3

์œ„์˜ ์ฃผ์†Œ๋ฅผ ์•„๋ž˜์ฒ˜๋Ÿผ ๋ณ€๊ฒฝํ•˜์‹œ๋ฉด ๋!

https://cdn.jsdelivr.net/gh/์œ ์ €๋ช…/์ €์žฅ์†Œ๋ช…@main/ํŒŒ์ผ๋ช….mp3

 

(์ด๋ ‡๊ฒŒ ํ•˜๋Š” ์ด์œ ๋Š” ๋ณด์•ˆ ์ •์ฑ… ๋•Œ๋ฌธ์— ์Œ์•… ์žฌ์ƒ์ด ๋ง‰ํž ์ˆ˜ ์žˆ์–ด์„œ)

๋”๋ณด๊ธฐ

1. ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

<!-- 4. ์ ‘ํ˜”์„ ๋•Œ ์ „์šฉ ์บ๋ฆญํ„ฐ -->
        <div id="folded-mode-area" style="display: none;" onclick="toggleFold(event)">
            <div id="folded-bubble" class="song-bubble"></div>
            <img src="์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€ ์ฃผ์†Œ" id="folded-char" class="character-img" alt="folded-char">
/* ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€ ์ฃผ์†Œ ์„ค์ • */
    const charPlayImg = "์žฌ์ƒ ์ค‘ ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€";
    const charPauseImg = "์ •์ง€ ์บ๋ฆญํ„ฐ ์ด๋ฏธ์ง€";

์œ„ ์ฝ”๋“œ์—์„œ ์จ์ ธ์žˆ๋Š” ๊ธ€์— ๋งž๋Š” ์ด๋ฏธ์ง€ ์ฃผ์†Œ๋ฅผ ๋„ฃ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”๋ณด๊ธฐ
--bg-main: #E4E4E4;
        /* ํ”Œ๋ ˆ์ด์–ด ๋ณธ์ฒด ๋ฐฐ๊ฒฝ์ƒ‰ */
 
        --btn-bg: #B9B9B9;
        /* ๋ฒ„ํŠผ(์ด์ „/์žฌ์ƒ/๋‹ค์Œ) ๋ฐฐ๊ฒฝ์ƒ‰ */
 
        --icon-main: #af3b49;
        /* ๋ฒ„ํŠผ ์•ˆ ์•„์ด์ฝ˜ ์ƒ‰์ƒ (์žฌ์ƒ ์‚ผ๊ฐํ˜• ๋“ฑ) */
 
        --bar-base: #CECECE;
        /* ์žฌ์ƒ๋ฐ”/๋ณผ๋ฅจ๋ฐ” ๋นˆ ๋ถ€๋ถ„ ์ƒ‰์ƒ */
 
        --bar-fill: #af3b49;
        /* ์žฌ์ƒ๋ฐ”/๋ณผ๋ฅจ๋ฐ” ์ฑ„์›Œ์ง„ ๋ถ€๋ถ„ ์ƒ‰์ƒ */
 
        --bar-thumb: #922532;
        /* ์žฌ์ƒ๋ฐ” ๋™๊ทธ๋ž€ ์†์žก์ด ์ƒ‰์ƒ */
 
        --sub-icon: #ABABAB;
        /* ์ ‘๊ธฐ(ใ…ก) ๋ฒ„ํŠผ, ๋ณผ๋ฅจ ์•„์ด์ฝ˜ ์ƒ‰์ƒ */
 
        --pl-box: #B9B9B9;
        /* ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๋ชฉ๋ก ๋ฐ•์Šค ๋ฐฐ๊ฒฝ์ƒ‰ */
 
        --pl-text: #7F7F7F;
        /* ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๊ธ€์ž ์ƒ‰์ƒ */

Color Hex Color Codes

 

ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•ด์ฃผ์„ธ์š”!

๋งŒ์•ฝ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋ฌธ์˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค~

user-img 1942
1942
ํ˜„์žฌ๊ธ€
์Œ์•… ํ”Œ๋ ˆ์ด์–ด 3