| ์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ | 
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
| 9 | 10 | 11 | 12 | 13 | 14 | 15 | 
| 16 | 17 | 18 | 19 | 20 | 21 | 22 | 
| 23 | 24 | 25 | 26 | 27 | 28 | 29 | 
| 30 | 
- ์น์ ๊ทผ์ฑ
 - UX๋์์ธ
 - ์คํฌ๋กค์ ๋๋ฉ์ด์ 
 - UIUX
 - ๋คํฌ๋ชจ๋
 - ui์ปดํฌ๋ํธ
 - ๋ฐ๋ง์ผํ
 - js์คํฌ๋กค์ด๋ฒคํธ
 - kpopdemonhunters
 - Golden
 - ์น๋์์ธ
 - ๋ทํ๋ฆญ์ค์ ๋๋ฉ์ด์ 
 - ์ผ์ดํ๋ฐ๋ชฌํํฐ์ค
 - ์๋ฐ์คํฌ๋ฆฝํธui
 - ๋ฐ๋๋ผ์คํฌ๋ฆฝํธ
 - ์ ๊ทผ์ฑ
 - ๋คํฌ๋ชจ๋ํ ๊ธ
 - ๊ฐ์์์ด๋
 - ๋ฐ๋๋ผjs
 - ํ๋ก ํธ์๋
 - ์ผ๋ฐํ
 - ์๋ฐ์คํฌ๋ฆฝํธ
 - ์นUI
 - ์น๊ฐ๋ฐ
 - ์ฌ์๋ณด์ด์ฆ
 - ๋น๋ณด๋์ฐจํธ
 - ํํธ๋ฆญ์ค
 - JavaScript
 - ๋ทํ๋ฆญ์คost
 - ๊ณจ๋
 
- Today
 
- Total
 
UI Code Lab
๐จ ์ ๋๋ฉ์ด์  ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด CSS + JS๋ก ๋ถ๋๋ฌ์ด 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 ์ ๋๋ฉ์ด์ ์ผ๋ก ์น์ ์๊ธฐ๋ฅผ ๋ถ์ด๋ฃ๊ณ ,
๋ฐฉ๋ฌธ์๋ค์ ๋๊ธธ์ ์ฌ๋ก์ก์๋ณด์ธ์ ๐
๊ถ๊ธํ ์ ์ด๋ “์ด๊ฑด ์ข ๋ ๊น์ด ์๊ณ ์ถ๋ค!” ์ถ์ ๊ฒ ์๋ค๋ฉด ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์ธ์.
๋ค์ ๊ธ์์๋ ๋ ์ฌ๋ฏธ์๊ณ ์ ์ตํ ํ์ผ๋ก ์ฐพ์๋ต๊ฒ์!
์ข์์ ๐์ ๊ณต์ ๐๋ ํฐ ํ์ด ๋ฉ๋๋ค