๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
EFFECT

EFFECT | GAME | ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด ์ฝ”๋”ฉํ•˜๊ธฐ

by ์ฝ”๋”ฉํ•˜์ž9 2022. 10. 17.
728x90

gameEffect | ๐Ÿ‘พ๋š ๋š  ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด ๋งŒ๋“ค๊ธฐ๐Ÿ‘พ


1. ์‚ฌ์ดํŠธ ๊ตฌ์กฐ ์‚ดํŽด๋ณด๊ธฐ

HTML ์‚ดํŽด๋ณด๊ธฐ
<!-- music player -->
<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="music__view">
                <div class="img">
                    <img src="../assets/img/music_view01.png" alt="">
                </div>
                <div class="title">
                    <h3>A Year Ago</h3>
                    <p>NETFFEX</p>
                </div>
                <div class="volume">
                    <input type="range" id="volume-control" min="0.1" max="10">
                </div>
            </div>
            <div class="music__control">
                <div class="progress">
                    <div class="bar">
                        <audio id="main-audio" src="../assets/audio/music_audio01.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>
                    <div class="center">
                        <i title="์žฌ์ƒ" class="play" id="control-play"></i>
                        <!-- <i title="์ •์ง€" class="stop"></i> -->
                    </div>
                    <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">
                <h3><span class="list"></span>๋ฎค์ง ๋ฆฌ์ŠคํŠธ<a href="#" class="close"></a></h3>
                <ul>
                    <!-- <li>
                        <strong>์ œ๋ชฉ</strong>
                        <em>์•„ํ‹ฐ์ŠคํŠธ</em>
                        <span>์žฌ์ƒ์‹œ๊ฐ„</span>
                    </li> -->
                </ul>
            </div>
        </div>
    </div>
</div>
<!-- //music player -->
CSS ์‚ดํŽด๋ณด๊ธฐ
<style>
    @import url('https://webfontworld.github.io/Cafe24SsurroundAir/Cafe24SsurroundAir.css');

    .music__wrap {
        display: none;
    }
    .music__wrap.show {
        display: block;
    }
    .music__inner {
        width: 450px;
        background: rgba(0,0,0,0.6);
        backdrop-filter: blur(5px);
        position: absolute;
        right: 100px;
        top: 100px;
        padding: 10px;
        padding-top: 0;
    }
    .music__header {
        width: 100%;
        height: 30px;
        display: flex;
        align-items: center;
        justify-content: space-between;
        color: #fff;
    }
    .music__header h2 {
        font-size: 14px;
    }
    .music__contents {
        background: rgba(255,255,255,0.5);
        width: 100%;
    }
    .music__view {
        display: flex;
        padding: 20px;
    }
    .music__view .img {
        width: 30%;
    }
    .music__view .img img {
        width: 100%;
    }
    .music__view .title {
        width: 70%;
        text-align: center;
        display: flex;
        align-items: center;
        justify-content: center;
        flex-direction: column;
    }
    .music__view .title h3 {
        margin-bottom: 10px;
        font-size: 30px;
        line-height: 1.2;
    }
    .music__view .title p {
        font-family: 'Cafe24SsurroundAir';
        text-transform: uppercase;
    }
    #volume-control {
        transform: rotate(270deg);
        position: absolute;
        top: 100px;
        right: -35px;
    }
    
    .volume input[type=range] {
        -webkit-appearance: none;
        background: #000;
        border-radius: 50px;
    }
    .volume input[type=range]:focus {
        outline: none;
    }
    /* .volume input[type=range]::-ms-track {
        cursor: pointer;
        background: #fff;
        border-color: #000;
        color: #000;
    } */
    .volume input[type=range]::-webkit-slider-thumb { 
        -webkit-appearance: none;
        background: #ffffff;
        cursor: pointer;
        border: 1px solid #000000; 
        height: 20px;
        width: 10px;   
        margin-bottom: -7px; 
        margin-top: -7.5px; 
        box-shadow: 1px 1px 1px #000000, 0px 0px 1px #0d0d0d;
        border-radius: 3px;
      }
    
    .music__control {
        width: 100%;
        height: 100px;
        padding: 20px;
        padding-top: 0;
    }
    .music__control .progress {
        width: 100%;
        height: 6px;
        background: #000;
        border-radius: 5px;
    }
    .music__control .progress .bar {
        width: 0;
        height: inherit;
        background: #73FBF9;
        border-radius: 5px;
    }
    .music__control .progress .timer {
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin-top: 3px;
    }
    .music__control .control {
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin-top: 40px;
        padding: 0 40px;
    }
    .music__control .control i {
        background-color: #ccc;
        scale: 1.2;
    }
    .music__control .control .repeat {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 96px 0;
    }
    .music__control .control .repeat:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 96px 0;
    }
    .music__control .control .repeat_one {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 72px 0;
    }
    .music__control .control .repeat_one:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 72px 0;
    }
    .music__control .control .shuffle {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 48px -2.5px;
    }
    .music__control .control .shuffle:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 48px -2.5px;
    }
    .music__control .control .prev {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 168px 0;
    }
    .music__control .control .prev:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 168px 0;
    }
    .music__control .control .next {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 144px 0;
    }
    .music__control .control .next:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 144px 0;
    }
    .music__control .control .center {
        /* width: 48px; */
        display: flex;
        align-items: center;
        justify-content: space-between;
    }
    .music__control .control .play {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
    }
    .music__control .control .play:hover {
        background: url(../img/music_control_over_icon.svg);
    }
    .music__control .control .stop {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: -24px 0;
    }
    .music__control .control .stop:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: -24px 0;
    }
    .music__control .control .list {
        display: block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 120px 0;
    }
    .music__control .control .list:hover {
        background: url(../img/music_control_over_icon.svg);
        background-position: 120px 0;
    }
    .music__footer {
        background: rgba(255,255,255,0.5);
    }
    .music__list {
        padding: 20px;
        padding-top: 0;
        display: none;
    }
    .music__list.show {
        display: block;
    }
    .music__list h3 {
        font-size: 24px;
        border-top: 2px solid #000;
        padding-top: 10px;
        margin-bottom: 10px;
        position: relative;
    }
    .music__list h3 .list {
        display: inline-block;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 96px 0;
        margin-right: 10px;
        vertical-align: -5px;
    }
    .music__list h3 .close {
        position: absolute;
        top: 10px;
        right: 0;
        width: 24px;
        height: 24px;
        background: url(../img/music_control_icon.svg);
        background-position: 24px 0;
        margin-right: 5px;
        vertical-align: -5px;
    }
    .music__list ul {
        max-height: 200px;
        overflow-y: scroll;
    }
    .music__list li {
        border-bottom: 1px solid #000;
        list-style: none;
        position: relative;
        padding: 7px 0 5px;
    }
    .music__list li:hover {
        color: #fff;
    }
    .music__list li.playing {
        color: #73FBF9;
        /* background-color: rgba(0,0,0,0.3); */
    }
    .music__list li strong {
        display: block;
        font-size: 20px;
        margin-bottom: 4px;
    }
    .music__list li em {
        font-style: normal;
    }
    .music__list li span {
        position: absolute;
        right: 0;
        top: 25px;
    }
</style>

3. script ์‚ดํŽด๋ณด๊ธฐ

๐ŸŽง ์„ ํƒ์ž ๋งŒ๋“ค๊ธฐ

<script>
    const allMusic = [
        {
            name : "1. A Year Ago",
            artist : "NETFFEX",
            img : "music_view01",
            audio : "music_audio01"
        },
        {
            name : "2. As You Fade Away",
            artist : "NETFFEX",
            img : "music_view02",
            audio : "music_audio02"
        },
        {
            name : "3. Believe",
            artist : "NETFFEX",
            img : "music_view03",
            audio : "music_audio03"
        },
        {
            name : "4. Go!",
            artist : "NETFFEX",
            img : "music_view04",
            audio : "music_audio04"
        },
        {
            name : "5. Good day (Wake up)",
            artist : "NETFFEX",
            img : "music_view05",
            audio : "music_audio05"
        },
        {
            name : "6. Play Dead",
            artist : "NETFFEX",
            img : "music_view06",
            audio : "music_audio06"
        },
        {
            name : "7. Ruthless",
            artist : "NETFFEX",
            img : "music_view07",
            audio : "music_audio07"
        },
        {
            name : "8. Something You Could Never Own",
            artist : "NETFFEX",
            img : "music_view08",
            audio : "music_audio08"
        },
        {
            name : "9. Take Me Back",
            artist : "NETFFEX",
            img : "music_view09",
            audio : "music_audio09"
        },
        {
            name : "10. Til I Hear'em Say (Inst)",
            artist : "NETFFEX",
            img : "music_view10",
            audio : "music_audio10"
        }
    ]

    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 musicRepeat = musicWrap.querySelector("#control-repeat");
    const musicPlay = musicWrap.querySelector("#control-play");
    const musicPrevBtn = musicWrap.querySelector("#control-prev");
    const musicNextBtn = musicWrap.querySelector("#control-next");
    const musicListBtn = musicWrap.querySelector("#control-list");
    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 musicList = musicWrap.querySelector(".music__list");
    const musicListUl = musicWrap.querySelector(".music__list ul");
    const musicListClose = musicWrap.querySelector(".music__list h3 .close");
</script>

๐ŸŽง ์Œ์•… ์žฌ์ƒํ•˜๊ธฐ

<script>
    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`;    // ๋ฎค์ง ๋กœ๋“œ
    }
</script>

๐ŸŽง ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ

<script>
    // ์žฌ์ƒ๋ฒ„ํŠผ
    function playMusic(){
        musicWrap.classList.add("paused");
        musicPlay.setAttribute("title","์ •์ง€");
        musicPlay.setAttribute("class","stop");
        musicAudio.play();
    }
    // ํ”Œ๋ ˆ์ด ๋ฒ„ํŠผ
    musicPlay.addEventListener("click", () => {
        const isMusicPaused = musicWrap.classList.contains("paused");   //  paused๊ฐ€ ์žˆ๋‹ค๋ฉด ์Œ์•…์ด ์žฌ์ƒ์ค‘
        isMusicPaused ? pauseMusic() : playMusic();
    });
    
    // ์ •์ง€๋ฒ„ํŠผ
    function pauseMusic(){
        musicWrap.classList.remove("paused");
        musicPlay.setAttribute("title","์žฌ์ƒ");
        musicPlay.setAttribute("class","play");
        musicAudio.pause();
    }
    
    // ์ด์ „ ๊ณก ๋“ฃ๊ธฐ ๋ฒ„ํŠผ
    function prevMusic(){
        // musicIndex --
        musicIndex == 1 ? musicIndex = allMusic.length : musicIndex--;      // ์ฒซ๊ณก์ผ ๊ฒฝ์šฐ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ, ์•„๋‹ˆ๋ฉด ์ธ๋ฑ์Šค ๊ฐ’ 1์”ฉ ์ค„์–ด๋“ค๋„๋ก
        loadMusic(musicIndex);
        playMusic();
        playListMusic();
    }
    // ์ด์ „๊ณก ๋ฒ„ํŠผ ํด๋ฆญ
    musicPrevBtn.addEventListener("click", () => {
        prevMusic();
    });
    
    // ๋‹ค์Œ ๊ณก ๋“ฃ๊ธฐ ๋ฒ„ํŠผ
    function nextMusic(){
        // musicIndex ++
        musicIndex == allMusic.length ? musicIndex = 1 : musicIndex++;      // ๋งˆ์ง€๋ง‰ ๊ณก์ผ ๊ฒฝ์šฐ ์ฒซ๋ฒˆ์งธ ๊ณก์œผ๋กœ, ์•„๋‹ˆ๋ฉด ์ธ๋ฑ์Šค ๊ฐ’ 1์”ฉ ๋Š˜์–ด๋‚˜๋„๋ก
        loadMusic(musicIndex);
        playMusic();
        playListMusic();
    }
    // ๋‹ค์Œ๊ณก ๋ฒ„ํŠผ ํด๋ฆญ
    musicNextBtn.addEventListener("click", () => {
        nextMusic();
    });

    //๋ฐ˜๋ณต ๋ฒ„ํŠผ ํด๋ฆญ
    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;
        }
    });
</script>

๐ŸŽง ์˜ค๋””์˜ค๊ฐ€ ๋๋‚ฌ์„ ๊ฒฝ์šฐ

<script>
    // ์˜ค๋””์˜ค๊ฐ€ ๋๋‚˜๋ฉด
    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);  // ๋žœ๋ค ์ธ๋ฑ์Šค ์ƒ์„ฑ
                // while๋ฌธ ๋ฌด์กฐ๊ฑด ํ•œ๋ฒˆ์€ ์‹คํ–‰, do while ์กฐ๊ฑด์— ์•ˆ๋งž์œผ๋ฉด ์‹คํ–‰๋˜์ง€ ์•Š์Œ
                do {
                    randomIndex = Math.floor(Math.random() * allMusic.length + 1);
                } while (musicIndex == randomIndex)
                musicIndex = randomIndex;   // ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ๋žœ๋ค ์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝ
                loadMusic(musicIndex);      // ๋žœ๋ค ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ˜์˜๋œ ํ˜„์žฌ ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ ์Œ์•…์„ ๋‹ค์‹œ ๋กœ๋“œ
                playMusic();                // ๋กœ๋“œํ•œ ์Œ์•…์„ ์žฌ์ƒ
            break;
        }
        playListMusic();    // ์˜ค๋””์˜ค๊ฐ€ ๋๋‚˜๋ฉด ์žฌ์ƒ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ
    });
</script>

๐ŸŽง ์ง„ํ–‰๋ฐ” ์„ค์ •ํ•˜๊ธฐ

<script>
    // ๋ฎค์ง ์ง„ํ–‰ ๋ฐ”
    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์ขŒํ‘œ๊ฐ’ (offsetX : ๋ถ€๋ชจ๊ธฐ์ค€)
        let songDuration = musicAudio.duration;         // ์˜ค๋””์˜ค ์ „์ฒด ๊ธธ์ด
    
        musicAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration;   // ๋ฐฑ๋ถ„์œ„๋กœ ๋‚˜๋ˆˆ ์ˆซ์ž์— ๋‹ค์‹œ ์ „์ฒด ๊ธธ์ด๋ฅผ ๊ณฑํ•ด์„œ ํ˜„์žฌ ์žฌ์ƒ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟˆ
    
    });
</script>

        

๐ŸŽง ๋ฎค์ง ๋ฆฌ์ŠคํŠธ ์„ค์ •ํ•˜๊ธฐ

<script>
    // ๋ฎค์ง ๋ฆฌ์ŠคํŠธ ๊ตฌํ˜„ํ•˜๊ธฐ
    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");                   // class์— playing ์ถ”๊ฐ€
                audioTag.innerText = "์žฌ์ƒ์ค‘";                                //์žฌ์ƒ์ค‘์ธ ์Œ์•…์— ๋ฉ˜ํŠธ ์ถ”๊ฐ€
            }

            musicListAll[i].setAttribute("onclick", "clicked(this)");
        }
    }

    // ๋ฎค์ง ๋ฆฌ์ŠคํŠธ ํด๋ฆญํ•˜๋ฉด
    function clicked(el){
        let getLiIndex = el. getAttribute("data-index");    // ํด๋ฆญํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์ €์žฅ
        musicIndex = getLiIndex;                            // ํด๋ฆญํ•œ ์ธ๋ฑ์Šค ๊ฐ’์„ ๋ฎค์ง ์ธ๋ฑ์Šค์— ์ €์žฅ
        loadMusic(musicIndex);                              // ํ•ด๋‹น ์ธ๋ฑ์Šค ๋ฎค์ง ๋กœ๋“œ
        playMusic();                                        // ์Œ์•… ์žฌ์ƒ
        playListMusic();                                    // ์Œ์•… ๋ฆฌ์ŠคํŠธ ์—…๋ฐ์ดํŠธ
    }

    window.addEventListener("load", ()=>{
        loadMusic(musicIndex);      //์Œ์•… ์žฌ์ƒ
        playListMusic();            //๋ฆฌ์ŠคํŠธ ์ดˆ๊ธฐํ™”
    });
</script>

        

๐ŸŽง ๋ณผ๋ฅจ ์กฐ์ ˆ ์ถ”๊ฐ€ํ•˜๊ธฐ

<script>
    // ๋ณผ๋ฅจ ์กฐ์ ˆ
    const audio = document.getElementById('main-audio');
    const audioVolume = document.getElementById('volume-control');
    audioVolume.addEventListener("change", function(e) {
        audio.volume = this.value/10;
    });
</script>

'EFFECT' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

EFFECT | Parallax Scroll ํšจ๊ณผ ์ ์šฉํ•˜๊ธฐ  (6) 2022.09.06

๋Œ“๊ธ€


TOP

์ด ๋ธ”๋กœ๊ทธ๋Š” ์ €์ž‘๊ถŒ์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณต์‚ฌํ•ด์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ด‘๊ณ  ์ค€๋น„์ค‘์ž…๋‹ˆ๋‹ค.