๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[๊ฐœ๋ฐœ] Practice/JavaScript jQuery

[JavaScript / jQuery] ํ•œ ๊ธ€์ž์”ฉ ์ถœํ˜„ํ•˜๋Š” Typewriting ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ

by Connecting-the-dots 2022. 3. 9.
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ’ก ์‹ค์Šต ํฌ์ธํŠธ!

  • ์˜ค๋Š˜์€ ํ•œ ๊ธ€์ž์”ฉ ๋ณด์—ฌ์ฃผ๋Š” Typewriting ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค.
  • Click Me! ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด "Hi! I'm Seoyun. Good to see U." ๋ฌธ๊ตฌ๊ฐ€ ํ•œ ๊ธ€์ž์”ฉ ๋‚˜์˜จ๋‹ค.
  • ์ด๋ฒˆ ๊ธฐ๋Šฅ์€ setTimeout ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๐Ÿ’œ HTML

<div class="container"> 
  <button>Click Me!</button>
  <h1>Hi! I'm Seoyun. Good to see U.</h1>
</div>
  • ๋จผ์ € HTML ํŒŒ์ผ์— ๋ฒ„ํŠผ๊ณผ ๋‚˜์™€์•ผํ•˜๋Š” ๋ฌธ๊ตฌ์˜ ๋‚ด์šฉ์„ ์ž‘์„ฑํ•ด์ค€๋‹ค.

๐Ÿ’œ CSS

.container {
  width: 100%;
  margin: 50px;
}

h1 {
  width: 100%;
  text-align: center;
  display: none;
}

button {
  display: block;
  margin: 30px auto;
  width: 130px;
  padding: 5px 10px;
  border: none;
  border-radius: 5px;
  background: blueviolet;
  color: white;
  font-weight: bold;
  font-size: 20px;
}
  • ์ด๋ฒˆ ์‹ค์Šต์—์„œ css ๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š๋‹ค. ๊ทธ๋ƒฅ ์ทจํ–ฅ๊ป ๊พธ๋ฏธ๋ฉด ๋œ๋‹ค.
    (๋ณด๋ผ์ƒ‰์„ ์ข‹์•„ํ•ด์„œ ๋ณด๋ผ์ƒ‰ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์—ˆ๋‹ค.)
  • h1 ํƒœ๊ทธ์˜ ๋ฌธ๊ตฌ๋“ค์„ ๋ฐ”๋กœ ๋ณด์—ฌ์ฃผ์–ด๋„ ๋˜์ง€๋งŒ ์งœ์ž”~ ํ•˜๋Š” ๋Š๋‚Œ์œผ๋กœ ๋‚˜์˜ค๊ธธ ์›ํ•ด์„œ display : none ์„ ํ†ตํ•ด ์ผ๋‹จ ์ˆจ๊ฒจ์ฃผ์—ˆ๋‹ค.

๐Ÿ’œ JavaScript

var h1Tag = document.querySelector('h1'); // h1 ํƒœ๊ทธ ์ž์ฒด ์˜๋ฏธ
var h1Letter = document.querySelector('h1').innerHTML; // h1 ํƒœ๊ทธ ๋‚ด์šฉ ์˜๋ฏธ

$('button').click(function(){
    $('h1').show();
    animation(h1Tag, h1Letter);
})

function animation(tag, letter){
    tag.innerHTML = '';
    for(let i=0; i < letter.length; i++){
        setTimeout(function(){
            tag.innerHTML += letter[i]
        }, (i+1)*100)

    }
}
  • ์˜ค๋Š˜์˜ ํฌ์ธํŠธ๋Š” JavaScript ์— ์žˆ๋‹ค.
  • ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๋•Œ, ์šฐ์„  ์ˆจ๊ฒจ๋‘์—ˆ๋˜ h1 ํƒœ๊ทธ๊ฐ€ ๋ณด์—ฌ์•ผ ํ•˜๋Š”๋ฐ, ๋ชจ๋“  ๊ธ€์ž๊ฐ€ ํ•œ ๋ฒˆ์— ๋ณด์ด๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์•ž์—์„œ๋ถ€ํ„ฐ ํ•œ ๊ธ€์ž์”ฉ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ณด์—ฌ์•ผ ํ•œ๋‹ค.
  • ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ๊ฐ€์ง„ animation ์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด์ฃผ์—ˆ๋‹ค.
  • animation ํ•จ์ˆ˜์˜ ์ž‘๋™๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
    • ์šฐ์„ , ์›๋ž˜ h1 ํƒœ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ์„ ๋‹ค ์ง€์›Œ์„œ ์•ˆ๋ณด์ด๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค. (tag.innerHTML = ' ';)
      ์ด ๋•Œ, animation ํ•จ์ˆ˜์˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์„ tag ์™€ letter ๋Š” JavaScript ๋ฌธ๋ฒ•์ด๋ฏ€๋กœ jQuery ๋ฌธ๋ฒ•์ด ์•„๋‹Œ JavaScript ๋ฌธ๋ฒ•์œผ๋กœ ์ž‘์„ฑํ•ด์ฃผ์–ด์•ผ ํ•˜๋ฏ€๋กœ innerHTML ์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
    • ๊ทธ ๋‹ค์Œ, h1 ํƒœ๊ทธ ๋‚ด์˜ ๊ธ€์ž ์ˆ˜๋งŒํผ for ๋ฌธ์„ ๋ฐ˜๋ณตํ•˜๋ฉฐ, ๋ฐ˜๋ณตํ•  ๋•Œ๋งˆ๋‹ค ๊ธ€์ž๋ฅผ ํ•˜๋‚˜์”ฉ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
      ์—ฌ๊ธฐ๊นŒ์ง€ ์ƒ๊ฐํ•˜๋ฉด for ๋ฌธ ์•ˆ์— tag.innerHTML += letter[i] ๋ฅผ ๋„ฃ์œผ๋ฉด ๋  ๊ฒƒ๊ฐ™๋‹ค๋Š” ๊ฒƒ๊นŒ์ง€๋Š” ๊ฐ์ด ์˜จ๋‹ค.
      ๊ทธ๋ฆฌ๊ณ  ์–ด์ฐจํ”ผ ์ด๊ฒƒ๋งŒ ์จ๋ดค์ž.. ์ตœ์ข…๋‹จ๊ณ„๋งŒ ํ™”๋ฉด์— ๋ณด์—ฌ์ฃผ๋ฏ€๋กœ ํ™”๋ฉด์—๋Š” ๊ทธ๋ƒฅ h1 ํƒœ๊ทธ์— ๋‚ด์šฉ ๋„ฃ์€ ๊ฑฐ๋‚˜ ๋™์ผํ•˜๊ฒŒ ๋‚˜์˜จ๋‹ค.
    • ํฌ์ธํŠธ๋Š” ์ ๋‹นํ•œ ์‹œ๊ฐ„๊ฐ„๊ฒฉ์„ ์ฃผ๋ฉด์„œ ์ถ”๊ฐ€๊ฐ€ ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒƒ!
    • for ๋ฌธ์€ ์•„์ฃผ ๋น ๋ฅด๊ฒŒ ๋ฐ˜๋ณต์ด ์ง„ํ–‰๋˜๋ฏ€๋กœ ์‹œ๊ฐ„ ๋ถ€๋ถ„์— ๊ทธ๋ƒฅ ์ˆซ์ž๋งŒ ์ ์–ด๋ฒ„๋ฆฌ๋ฉด ๊ธ€์ž๊ฐ€ ๋‚˜์˜ค๋Š” ์‹œ๊ฐ„ ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์ด ์—†๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.
      • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  ๊ธ€์ž๋ฅผ 1์ดˆ(1000ms)๋กœ ์„ค์ •ํ–ˆ๋‹ค๊ณ  ํ•˜๋ฉด ์ฒซ๋ฒˆ์งธ ๊ธ€์ž๋„ for ๋ฌธ์ด ๋Œ์ž๋งˆ์ž ์•ฝ 1์ดˆ ํ›„, ๋‘๋ฒˆ์งธ ๊ธ€์ž๋„ for ๋ฌธ์ด ๋Œ์ž๋งˆ์ž ์•ฝ 1์ดˆ ํ›„ ์ด๋Ÿฐ ์‹์œผ๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์— h1 ํƒœ๊ทธ์˜ ๋‚ด์šฉ์ด ๊ฑฐ์˜ ๋™์‹œ์— ๋ณด์—ฌ์ง€๊ฒŒ ๋œ๋‹ค.
        (ํ—ท๊ฐˆ๋ฆฌ์ง€ ๋ง์ž. ๊ทธ ์ „ ๊ธ€์ž๊ฐ€ ๋‚˜์˜จ ํ›„ 1์ดˆ๊ฐ€ ์•„๋‹ˆ๋‹ค.)
      • ๋”ฐ๋ผ์„œ, ๊ธ€์ž๊ฐ€ ๋‚˜์˜ค๋Š” ์‹œ๊ฐ„ ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์„ ์ฃผ๊ธฐ ์œ„ํ•ด i ๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.
      • ๋‚˜์˜ ๊ฒฝ์šฐ (i+1)*100 ์ •๋„๋กœ ์‹œ๊ฐ„์„ ์„ค์ •ํ–ˆ๋Š”๋ฐ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด 0๋ฒˆ์งธ๋Š” 100ms, 1๋ฒˆ์งธ๋Š” 200ms, 2๋ฒˆ์งธ๋Š” 300ms... ์ด๋Ÿฐ ์‹์œผ๋กœ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธ€์ž๊ฐ€ ์ถ”๊ฐ€๋˜๋Š” ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์ด 100ms ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.
728x90
๋ฐ˜์‘ํ˜•