๊ด€๋ฆฌ ๋ฉ”๋‰ด

UI Code Lab

๐ŸŽจ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด CSS + JS๋กœ ๋ถ€๋“œ๋Ÿฌ์šด UI ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ ๋ณธ๋ฌธ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธUI

๐ŸŽจ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด CSS + JS๋กœ ๋ถ€๋“œ๋Ÿฌ์šด UI ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ

๐Ÿฏ๊ฟ€์ƒ์ด๐Ÿ 2025. 7. 14. 09:00

 

 

 

์š”์ฆ˜ ์›น์‚ฌ์ดํŠธ ๋ณด๋ฉด ์ธํ„ฐํŽ˜์ด์Šค์—

์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์‚ด์ง ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ™• ๋‹ค๋ฅด๊ฒŒ ๋А๊ปด์ง€์ž–์•„์š”?

๊ทผ๋ฐ ๋ง‰์ƒ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด

GSAP, Framer Motion ๊ฐ™์€

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ถ€ํ„ฐ ์ƒ๊ฐ๋‚˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์ฃ .

 

๊ทธ๋Ÿฐ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด๋„

CSS์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ์œผ๋กœ

์ถฉ๋ถ„ํžˆ ๋ถ€๋“œ๋Ÿฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฌ์šด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑฐ,

์•Œ๊ณ  ๊ณ„์…จ๋‚˜์š”?

 

์˜ค๋Š˜์€ ์ •๋ง ๊ฐ€๋ณ๊ฒŒ,

ํ•˜์ง€๋งŒ ํ™•์‹คํ•˜๊ฒŒ ์• ๋‹ˆ๋ฉ”์ด์…˜์„

๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆด๊ฒŒ์š”!

 

 

โœ… ์™œ ๊ตณ์ด CSS + JS๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค๊นŒ?

๊ฐ„๋‹จํžˆ ๋งํ•˜๋ฉด:

  • ๊ฐ€๋ณ๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค! ๋กœ๋”ฉ ์†๋„ ๋น ๋ฅธ ์›น์ด ์œ ๋ฆฌํ•˜๋‹ˆ๊นŒ์š”.
  • ์กฐ์ ˆ์ด ์ž์œ ๋กญ์Šต๋‹ˆ๋‹ค! CSS๋กœ ๋ชจ์–‘ ๋งŒ๋“ค๊ณ  JS๋กœ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ œ์–ด๋„ ๊ฐ€๋Šฅํ•ด์š”.
  • ๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜๋„ ๊ดœ์ฐฎ์•„์š”! ๋Œ€๋ถ€๋ถ„์˜ ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์—์„œ ์•„์ฃผ ์ž˜ ์ง€์›๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์˜๋ฉด์„œ๋„ ์ตœ์ ํ™”๋œ ์›น์„ ๋งŒ๋“ค๊ธฐ ๋”ฑ ์ข‹์€ ์กฐํ•ฉ์ด์—์š”. ๐Ÿ˜„

 

 

โœจ CSS๋กœ ๊ฐ„๋‹จํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ

 

๊ฐ€์žฅ ์‰ฌ์šด ๋ฐฉ๋ฒ•๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด๋ณผ๊ฒŒ์š”!

๐ŸŸฆ transition ์‚ฌ์šฉํ•˜๊ธฐ

 
.button {
  transition: transform 0.3s ease;
}
.button:hover {
  transform: scale(1.1);
}

 

๋ฒ„ํŠผ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆด ๋•Œ ์‚ด์ง ์ปค์ง€๋Š” ํšจ๊ณผ! ๊ฐ„๋‹จํ•˜์ฃ ?

 

๐Ÿ” keyframes ํ™œ์šฉํ•˜๊ธฐ

 
@keyframes bounce {
  0%   { transform: translateY(0); }
  50%  { transform: translateY(-10px); }
  100% { transform: translateY(0); }
}

.bouncy {
  animation: bounce 0.6s infinite;
}

 

