๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Javascript Effect

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๊ฒŒ์ž„ ํšจ๊ณผ : ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด

by ์ฝ”ํŒŒ์นด 2022. 10. 18.
728x90

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ : ๊ฒŒ์ž„ ํšจ๊ณผ : ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด

์ด๋ฒˆ์—๋Š” ๊ฒŒ์ž„ ํšจ๊ณผ์ž…๋‹ˆ๋‹ค. ์ฒซ๋ฒˆ์งธ ์œ ํ˜•์œผ๋กœ๋Š” ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด๋ฅผ ์ž‘์—…ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.


1. ์‚ฌ์ „ ์ž‘์—…

1-1. ๋งˆ์šฐ์Šค ์ปค์„œ ๋งŒ๋“ค๊ธฐ

const cursor = document.querySelector(".mouse__cursor");
window.addEventListener("mousemove", (e) => {
    cursor.style.left = e.clientX + "px";
    cursor.style.top = e.clientY + "px";
});

๊ท€์—ฌ์šด ์ด๋ฏธ์ง€๋กœ ๋งˆ์šฐ์Šค ์ปค์„œ๋ฅผ ๋ฐ”๊พธ์–ด ์ค๋‹ˆ๋‹ค. ์ด ์ •๋„๋Š” ๊ปŒ์ด์ฃ .

1-2. ์‹œ๊ฐ„ ์ถœ๋ ฅํ•˜๊ธฐ

function printTime() {
    const clock = document.querySelector(".time");
    const now = new Date();
    let hour = now.getHours();
    let minute = now.getMinutes();
    let second = now.getSeconds();
    if (hour > 12) hour = hour - 12;
    if (hour < 10) hour = `0${hour}`;
    if (minute < 10) minute = `0${minute}`;
    if (second < 10) second = `0${second}`;
    const nowTime = now.getFullYear() + "๋…„ " + (now.getMonth() + 1) + "์›” " +
        now.getDate() + "์ผ " + hour + ":" + minute + ":" + second;

    clock.innerText = nowTime;
    setTimeout("printTime()", 1000);
}

์šฐ๋ฆฌ๋Š” ๋จผ์ € ํ˜„์žฌ ์—ฐ๋„์™€ ๋‚ ์งœ, ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์—ฐ๋„๋Š” getFullYear(), ์›”์€ getMonth(), ์ผ์€ getDate()๋ฅผ ์ด์šฉํ•˜์—ฌ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋•Œ, getMonth()์˜ ๋ฐ˜ํ™˜๊ฐ’์€ 1-12๊ฐ€ ์•„๋‹Œ 0-11 ์‚ฌ์ด์ด๊ธฐ ๋•Œ๋ฌธ์— 1์„ ๋”ํ•ด์ค˜์•ผ ํ˜„์žฌ์˜ ์›”์ˆ˜๊ฐ€ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๊ณต์‹์ ์œผ๋กœ ๋ฐœํ‘œ๋œ ๋ฐ”๋Š” ์—†์ง€๋งŒ, ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹นํ•˜๋Š” ๋‹ฌ์˜ ์ด๋ฆ„์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค๋Š” ์ถ”์ธก์ด ์žˆ์Šต๋‹ˆ๋‹ค.
์‹œ๊ฐ„์€ getHours(), ๋ถ„์€ getMinutes(), ์ดˆ๋Š” getSeconds()๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ฐ๊ฐ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค. ์‹œ๊ฐ„์€ 24์‹œ๊ฐ„์ด ์•„๋‹Œ 12์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์ถœ๋ ฅ๋˜๋„๋ก if๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜, ๊ฐ๊ฐ์˜ ์‹œ๊ฐ„, ๋ถ„, ์ดˆ๊ฐ€ 10 ๋ฏธ๋งŒ์ผ ๋•Œ์—๋Š” 03์‹œ, 05๋ถ„, 09์ดˆ ๋“ฑ ๋‘ ์ž๋ฆฟ์ˆ˜๋กœ ์ถœ๋ ฅ๋  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
1์ดˆ๋งˆ๋‹ค ์‹œ๊ฐ„์ด ๋ฐ”๋€Œ๋„๋ก ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, setTimeout์„ ์‚ฌ์šฉํ•˜์—ฌ 1์ดˆ๋งˆ๋‹ค printTime() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๊ฒŒ๋” ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค.

1-3. ํ™˜๊ฒฝ ์ถœ๋ ฅํ•˜๊ธฐ

function printAgent() {
    const agent = document.querySelector(".agent");
    const os = navigator.userAgent.toLocaleLowerCase();

    if (os.indexOf("window") >= 0) {
        agent.innerText = "ํ˜„์žฌ windows๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ํฌ๊ธฐ๋Š” " + screen.width + " * " + screen.height + "์ž…๋‹ˆ๋‹ค.";
        document.querySelector("body").classList.add("window");
    } else if (os.indexOf("macintosh") >= 0) {
        agent.innerText = "ํ˜„์žฌ mac์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ํฌ๊ธฐ๋Š” " + screen.width + " * " + screen.height + "์ž…๋‹ˆ๋‹ค.";
        document.querySelector("body").classList.add("mac");
    } else if (os.indexOf("iphone") >= 0) {
        agent.innerText = "ํ˜„์žฌ IPhone์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ํฌ๊ธฐ๋Š” " + screen.width + " * " + screen.height + "์ž…๋‹ˆ๋‹ค.";
        document.querySelector("body").classList.add("iphone");
    } else if (os.indexOf("android") >= 0) {
        agent.innerText = "ํ˜„์žฌ Android๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ํ™”๋ฉด ํฌ๊ธฐ๋Š” " + screen.width + " * " + screen.height + "์ž…๋‹ˆ๋‹ค.";
        document.querySelector("body").classList.add("android");
    }
}

์ด๋ฒˆ์—๋Š” ์‚ฌ์šฉ์ž๋“ค์˜ ํ™˜๊ฒฝ์„ ์ถœ๋ ฅํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ if๋ฌธ์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ™˜๊ฒฝ์— ๋”ฐ๋ผ CSS ์†Œ์Šค๋ฅผ ๋‹ฌ๋ฆฌํ•˜์—ฌ ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์œ„์˜ ์ƒ์ˆ˜ os๋ฅผ innerText๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ถœ๋ ฅํ•ด ๋ณด๋ฉด, ์œˆ๋„์šฐ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

mozilla/5.0 (windows nt 10.0; win64; x64) applewebkit/537.36 (khtml, like gecko) chrome/105.0.0.0 safari/537.36

windows, mac, iphone, android ์‚ฌ์šฉ์ž๋“ค์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๊ฐ๊ฐ windows, macintoshv, iphone, android๊ฐ€ ์ถœ๋ ฅ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. indexOf๋ฅผ ํ†ตํ•ด ํ•ด๋‹นํ•˜๋Š” ๋‚ด์šฉ์„ ๊ฒ€์ƒ‰ํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๋“ค์˜ ํ™˜๊ฒฝ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™˜๊ฒฝ๊ณผ ํ•จ๊ป˜ ํ™”๋ฉด ํฌ๊ธฐ๋„ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

1-4. ํด๋” ๋“œ๋ž˜๊ทธ ํšจ๊ณผ

$(".icon1").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse01.png");
    },
});
$(".icon2").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse02.png");
    },
});
$(".icon3").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse03.png");
    },
});
$(".icon4").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse04.png");
    },
});
$(".icon5").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse05.png");
    },
});
$(".icon6").draggable({
    drag: function () {
        $(".mouse__cursor img").attr("src", "../assets/img/effect_mouse06.png");
    },
});
$(".music__wrap").draggable();

draggable() ํ•จ์ˆ˜๋Š” jQuery UI ๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ƒํ˜ธ์ž‘์šฉ(Interaction) ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. https://jqueryui.com/draggable/
์ด ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ ํƒํ•œ ์š”์†Œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋“œ๋ž˜๊ทธํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์š”์†Œ๋ฅผ ๋“œ๋ž˜๊ทธํ•  ๋•Œ, ๋งˆ์šฐ์Šค ์ปค์„œ์˜ ์ƒ‰์ƒ์ด ์š”์†Œ์˜ ์ƒ‰์ƒ์— ๋งž์ถ”์–ด ๋ณ€ํ™”ํ•˜๋Š” ๋ฉ‹์ง„ ํ•จ์ˆ˜๋„ ๋งŒ๋“ค์–ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

