[Vanilla JS] ๐ŸŽฎ ๋ฐ˜๋ ค๋™๋ฌผ ๋ฃฐ๋ › ๋ฏธ๋‹ˆ๊ฒŒ์ž„

23289 ๋‹จ์–ด JavaScriptvanilla jsJavaScript

๐Ÿ‘ค ๊ณ„๊ธฐ

์ด๋ฒˆ์ฃผ ์ดˆ๋ฐ˜,

IT๋™์•„๋ฆฌ ๋ฉด์ ‘์„ ๋ณธ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š”๋ฐ, ๊ฐ‘์ž๊ธฐ ํ˜„ํƒ€๋ฅผ ๋งž์•„ ์•„๋ฌด๊ฒƒ๋„ ํ•˜๊ธฐ๊ฐ€ ์‹ซ์—ˆ๋‹ค.

์ด๊ฑฐ ๋–จ์–ด์ง€๋ฉด ๋˜ ๋‹ค๋ฅธ ๊ฑธ ํ•ด์•ผํ•˜๋Š”๋ฐ, ์ž์†Œ์„œ๋Š” ์–ธ์ œ ์“ฐ๊ณ  ๋ฉด์ ‘์€ ์–ธ์ œ ์ค€๋น„ํ•˜๊ณ  .. ์ƒ๊ฐ์ด ๋“ค์–ด ํ† ์š”์ผ์— ๋ฉด์ ‘์„ ๋ณธ ๋’ค๋กœ ํ•ฉ๋ถˆ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ๊นŒ์ง€ ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜๋‹ค. ^-^ (๋ฌผ๋ก  ์ปค๋ฐ‹์€ ์ฑ„์› ๋‹ค.)

์‹ฌ์ง€์–ด ๋‹ค๋ฅธ IT ๋™์•„๋ฆฌ๋Š” ๋‹น์žฅ ํ™”์š”์ผ๊นŒ์ง€ ๋งˆ๊ฐ์ด์—ฌ์„œ ์‰ด ์‹œ๊ฐ„๋„ ์—†์ด ์ž์†Œ์„œ๋ถ€ํ„ฐ ์จ์•ผํ–ˆ์—ˆ๋Š”๋ฐ ๊ทธ๋ƒฅ ํฌ๊ธฐํ•˜๊ณ  ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š์•˜๋‹ค.

<ํ™”์š”์ผ ๋‚ฎ๊นŒ์ง€ ๋‚˜์˜ ์ƒํƒœ>

๊ทธ๋Ÿฌ๋‹ค๊ฐ€ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์€ ํ›„ ์นœํ•œ ์–ธ๋‹ˆ์™€ ํ•จ๊ป˜ ์นด๊ณต์„ ํ•˜๋Ÿฌ ๊ฐ”๋‹ค.

์—ฌ์ „ํžˆ ์ฝ”๋”ฉ์„ ํ•˜๊ธฐ๋Š” ์‹ซ์–ด์„œ ๋”ด์ง“๋งŒ ํ•˜๋˜ ์ค‘, ์–ธ๋‹ˆ๊ฐ€ ๊ฐ‘์ž๊ธฐ ๋ฏธ๋ž˜ ๋‚จํŽธ ๋ฝ‘๊ธฐ ๊ฐ™์€ ์ด์ƒํ•œ ๊ฑธ ๋งŒ๋“ค์–ด๋ณด๋ผ๊ณ  ํ–ˆ๋‹ค.

๋ ์šฉ?

์ด์ƒํ•˜๊ธด ํ•œ๋ฐ.. ์™ ์ง€ ๋Œ๋ฆฐ๋‹ค.

๊ฑฐ๊ธฐ์— ์˜๊ฐ์„ ์–ป์–ด ๋ฐ˜๋ ค๋™๋ฌผ์—๊ฒŒ ๊ฐ„ํƒ ๋‹นํ•˜๋Š” ๋ฏธ๋‹ˆ ๋ฃฐ๋ ›์„ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ•˜์˜€๋‹ค. ์˜๊ฐ์„ ์ค€ ์–ธ๋‹ˆ์—๊ฒŒ ๊ฐ์‚ฌ๋ฅผ..

๐ŸŸข ์ดˆ๊ธฐ ์„ธํŒ…

์šฐ์„  ์—ฌ๋Ÿฌ์žฅ์˜ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฌ์ง„์ด ํ•„์š”ํ–ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ์ฃผ๋ณ€ ๋ฐ˜๋ ค์ธ๋“ค์˜ ๋ฐ˜๋ ค๋™๋ฌผ + ์šฐ๋ฆฌ์ง‘ ๊ณ ์–‘์ด๋“ค ๊นŒ์ง€ ํ•ด์„œ ๋งŽ์€ ์‚ฌ์ง„๋“ค์„ ๋ฐ›์•„์™”๋‹ค.

html css js ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์ถ”๊ฐ€๋กœ img ํด๋”๋ฅผ ์ƒ์„ฑํ•ด ์ด๊ณณ์ €๊ณณ์—์„œ ๊ฐ€์ ธ์˜จ ๋ฐ˜๋ ค๋™๋ฌผ ์‚ฌ์ง„๋“ค์„ ๋„ฃ์—ˆ๋‹ค.

๐Ÿ“„ animal.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="reset.css">
    <link rel="stylesheet" href="animal.css">
    <script defer src="./animal.js"></script>
    <title>๊ท€์—ผ๋‘ฅ์ด ๊ณ ๋ฅด๊ธฐ</title>
</head>
<body>
    <header>
        <div id="header-div">
            <p>๋ฐ˜๋ ค๋™๋ฌผ์˜ ์„ ํƒ</p>
            <button id="btn" onclick=start()>์‹œ์ž‘ํ•˜๊ธฐ</button>
            <button id="stop" onclick=stop()>๋ฉˆ์ถ”๊ธฐ</button>
        </div>
    </header>
    <div id="main-div">
    </div>
</body>
</html>
  • html ์€ ํฌ๊ฒŒ ๊พธ๋ฏธ๋Š” ๊ฒƒ ์—†์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๐Ÿ“„ animal.js

