티스토리 뷰

https://garenchoi.github.io/webs_class/javascript/musicPlayer/index.html

 

Document

expand_more Now Playing more_horiz 0:00 0:00 repeat skip_previous play_arrow pause --> skip_next queue_music repeat_one --> shuffle --> queue_music Music List close

garenchoi.github.io

 

 

수업시간에 내가 만든 뮤직 플레이어 

<script>
        const musicWrap = document.querySelector(".wrap__music");
        const musicImg = musicWrap.querySelector(".music__img img");
        const musicName = musicWrap.querySelector(".music__song .name");
        const musicArtist = musicWrap.querySelector(".music__song .artist");
        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(".music__progress");
        const musicProgressBar = musicWrap.querySelector(".bar");
        const musicProgressCurrent = musicWrap.querySelector(".current");
        const musicProgressDuration = musicWrap.querySelector(".duration");
        const musicRepeat = musicWrap.querySelector("#control-repeat");
        const musicList = musicWrap.querySelector(".music__list");
        const musicListBtn = musicWrap.querySelector("#control-list");
        const musicListClose = musicList.querySelector(".close");
        const musicListUl = musicList.querySelector(".list ul");
        
        let musicIndex = Math.floor((Math.random() * allMusic.length) + 1);

        function loadMusic(num){
            musicImg.src = `images/${allMusic[num - 1].img}.jpg`;
            musicImg.alt = allMusic[num - 1].name;
            musicName.innerHTML = allMusic[num - 1].name;
            musicArtist.innerHTML = allMusic[num - 1].artist;
            musicAudio.src = `songs/${allMusic[num - 1].audio}.mp3`;
        }

        function playMusic(){
            musicWrap.classList.add("paused");
            musicPlay.innerText = "pause";
            musicAudio.play();
            musicPlay.setAttribute("title","일시정지");
        } 

        function pauseMusic(){
            musicWrap.classList.remove("paused");
            musicPlay.innerText = "play_arrow";
            musicAudio.pause();
        }

        //이전 곡 듣기
        function prevMusic(){
            musicIndex < 2 ? musicIndex = allMusic.length : musicIndex--;
            loadMusic(musicIndex);
            playMusic();
            playListMusic();
        }
        //다음 곡 듣기
        function nextMusic(){
            musicIndex > allMusic.length-1 ? musicIndex = 1 : musicIndex++;
            loadMusic(musicIndex);
            playMusic();
            playListMusic();
        }

        //뮤직 진행바
        musicAudio.addEventListener("timeupdate", (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}`;
    
                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}`;
        });

        //재생,정지 토글 버튼
        musicPlay.addEventListener("click", () => {
            const isMusicPaused = musicWrap.classList.contains("paused"); 
            isMusicPaused ? pauseMusic() : playMusic();
        });
        //이전 곡 버튼
        musicPrevBtn.addEventListener("click", () => {
            prevMusic();
        });
        
        //다음 곡 버튼
        musicNextBtn.addEventListener("click", () => {
            nextMusic();
        });

        //진행 버튼 클릭
        musicProgress.addEventListener("click", (e) => {
            let progressWidth = musicProgress.clientWidth;
            let clickedOffsetX = e.offsetX;
            let songDuration = musicAudio.duration;

            musicAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration;
        });

        //반복 버튼
        musicRepeat.addEventListener("click", () => {
            let getText = musicRepeat.innerText;
           
            switch(getText){
                case "repeat":
                    musicRepeat.innerText = "repeat_one";
                    musicRepeat.setAttribute("title","한곡 반복재생");
                break;
                case "repeat_one":
                    musicRepeat.innerText = "shuffle";
                    musicRepeat.setAttribute("title","랜덤 반복재생");
                break;
                case "shuffle":
                    musicRepeat.innerText = "repeat";
                    musicRepeat.setAttribute("title","전체 반복재생");
                break;
            }
        });

        //오디오 끝났을 때
        musicAudio.addEventListener("ended", () => {
            let getText = musicRepeat.innerText;

            switch(getText){
                case "repeat":
                    nextMusic();
                break;
                case "repeat_one":
                    loadMusic(musicIndex);
                    playMusic();
                break;
                case "shuffle":
                    let randIndex = Math.floor((Math.random() * allMusic.length) + 1);
                    do {
                        randIndex = Math.floor((Math.random() * allMusic.length) + 1);
                    } while (musicIndex == randIndex);
                    musicIndex = randIndex;
                    loadMusic(musicIndex);
                    playMusic();
                    playListMusic();
                break;
            }
        });

        //뮤직 리스트 버튼
        musicListBtn.addEventListener("click", () => {
            musicList.classList.add("show");
        });

        //뮤직 리스트 닫기 버튼
        musicListClose.addEventListener("click",() => {
            musicList.classList.remove("show");
        })
        
        //뮤직 리스트 구현하기
        for(let i=0; i<allMusic.length; i++){
            let li = 
                `<li data-index="${i+1}">
                    <div>
                        <em>${allMusic[i].name}</em>
                        <p>${allMusic[i].artist}</p>
                    </div>
                    <audio class="${allMusic[i].audio}" src="songs/${allMusic[i].audio}.mp3"></audio>
                    <span id="${allMusic[i].audio}" class="audio-duration">3:36</span>
                </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}`;
                liAudioDuration.innerText = `${totalMin}:${totalSec}`;
                liAudioDuration.setAttribute("data-duration",`${totalMin}:${totalSec}`);
            });
        }

        //뮤직 리스트 클릭하기
        function playListMusic(){
            const musicListAll = musicListUl.querySelectorAll("li");

            for(let j=0; j<musicListAll.length; j++){
                let audioTag = musicListAll[j].querySelector(".audio-duration");
                
                if(musicListAll[j].classList.contains("playing")){
                    musicListAll[j].classList.remove("playing")
                    let adDuration = audioTag.getAttribute("data-duration");
                    audioTag.innerText = adDuration;
                }
            
                if(musicListAll[j].getAttribute("data-index") == musicIndex){
                    musicListAll[j].classList.add("playing");
                    audioTag.innerText = "재생중";
                }
            
                musicListAll[j].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>

 

'Javascript' 카테고리의 다른 글

자바스크립트로 만든 타자 연습 게임  (0) 2022.04.14
addEventListener 속성 정리  (0) 2022.04.14
break/continue  (0) 2022.04.14
setTimeout과 setInterval  (0) 2022.04.13
THIS 사용하기  (0) 2022.04.13
댓글
© 2018 webstoryboy