1-5. ํ•จ์ˆ˜ ์‹คํ–‰์‹œํ‚ค๊ธฐ

window.onload = function () {
    printTime();
    printAgent();
};

๋งŒ๋“  ํ•จ์ˆ˜๋“ค์„ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค. window.onload๋Š” HTML ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋ฉด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

2. ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด ์ž‘์—…

๋ณธ๊ฒฉ์ ์œผ๋กœ ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๋งŒ๋“ค์–ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์— ์ž‘์—…ํ•  ๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด์˜ ๋ชจ์Šต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. HTML ์†Œ์Šค๋Š” ์•„๋ž˜๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

๋ฎค์ง ํ”Œ๋ ˆ์ด์–ด ๋””์ž์ธ
HTML ์†Œ์Šค ๋ณด๊ธฐ
<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/effect_img01.png" alt="์ด๋ฏธ์ง€1" />
                </div>
                <div class="title">
                    <h3>Loading...</h3>
                    <p>Loading...</p>
                </div>
            </div>
            <div class="music__control">
                <div class="volume">
                    vol = <span class="nowvolume">5</span>
                </div>
                <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">0: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>
                    <i title="์Œ๋Ÿ‰ ์ž‘๊ฒŒ" class="volumeDown" id="control-volDown"></i>
                    <i title="์žฌ์ƒ" class="play" id="control-play"></i>
                    <!-- <i title="์ •์ง€" class="stop" id="control-stop"></i> -->
                    <i title="์Œ๋Ÿ‰ ํฌ๊ฒŒ" class="volumeUp" id="control-volUp"></i>
                    <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>Music List<span class="close" id="control-list-close"></span></h3>
                <ul>
                    <!-- <li>
                        <strong>์ œ๋ชฉ</strong>
                        <em>์•„ํ‹ฐ์ŠคํŠธ</em>
                        <span>์žฌ์ƒ์‹œ๊ฐ„</span>
                    </li> -->
                </ul>
            </div>
        </div>
    </div>
</div>

2-1. ์Œ์•… ๋ฆฌ์ŠคํŠธ ์ž‘์„ฑํ•˜๊ธฐ

const allMusic = [
    { name: "Gizmo", artist: "Syn Cole", img: "effect_img01", audio: "music_audio01" },
    { name: "Clear My Head", artist: "Ellis", img: "effect_img02", audio: "music_audio02" },
    { name: "Perfect 10", artist: "Unknown Brain", img: "effect_img03", audio: "music_audio03" },
    { name: "Won't Look Back", artist: "BEAUZ & Momo", img: "effect_img04", audio: "music_audio04" },
    { name: "Chasing Ghosts", artist: "Distrion", img: "effect_img05", audio: "music_audio05" },
    { name: "Flashes", artist: "NIVIRO", img: "effect_img06", audio: "music_audio06" },
    { name: "New World", artist: "KIRA", img: "effect_img07", audio: "music_audio07" },
    { name: "Modular", artist: "Rob Gasser x Michael White x Miss Lina", img: "effect_img08", audio: "music_audio08" },
    { name: "Moonlight", artist: "Jim Yosef", img: "effect_img09", audio: "music_audio09" },
    { name: "Wanna", artist: "Ikson", img: "effect_img10", audio: "music_audio10" },
];

๋จผ์ €, ์‚ฝ์ž…ํ•  ์Œ์•…๋“ค์˜ ์ œ๋ชฉ, ์•„ํ‹ฐ์ŠคํŠธ, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค๋ฅผ ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋กœ ์ž‘์„ฑํ•ด ์ค๋‹ˆ๋‹ค.

2-2. ์„ ํƒ์ž ๋งŒ๋“ค๊ธฐ

// ์Œ์•… ์ •๋ณด
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 musicPlay = musicWrap.querySelector("#control-play");
const musicPrevBtn = musicWrap.querySelector("#control-prev");
const musicNextBtn = musicWrap.querySelector("#control-next");
const musicRepeat = musicWrap.querySelector("#control-repeat");
const musicVolUp = musicWrap.querySelector("#control-volUp");
const musicVolDown = musicWrap.querySelector("#control-volDown");

// ๋ฎค์ง ๋ฆฌ์ŠคํŠธ
const musicListBtn = musicWrap.querySelector("#control-list");
const musicList = musicWrap.querySelector(".music__list");
const musicListUl = musicWrap.querySelector(".music__list ul");
const musicListCloseBtn = musicWrap.querySelector("#control-list-close");

// ๋ฐ”
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");

์„ ํƒ์ž๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ •๋ฆฌํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ... ๋„ˆ๋ฌด ๋งŽ์œผ๋ฏ€๋กœ ํ•œ๋ฒˆ์— ์ •๋ฆฌํ•˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

2-3. ์Œ์•… ์ •๋ณด ์ž…๋ ฅํ•˜๊ธฐ

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`;  // ๋ฎค์ง ๋กœ๋“œ
}
let musicIndex = 1;  // ํ˜„์žฌ ์Œ์•… ์ธ๋ฑ์Šค
musicAudio.volume = 0.5;
๋จผ์ €, ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ ์Œ์•…์˜ ์ œ๋ชฉ, ์•„ํ‹ฐ์ŠคํŠธ, ์ด๋ฏธ์ง€, ์˜ค๋””์˜ค ํŒŒ์ผ์„ ์ž…๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.
๊ฐ ์˜ค๋””์˜ค๋“ค์˜ ๋ณผ๋ฅจ์€ 0-1 ์‚ฌ์ด๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐ ๋ณผ๋ฅจ์€ ๊ทธ ์ค‘๊ฐ„์ธ 0.5๋กœ ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2-4. ์žฌ์ƒ ๋ฒ„ํŠผ ์ž‘์—…ํ•˜๊ธฐ

function playMusic() {
    musicWrap.classList.add("paused");
    musicPlay.setAttribute("id", "control-stop");
    musicPlay.setAttribute("class", "stop");
    musicAudio.play();
}
function pauseMusic() {
    musicWrap.classList.remove("paused");
    musicPlay.setAttribute("id", "control-play");
    musicPlay.setAttribute("class", "play");
    musicAudio.pause();
}
musicPlay.addEventListener("click", () => {
    const isMusicPaused = musicWrap.classList.contains("paused");
    isMusicPaused ? pauseMusic() : playMusic();
});

๋จผ์ €, ์žฌ์ƒ ๋ฒ„ํŠผ์„ ์ž‘์—…ํ•ด ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. playMusic() ํ•จ์ˆ˜๋Š” ์žฌ์ƒ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์ •์ง€ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ณ , musicWrap์— paused ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. pauseMusic() ํ•จ์ˆ˜๋Š” ์ •์ง€ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์žฌ์ƒ ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ณ , paused ํด๋ž˜์Šค๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, musicWrap์˜ ํด๋ž˜์Šค ์ค‘ paused๊ฐ€ ์žˆ๋‹ค๋ฉด ์Œ์•…์ด ์žฌ์ƒ ์ค‘์ด๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
์ดํ›„, ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์žฌ์ƒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ์Œ์•…์ด ์žฌ์ƒ ์ค‘์ด๋ผ๋ฉด ์Œ์•…์„ pauseMusic() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ •์ง€ ์ค‘์ด๋ผ๋ฉด playMusic() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œํ‚ต๋‹ˆ๋‹ค.

2-5. ์ด์ „ ๊ณก ๋ฒ„ํŠผ, ๋‹ค์Œ ๊ณก ๋ฒ„ํŠผ ์ž‘์—…ํ•˜๊ธฐ

function prevMusic() {
    musicIndex == 1 ? (musicIndex = allMusic.length) : musicIndex--;
    loadMusic(musicIndex);
    playMusic();
    playListMusic();
}
function nextMusic() {
    musicIndex == allMusic.length ? (musicIndex = 1) : musicIndex++;
    loadMusic(musicIndex);
    playMusic();
    playListMusic();
}
musicPrevBtn.addEventListener("click", () => {
    prevMusic();
});
musicNextBtn.addEventListener("click", () => {
    nextMusic();
});

์ด์ „ ๋ฒ„ํŠผ, ๋‹ค์Œ ๋ฒ„ํŠผ๋„ ์ž‘์—…ํ•ด ์ฃผ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
์ด์ „ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ด์ „ ์Œ์•…์ด ์žฌ์ƒ๋˜๋„๋ก ํ•˜๊ณ , ์ฒซ๋ฒˆ์งธ ์Œ์•…์—์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์—๋Š” ๋งˆ์ง€๋ง‰ ์Œ์•…์ด ์žฌ์ƒ๋˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•œํŽธ, ๋‹ค์Œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์—๋Š” ๋‹ค์Œ ์Œ์•…์ด ์žฌ์ƒ๋˜๋„๋ก ํ•˜๊ณ , ๋งˆ์ง€๋ง‰ ์Œ์•…์—์„œ ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ์—๋Š” ์ฒซ๋ฒˆ์งธ ์Œ์•…์ด ์žฌ์ƒ๋˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์ดํ›„, loadMusic ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ „์†กํ•ด ์ฃผ๊ณ , ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

2-6. ๋ณผ๋ฅจ ์กฐ์ ˆ ๋ฒ„ํŠผ ์ž‘์—…ํ•˜๊ธฐ

musicVolDown.addEventListener("click", () => {
    musicAudio.volume -= 0.1;
    document.querySelector(".volume .nowvolume").innerHTML = Math.round(musicAudio.volume * 10);
})
musicVolUp.addEventListener("click", () => {
    musicAudio.volume += 0.1;
    document.querySelector(".volume .nowvolume").innerHTML = Math.round(musicAudio.volume * 10);
})

๋ณผ๋ฅจ์„ ์กฐ์ ˆํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ๋„ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค. ์Œ๋Ÿ‰ ์ค„์ด๊ธฐ, ๋†’์ด๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค 0.1์”ฉ ๋ณผ๋ฅจ์ด ์ž‘์•„์ง€๋„๋ก ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค. ๊ฐ’์„ ์ •์ˆ˜๋กœ ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด 10์„ ๊ณฑํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2-7. ๋ฐ˜๋ณต ๋ฒ„ํŠผ ์ž‘์—…ํ•˜๊ธฐ

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;
    }
});

์ด๋ฒˆ์—๋Š” ๋ฐ˜๋ณต ๋ฒ„ํŠผ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ณต ๋ฒ„ํŠผ์˜ default๋Š” ์ „์ฒด ๋ฐ˜๋ณต์ž…๋‹ˆ๋‹ค. ์ „์ฒด ๋ฐ˜๋ณต ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ•œ๊ณก ๋ฐ˜๋ณต ๋ฒ„ํŠผ, ํ•œ๊ณก ๋ฐ˜๋ณต ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋žœ๋ค ๋ฐ˜๋ณต ๋ฒ„ํŠผ, ๋žœ๋ค ๋ฐ˜๋ณต ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋‹ค์‹œ ์ „์ฒด ๋ฐ˜๋ณต ๋ฒ„ํŠผ์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ์ž‘์—…ํ•ด ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

2-8. ์ง„ํ–‰๋ฐ” ์ž‘์—…ํ•˜๊ธฐ

musicAudio.addEventListener("timeupdate", (e) => {
    const currentTime = e.target.currentTime;
    const duration = e.target.duration;
    let progressWidth = (currentTime / duration) * 100;
    musicProgressBar.style.width = `${progressWidth}%`;

์Œ์•…์˜ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ”๋ฅผ ์ž‘์—…ํ•ด ๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. timeupdate ์ด๋ฒคํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. currentTime์€ ์˜ค๋””์˜ค์˜ ์ง„ํ–‰ ์‹œ๊ฐ„, duration์€ ์˜ค๋””์˜ค์˜ ์ด ๊ธธ์ด๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 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}`; // ์ดˆ๊ฐ€ 10๋ณด๋‹ค ์ž‘์œผ๋ฉด 0์„ ๋ถ™์—ฌ์„œ ๋‘ ์ž๋ฆฌ์ˆ˜๋กœ ๋งŒ๋“ค์–ด์คŒ ex) 01, 02...
        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}`;
});

lodeddata๋Š” ์˜ค๋””์˜ค ์ด๋ฒคํŠธ๋กœ, ๋ฏธ๋””์–ด์˜ ํ˜„์žฌ ์žฌ์ƒ ์œ„์น˜์— ์žˆ๋Š” ํ”„๋ ˆ์ž„์ด ๋กœ๋“œ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์˜ค๋””์˜ค์˜ ์žฌ์ƒ ์‹œ๊ฐ„์„ ๊ตฌํ–ˆ๋‹ค๋ฉด, innerText๋กœ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

musicProgress.addEventListener("click", (e) => {
    let progressWidth = musicProgress.clientWidth; // ์ง„ํ–‰๋ฐ” ์ „์ฒด ๊ธธ์ด
    let clickedOffsetX = e.offsetX; // ์ง„ํ–‰๋ฐ” ๊ธฐ์ค€ ์ธก์ •๋˜๋Š” x ์ขŒํ‘œ๊ฐ’
    let songDuration = musicAudio.duration; // ์˜ค๋””์˜ค ์ „์ฒด ๊ธธ์ด

    musicAudio.currentTime = (clickedOffsetX / progressWidth) * songDuration;
    // ๋ฐฑ๋ถ„์œ„๋กœ ๋‚˜๋ˆˆ ์ˆซ์ž์— ๋‹ค์‹œ ์ „์ฒด ๊ธธ์ด๋ฅผ ๊ณฑํ•ด์„œ ํ˜„์žฌ ์žฌ์ƒ๊ฐ’์œผ๋กœ ๋ฐ”๊ฟˆ
});

์ง„ํ–‰๋ฐ”๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ธก์ •๋˜๋Š” x ์ขŒํ‘œ๊ฐ’์„ ๊ตฌํ•œ ๋’ค, ์ง„ํ–‰๋ฐ”๋ฅผ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„์„ ์žฌ์ƒํ•˜๋„๋ก ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.
์ด ๋•Œ, ๋ณดํ†ต ํ•จ์ˆ˜ ์•ˆ์—์„œ ์ž๊ธฐ ์ž์‹ ์„ ๋‹ค์‹œ ๊ฐ€๋ฆฌํ‚ฌ ๋•Œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ๋Š” this๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— musicProgress๋ฅผ ๊ทธ๋Œ€๋กœ ์„ ํƒํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2-9. ended ์ด๋ฒคํŠธ ์ž‘์—…ํ•˜๊ธฐ

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); // ๋žœ๋ค ์ธ๋ฑ์Šค ์ƒ์„ฑ

            do {
                randomIndex = Math.floor(Math.random() * allMusic.length + 1);
            } while (musicIndex == randomIndex);
            musicIndex = randomIndex; // ํ˜„์žฌ ์ธ๋ฑ์Šค๋ฅผ ๋žœ๋ค ์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝ
            loadMusic(musicIndex); // ๋žœ๋ค ์ธ๋ฑ์Šค๊ฐ€ ๋ฐ˜์˜๋œ ํ˜„์žฌ ์ธ๋ฑ์Šค ๊ฐ’์œผ๋กœ ์Œ์•…์„ ๋‹ค์‹œ ๋กœ๋“œ
            playMusic(); // ๋กœ๋“œํ•œ ์Œ์•…์„ ์žฌ์ƒ
            break;
    }
    playListMusic();  // ์žฌ์ƒ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ
});

ํ•œ ์Œ์•…์ด ๋๋‚ฌ์„ ๋•Œ์˜ ์ด๋ฒคํŠธ๋ฅผ ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค. 2-7์˜ ๋ฐ˜๋ณต ๋ฒ„ํŠผ๊ณผ ์ด์–ด์ง‘๋‹ˆ๋‹ค. getAttribute๋กœ ํ˜„์žฌ ๋ฒ„ํŠผ(์ „์ฒด ๋ฐ˜๋ณต, ํ•œ๊ณก ๋ฐ˜๋ณต, ๋žœ๋ค ๋ฐ˜๋ณต)์„ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋ฐ˜๋ณต ๋ฐฉ์‹์— ๋งž์ถ”์–ด ๋‹ค์Œ ์ธ๋ฑ์Šค๋กœ ๋„˜์–ด๊ฐ‘๋‹ˆ๋‹ค.
์ฐธ๊ณ ๋กœ, while๋ฌธ๊ณผ do while๋ฌธ์˜ ์ฐจ์ด๋Š”, while๋ฌธ์€ ๋ฌด์กฐ๊ฑด ํ•œ ๋ฒˆ์€ ์‹คํ–‰ํ•˜๊ณ , do while๋ฌธ์€ ์กฐ๊ฑด์— ๋งž์„ ๋•Œ๋งŒ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

2-10. ๋ฎค์ง ๋ฆฌ์ŠคํŠธ ์ž‘์—…ํ•˜๊ธฐ

musicListBtn.addEventListener("click", () => {
    musicList.classList.add("show");
});
musicListCloseBtn.addEventListener("click", () => {
    musicList.classList.remove("show");
});

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฎค์ง ๋ฆฌ์ŠคํŠธ๋ฅผ ์ž‘์—…ํ•ด ๋ด…์‹œ๋‹ค. ์šฐ์„ , ๋ฎค์ง ๋ฆฌ์ŠคํŠธ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฎค์ง ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ , ๋‹ซ๊ธฐ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๋ฎค์ง ๋ฆฌ์ŠคํŠธ๊ฐ€ ์ˆจ๊ฒจ์ง€๋„๋ก ํด๋ฆญ ์ด๋ฒคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

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.insertAdjacentHTML("beforeend", li);

for๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์Œ์•…๋“ค์„ ๋ฎค์ง ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€ํ•ด ์ค๋‹ˆ๋‹ค. beforeend๋Š” element ์•ˆ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ child๋กœ ์ถ”๊ฐ€ํ•˜๋ผ๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

    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}`); // ์†์„ฑ์— ์˜ค๋””์˜ค ๊ธธ์ด ๊ธฐ๋ก
    });
}

๋ฆฌ์ŠคํŠธ์— ์žฌ์ƒ ์‹œ๊ฐ„๋„ ๋ถˆ๋Ÿฌ์™€ ์ค๋‹ˆ๋‹ค. ์˜ค๋””์˜ค์— loadeddata ์ด๋ฒคํŠธ๋ฅผ ์„ค์ •ํ•˜๊ณ , 2-8๊ณผ ๊ฐ™์ด ์žฌ์ƒ ์‹œ๊ฐ„์„ ์ถœ๋ ฅํ•ด ์ค๋‹ˆ๋‹ค.

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");                   // ํด๋ž˜์Šค playing ์ถ”๊ฐ€
            audioTag.innerText = "Playing"                              // ์žฌ์ƒ์ค‘์ธ ์Œ์•…์— ๋ฉ˜ํŠธ ์ถ”๊ฐ€
        }
        musicListAll[i].setAttribute("onclick", "clicked(this)");
    }
}

์ด์ œ, ๋ฆฌ์ŠคํŠธ์— ์žˆ๋Š” ์Œ์•…์„ ํด๋ฆญํ•˜๋ฉด ํ•ด๋‹น ์Œ์•…์ด ์žฌ์ƒ๋˜๋„๋ก ์ž‘์—…ํ•ด ๋ด…์‹œ๋‹ค. ์œ„ ๊ณผ์ •์€ ์Œ์•…์„ ํด๋ฆญํ•˜๋ฉด playing ํด๋ž˜์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ๋ฎค์ง ๋ฆฌ์ŠคํŠธ์—์„œ ์žฌ์ƒ ์‹œ๊ฐ„ ๋Œ€์‹  ๋ฉ˜ํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
๊ฐ๊ฐ์˜ ์Œ์•…์„ ํด๋ฆญํ•˜๋ฉด clicked ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ์ž‘์—…ํ•ด ์ค๋‹ˆ๋‹ค.

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

์Œ์•…์„ ํด๋ฆญํ–ˆ์„ ๋•Œ ์‹คํ–‰๋˜๋Š” clicked ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด ์ค๋‹ˆ๋‹ค.

2-11. ํ•จ์ˆ˜ ์‹คํ–‰์‹œํ‚ค๊ธฐ

window.addEventListener("load", () => {
    loadMusic(musicIndex);
    playListMusic();
});

์ด์ œ, ์Œ์•…์„ ์žฌ์ƒํ•˜๋Š” loadMusic(), ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” playListMusic() ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๋ฉด ๋์ž…๋‹ˆ๋‹ค.


๊ฒฐ๊ณผ

728x90

๋Œ“๊ธ€

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿฆ™

CSS
๊ด‘๊ณ  ์ค€๋น„์ค‘