티스토리 뷰

 

 

 

 

 

<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 =musicProgress.querySelector(".bar");      
        const musicProgressCurrent =musicProgress.querySelector(".current");      
        const musicProgressDuration =musicProgress.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=`images/${allMusic[num-1].img}`;
            musicName.innerText = allMusic[num-1].name;
            musicArtist.innerText = allMusic[num-1].artist;
            musicAudio.src = `songs/${allMusic[num-1].audio}.mp3`;
        }
        
        //플레이 버튼
        function playMusic(){
            musicWrap.classList.add("paused");
            musicPlay.innerText = "pause"; 
            musicPlay.setAttribute("title", "정지");           
            musicAudio.play();
        }
        //정지 버튼
        function pauseMusic(){
            musicWrap.classList.remove("paused");
            musicPlay.innerText = "play_arrow";
            musicPlay.setAttribute("title", "재생");
            musicAudio.pause();
        }
        //이전 곡 듣기 (1 이전으로 가면 안됨)
        function prevMusic(){
            musicIndex--;                        
            musicIndex < 1 ? musicIndex=allMusic.length : musicIndex = musicIndex;
            loadMusic(musicIndex);
            playMusic();
            playListMusic();
        }
        //다음 곡 듣기 (20 넘어서 가면 안됨)
        function nextMusic(){
            musicIndex++;            
            musicIndex > 20 ? musicIndex= 1 : musicIndex = musicIndex;
            loadMusic(musicIndex);
            playMusic();
            playListMusic();
        }
        
        //플레이버튼 (토글)
        musicPlay.addEventListener("click",()=>{
            const isMusicPaused = musicWrap.classList.contains("paused");
            isMusicPaused ? pauseMusic() : playMusic();           
        });
        //이전 버튼
        musicPrevBtn.addEventListener("click", ()=>{
            prevMusic();
            playListMusic();
        });
        //다음 버튼
        musicNextBtn.addEventListener("click", ()=>{
            nextMusic();
            playListMusic();
        });

        //뮤직 진행 Bar
        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}%`;
            
            //전체 분:초 insert
            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}`;
            });

            //현재 분:초 insert
            // console.log(currentTime);
            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)=>{
            console.log(e); // 배열 객체로 이루어진 musicProgress의 정보
            let progressWidth = musicProgress.clientWidth;
            let clickedOffsetX = e.offsetX;
            let songDuration = musicAudio.duration;
            musicAudio.currentTime = (clickedOffsetX/progressWidth) * songDuration;
            playMusic(); 
                      
            // console.log(progressWidth);
            // console.log(clickedOffsetX);
            // console.log(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();
                    playListMusic();
                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(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:46</span>
                </li>                        
            `;
            //for문에 있는 li 내용 insert
            musicListUl.insertAdjacentHTML("beforeend", li);

            let liAudio = musicListUl.querySelector(`.${allMusic[i].audio}`);
            let liAudioDuration = musicListUl.querySelector(`#${allMusic[i].audio}`);

            //li 안에 있는 오디오 duration
            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>

뮤직 플레이어 만들기 예제를 해보았다.  

실력을 키워서 더 간단한 코드로 만들 수  있도록 노력해야겠다.

 

https://gwni0214.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

gwni0214.github.io

 

'Javascript' 카테고리의 다른 글

FTP 란?  (0) 2022.04.11
javascript 타자게임  (0) 2022.04.11
jQuery 란?  (0) 2022.04.08
mouseover, mouseenter, mouseout, mouseleave (이벤트 버블링)  (0) 2022.02.23
Element.classList.add()  (0) 2022.02.21
댓글
© 2018 webstoryboy