const data = [
    {
        file : 'churo.jpg',
        description : '์ถ”๋กœ',
    },
    {
        file : 'ddang.jpg',
        description : '๋•…์ฝฉ',
    },
  	.
  	.
  	.
  • js ์—๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋„ˆ๋ฌด ๋งŽ์•„์„œ ๋’ท ๋ถ€๋ถ„์€ ์ž˜๋ž๋‹ค.

๐Ÿ”ต ๊ฐœ๋ฐœ

1. SetInterval : ์‚ฌ์ง„ ์ „ํ™˜

// ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ 
const btn = document.querySelector('#btn');
const mainDiv=document.querySelector('#main-div');
const image = document.createElement('img');
const info = document.createElement('p');

const changePic = () => {
    let i = 0;
    // ์‚ฌ์ง„ ๋Œ์•„๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜ setInterval ์‚ฌ์šฉ
    changePicId = setInterval(() => {
        image.src =`./img/${data[i].file}`;
        // ๊ฐ์ž ์˜ˆ์™ธ์ฒ˜๋ฆฌ
        if (data[i].file === 'potato.jpg') {
            info.innerHTML = `์•ˆํƒ€๊น๋„ค์š”.. ๋‹น์‹ ์€ ${data[i].description}์˜ ์„ ํƒ์„ ๋ฐ›์•„๋ฒ„๋ฆฌ๊ณ  ๋ง์•˜์Šต๋‹ˆ๋‹ค..`;
        } else {
            info.innerHTML =`๋‹น์‹ ์€ ${data[i].description}์˜ ์„ ํƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค !`
        }
        // ๋ฌดํ•œ๋ฐ˜๋ณต ๋กœ์ง
        if (i > data.length-1 || i === data.length-1) {
            i=0
        } else {
            i+=1;
        }
    }, 20)
}

์œ„์˜ ์ฝ”๋“œ๋Š” 0.02์ดˆ์— ํ•œ ๋ฒˆ์”ฉ data ์˜ ์‚ฌ์ง„์„ ๋Œ์•„๊ฐ€๋ฉด์„œ ์ถœ๋ ฅํ•ด์ฃผ๋Š” ์ฝ”๋“œ์ด๋‹ค.

  • ์‹œ์ž‘ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด changePic ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ๋‹ค.

  • image ํƒœ๊ทธ์˜ src์ฃผ์†Œ๋ฅผ i ์— ํ•ด๋‹นํ•˜๋Š” data ์˜ file ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.

  • ๊ฐ์ž ์‚ฌ์ง„์ผ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ๋„ฃ์—ˆ๋‹ค.

  • i ์— ํ•ด๋‹นํ•˜๋Š” description ์„ ๊ฐ€์ ธ์™€ ๊ฐ์ž ์‚ฌ์ง„์ผ ๋•Œ๋Š” ํ•œํƒ„ํ•˜๋Š” ๋ฌธ๊ตฌ๋ฅผ, ๋‹ค๋ฅธ ๊ท€์—ฌ์šด ๋™๋ฌผ๋“ค์ด ๋‚˜์˜ค๋ฉด ์ถ•ํ•˜ํ•œ๋‹ค๋Š” ๋ฌธ๊ตฌ๋ฅผ ๋„์šฐ๊ฒŒ ํ–ˆ๋‹ค.

  • ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ฌดํ•œ์œผ๋กœ ๋Œ์•„๊ฐ€์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์—, i๊ฐ€ data์˜ ๊ธธ์ด -1 (์ฆ‰, ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๊นŒ์ง€ ๊ฐˆ ๊ฒฝ์šฐ)์ผ ๊ฒฝ์šฐ, i๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”์‹œ์ผœ ๋‹ค์‹œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋„๋ก ํ•˜์˜€๋‹ค.

  • ์ด ์™ธ์˜ ๊ฒฝ์šฐ์—๋Š” i ๋ฅผ 1์”ฉ ์ฆ๊ฐ€์‹œ์ผœ ๋‹ค์Œ ์‚ฌ์ง„์œผ๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•œ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์‹œ์ž‘ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ, ์‚ฌ์ง„์ด ๋น ๋ฅธ ์†๋„๋กœ ๋ฌดํ•œ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

2. Start, Stop(clearInterval)

// ์‹œ์ž‘ ์ด๋ฒคํŠธ
const start = () => {
    mainDiv.style.backgroundColor = 'white';
    image.setAttribute('height','400px');
    image.setAttribute('width','400px');
    mainDiv.appendChild(image);
    mainDiv.appendChild(info);
 
    changePic();
}

// ๋ฉˆ์ถ”๊ธฐ ์ด๋ฒคํŠธ
const stop = () => {
    mainDiv.style.backgroundColor = 'yellow';
    clearInterval(changePicId);
};
  • start ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ img ์œ„์น˜๋ฅผ ์ •ํ•ด mainDiv ์˜ ์ž์‹์œผ๋กœ ๋“ค์–ด๊ฐ€๊ฒŒ ํ–ˆ๋‹ค.
  • stop ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„ ๋•Œ clearInterval ์„ ํ•˜์—ฌ ํ™”๋ฉด ์ „ํ™˜์„ ๋ฉˆ์ถ”๋„๋ก ํ–ˆ๋‹ค.
  • stop ํ–ˆ์„ ๋•Œ, ๋ฐฐ๊ฒฝ์ƒ‰์„ ๋…ธ๋ž€์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ” ๊ฐ•์กฐ๊ฐ€ ๋˜๋„๋ก ํ–ˆ๋‹ค.

๐Ÿ”ด Trouble Shooting

Stop ์ด๋ฒคํŠธ๊ฐ€ ์‹คํ–‰์ด ์•ˆ ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์ด์œ ๋Š”, changePicId ๋Š” ์ง€์—ญ๋ณ€์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— stop ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด์—ˆ๋‹ค.

๊ตฌ๊ธ€๋ง์„ ํ•ด๋ณธ ๊ฒฐ๊ณผ, ์ด๋Ÿด ๋•Œ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†์ด var ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๊ฒฐ์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค. ใ… ใ… 

// ์š”์†Œ ๊ฐ€์ ธ์˜ค๊ธฐ 
const btn = document.querySelector('#btn');
const mainDiv=document.querySelector('#main-div');
const image = document.createElement('img');
const info = document.createElement('p');
// ์–ด์ฉ” ์ˆ˜ ์—†๋Š” var ์‚ฌ์šฉ 
var changePicId;

์ดˆ๊ธฐ์— ์š”์†Œ๋ฅผ ์„ค์ •ํ•  ๋•Œ var ๋กœ changePicId ๋ฅผ ์„ ์–ธํ•ด์ฃผ์–ด์„œ ์ „์—ญ์œผ๋กœ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ์—ˆ๋‹ค.

๊ทธ๋ฆฌํ•˜์—ฌ .. 3์‹œ๊ฐ„๋งŒ์— ๊ฐœ๋ฐœ์ด ๋๋‚ฌ๋‹ค.

โœ… ๊ฒฐ๊ณผ

์ค‘๊ฐ„์— ์ด์ƒํ•œ ๊ฒŒ ๋ณด์ด๋Š” ๊ฒƒ์€ ๊ธฐ๋ถ„ํƒ“์ด๋‹ค.

โœ” ๋Š๋‚€์ 

  • ํž๋ง๋˜๋Š” ์ฝ”๋”ฉ์ด์—ˆ๋‹ค.. ์ •๋ง ์•„๋ฌด์ƒ๊ฐ์—†์ด ๋งŒ๋“ค์—ˆ๊ณ  ์ฆ๊ฑฐ์› ๋‹ค ^^
  • ์ด๋Ÿฐ ๊ฐ„๋‹จํ•œ ๋ฏธ๋‹ˆํ”„๋กœ์ ํŠธ๋„ ๋„์›€์ด ๋งŽ์ด ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋Š๊ผˆ๋‹ค. setInterval, clearInterval ๊ฐ™์ด ๊ผญ ํ•„์š”ํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์–ด ์˜๋ฏธ ์žˆ์—ˆ๋‹ค.
  • ์‰ฌ์–ด๊ฐ€๋Š” ๋Š๋‚Œ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ–ˆ๋Š”๋ฐ ๊ฒฐ๊ณผ๊ฐ€ ์ž˜ ๋‚˜์˜จ ๊ฒƒ ๊ฐ™์•„ ๋ฟŒ๋“ฏํ–ˆ๋‹ค.

๐ŸŒฟ GITHUB

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