์‚ด์ง ํŠ€๋Š” ๋А๋‚Œ์œผ๋กœ ์ธํ„ฐ๋ž™์…˜์„ ์ค„ ์ˆ˜ ์žˆ์–ด์š”. ๋ฒ„ํŠผ, ๋ฐฐ๋„ˆ, ๊ฐ•์กฐํ•  ์š”์†Œ์— ๋”ฑ์ž…๋‹ˆ๋‹ค.

 

๐Ÿง‘‍๐Ÿ’ป JavaScript๋กœ ๋” ์ •๊ตํ•œ ์ปจํŠธ๋กคํ•˜๊ธฐ

 

๐Ÿ”„ requestAnimationFrame์ด๋ž€?

 

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋งŒ๋“ค ๋•

requestAnimationFrame()์ด ํ•ต์‹ฌ์ด์—์š”.

setTimeout๋ณด๋‹ค ๋ถ€๋“œ๋Ÿฝ๊ณ ,

๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ์ตœ์ ํ™”ํ•ด์„œ ๋Š๊น€ ์—†์ด ๋™์ž‘ํ•ด์š”.

 

๐Ÿ“ฆ ๋ฐ•์Šค ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์›€์ง์ด๊ธฐ

 
let pos = 0;
function moveBox() {
  pos += 2;
  box.style.left = pos + 'px';
  if (pos < 300) requestAnimationFrame(moveBox);
}
moveBox();

 

์ฝ”๋“œ ๋ช‡ ์ค„๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ด๋™! ์•„์ฃผ ๊ธฐ๋ณธ์ด์ง€๋งŒ ํšจ๊ณผ๋Š” ์ข‹์•„์š”.

 

๐Ÿš— ์†๋„ ์กฐ์ ˆํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด? Easing ํ•จ์ˆ˜ ์“ฐ์„ธ์š”!

 

์ง์„ ์ ์œผ๋กœ ์Šฅ~ ์›€์ง์ด๋Š” ๊ฒƒ๋ณด๋‹ค

์ฒ˜์Œ์—” ๋А๋ฆฌ๊ฒŒ → ์ค‘๊ฐ„์—” ๋น ๋ฅด๊ฒŒ → ๋์—” ๋‹ค์‹œ ๋А๋ฆฌ๊ฒŒ

์ด๋Ÿฐ ๋А๋‚Œ์ด ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ์˜ˆ๋ป์š”!

 

๐ŸŽข ์˜ˆ์‹œ: easeInOutQuad

 
function easeInOutQuad(t) {
  return t < 0.5 ? 2 * t * t : -1 + (4 - 2 * t) * t;
}

 

์ด๊ฑธ ์• ๋‹ˆ๋ฉ”์ด์…˜์— ๋„ฃ์–ด์ฃผ๋ฉด ํ›จ์”ฌ ์ฐฐ์ง„ ๋™์ž‘์ด ๋ฉ๋‹ˆ๋‹ค.

 

๐Ÿงญ ์Šคํฌ๋กคํ•  ๋•Œ ๋‚˜ํƒ€๋‚˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜๋„ ๊ฐ€๋Šฅ!

 

ํ™”๋ฉด์„ ์•„๋ž˜๋กœ ๋‚ด๋ฆด ๋•Œ ํŠน์ • ์š”์†Œ๊ฐ€ ์Šฌ์ฉ ๋“ฑ์žฅํ•˜๋ฉด

์‚ฌ์ดํŠธ๊ฐ€ ๋” ์ƒ๋™๊ฐ ์žˆ๊ฒŒ ๋А๊ปด์ง€์ฃ ?

 

โœจ ๊ฐ„๋‹จํ•œ ์Šคํฌ๋กค ์• ๋‹ˆ๋ฉ”์ด์…˜

 
window.addEventListener('scroll', () => {
  const el = document.querySelector('.fade-in');
  const top = el.getBoundingClientRect().top;
  const threshold = window.innerHeight * 0.8;

  if (top < threshold) {
    el.style.opacity = 1;
    el.style.transform = 'translateY(0)';
  } else {
    el.style.opacity = 0;
    el.style.transform = 'translateY(20px)';
  }
});
 
.fade-in {
  opacity: 0;
  transform: translateY(20px);
  transition: all 0.6s ease;
}

 

์š”๋Ÿฐ ๋ฐฉ์‹์œผ๋กœ ์Šคํฌ๋กค ์ธํ„ฐ๋ž™์…˜๋„ ์†์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”!

 

๐Ÿ’ช ์„ฑ๋Šฅ๊นŒ์ง€ ์ฑ™๊ธฐ๊ธฐ!

 

์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋งŽ์•„์ง€๋ฉด ํŽ˜์ด์ง€๊ฐ€ ๋А๋ ค์งˆ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ, ์•„๋ž˜ ํŒ๋„ ๊ผญ ์ฐธ๊ณ ํ•˜์„ธ์š”:

  • transform, opacity๋งŒ์„ ์ค‘์‹ฌ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ตฌ์„ฑํ•˜๊ธฐ
  • requestAnimationFrame์œผ๋กœ ๋ Œ๋”๋ง ํƒ€์ด๋ฐ ๋งž์ถ”๊ธฐ
  • DOM ์ ‘๊ทผ ์ตœ์†Œํ™”ํ•˜๊ธฐ (querySelector ๋งค๋ฒˆ ์“ฐ์ง€ ๋ง๊ณ  ์บ์‹ฑํ•˜๊ธฐ)

 

๐Ÿ“Œ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ(FAQ)

 

Q. CSS๋ž‘ JS, ๋ญ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“œ๋Š” ๊ฒŒ ๋” ์ข‹์•„์š”?

→ ๋‹จ์ˆœํ•œ ๊ฑด CSS, ์กฐ๊ฑด์ด๋‚˜ ์‹œ๊ฐ„ ์ œ์–ด๊ฐ€ ํ•„์š”ํ•˜๋ฉด JS ์ถ”์ฒœ!

 

Q. ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ๋ฒ„๋ฒ…๊ฑฐ๋ ค์š”...

→ transform ์†์„ฑ๋งŒ ์“ฐ๊ณ , requestAnimationFrame์œผ๋กœ ์ตœ๋Œ€ํ•œ ์ตœ์ ํ™”ํ•ด๋ณด์„ธ์š”!

 

๐Ÿ”š ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐ

 

์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋””ํ…Œ์ผ์—์„œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์™„์„ฑ์‹œ์ผœ์ฃผ๋Š” ๋ฉ‹์ง„ ์š”์†Œ์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์ด ์—ฌ๋Ÿฌ๋ถ„์ด ๋” ๋งค๋„๋Ÿฝ๊ณ  ๊ฐ€๋ฒผ์šด ์›น์„ ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ผ์š”!

์ง์ ‘ ๋งŒ๋“  CSS + JS ์• ๋‹ˆ๋ฉ”์ด์…˜์œผ๋กœ ์›น์— ์ƒ๊ธฐ๋ฅผ ๋ถˆ์–ด๋„ฃ๊ณ ,

๋ฐฉ๋ฌธ์ž๋“ค์˜ ๋ˆˆ๊ธธ์„ ์‚ฌ๋กœ์žก์•„๋ณด์„ธ์š” ๐Ÿ˜‰

 

๊ถ๊ธˆํ•œ ์ ์ด๋‚˜ “์ด๊ฑด ์ข€ ๋” ๊นŠ์ด ์•Œ๊ณ  ์‹ถ๋‹ค!” ์‹ถ์€ ๊ฒŒ ์žˆ๋‹ค๋ฉด ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

๋‹ค์Œ ๊ธ€์—์„œ๋„ ๋” ์žฌ๋ฏธ์žˆ๊ณ  ์œ ์ตํ•œ ํŒ์œผ๋กœ ์ฐพ์•„๋ต๊ฒŒ์š”!

์ข‹์•„์š” ๐Ÿ‘์™€ ๊ณต์œ  ๐Ÿ’Œ๋Š” ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค