| μΌ | μ | ν | μ | λͺ© | κΈ | ν | 
|---|---|---|---|---|---|---|
| 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 | 
- jsμ€ν¬λ‘€μ΄λ²€νΈ
 - λΉλ³΄λμ°¨νΈ
 - λ·νλ¦μ€μ λλ©μ΄μ 
 - μΌμ΄νλ°λͺ¬νν°μ€
 - μ¬μ보μ΄μ¦
 - ννΈλ¦μ€
 - μ€ν¬λ‘€μ λλ©μ΄μ 
 - 골λ
 - μ κ·Όμ±
 - μΉμ κ·Όμ±
 - λ€ν¬λͺ¨λ
 - kpopdemonhunters
 - λ·νλ¦μ€ost
 - λ€ν¬λͺ¨λν κΈ
 - UIUX
 - κ°μμμ΄λ
 - μΉUI
 - UXλμμΈ
 - μΉκ°λ°
 - νλ‘ νΈμλ
 - μλ°μ€ν¬λ¦½νΈui
 - λ°λλΌμ€ν¬λ¦½νΈ
 - μΌλ°ν
 - μλ°μ€ν¬λ¦½νΈ
 - λ°λ§μΌν
 - uiμ»΄ν¬λνΈ
 - μΉλμμΈ
 - Golden
 - JavaScript
 - λ°λλΌjs
 
- Today
 
- Total
 
UI Code Lab
π λΌμ΄λΈλ¬λ¦¬ μμ΄ μ€ν¬λ‘€ λ±μ₯ μ λλ©μ΄μ  λ§λ€κΈ° – μ€μ  μΉ UI μμ  λ³Έλ¬Έ
π λΌμ΄λΈλ¬λ¦¬ μμ΄ μ€ν¬λ‘€ λ±μ₯ μ λλ©μ΄μ  λ§λ€κΈ° – μ€μ  μΉ UI μμ 
π―κΏμμ΄π 2025. 7. 17. 09:30
μ΅κ·Ό μΉ UIμμ μ€ν¬λ‘€μ λ°μν΄ μμκ°
μμ°μ€λ½κ² λνλλ μΈν°λμ μ
μ¬μ©μμκ² μλκ°μ μ€λλ€.
λ³΄ν΅ GSAP, ScrollReveal κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό νμ©νκ³€ νμ§λ§,
μ΄λ²μ λ°λλΌ JSμ CSSλ§μΌλ‘
κ°κ²°νκ² κ΅¬ννλ λ°©λ²μ μμλ΄ λλ€.
π§ ꡬν λͺ©ν
- μ€ν¬λ‘€ μμΉμ λ°λΌ μμ λ±μ₯
 - μμ°μ€λ¬μ΄ μ λλ©μ΄μ  ν¨κ³Ό
 - λΌμ΄λΈλ¬λ¦¬ μμ΄ μμ HTML/CSS/JS μ¬μ©
 
β¨ μμ±λ UI μμ° μ΄λ―Έμ§
(π‘μμ μ΄λ―Έμ§λ‘ μ 곡 κ°λ₯ – μ΄λ―Έμ§ μμ±μ΄ νμν κ²½μ° μλ €μ£ΌμΈμ!)
- μ¬μ©μκ° νλ©΄μ μλλ‘ μ€ν¬λ‘€νλ©΄, κ° μ½ν μΈ λΈλ‘μ΄ μμ°¨μ μΌλ‘ λΆλλ½κ² λ±μ₯ν©λλ€.
 - νλ¨μΌλ‘ κ°μλ‘ μμκ° μ§μ° λ±μ₯νλ©΄μ μ§μ€λλ₯Ό μ λν©λλ€.
 
π§© μ½λ ꡬν
β HTML ꡬ쑰
<section class="section">
  <h2 class="fade-in">μΉμ
 μ λͺ©</h2>
  <p class="fade-in">μ΄κ³³μ μμΈ μ€λͺ
μ΄ λ€μ΄κ°λλ€.</p>
</section>
π¨ CSS μ€νμΌ
.fade-in {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.fade-in.visible {
  opacity: 1;
  transform: translateY(0);
}
π§ μλ°μ€ν¬λ¦½νΈ
const faders = document.querySelectorAll('.fade-in');
const handleScroll = () => {
  faders.forEach(el => {
    const rect = el.getBoundingClientRect();
    if (rect.top < window.innerHeight - 100) {
      el.classList.add('visible');
    }
  });
};
window.addEventListener('scroll', handleScroll);
window.addEventListener('load', handleScroll); // λ‘λ© μμλ 체ν¬
π μ€μ  ν & νμ₯ μ¬λ‘
| κΈ°λ₯ | μ€λͺ | 
| λλ μ΄ μΆκ° | λ±μ₯ μμ μ§μ ν λ transition-delayλ‘ μμ κ° μκ°μ°¨ μ‘°μ  | 
| λ€μν λ±μ₯ λ°©μ | translateY λμ scale, rotate, opacity, clip-path λ± λ€μν CSS νμ© κ°λ₯ | 
| Intersection Observerλ‘ μ±λ₯ ν₯μ | λ§μ μμκ° μμ κ²½μ° μ±λ₯ μ ν λ°©μ§ | 
| λ°μν λμ | λͺ¨λ°μΌμμ μμ ν¬κΈ° λ° λ±μ₯ νμ΄λ° μ‘°μ  νμ | 
π μ€λ¬΄ μ μ© μμ
β³οΈ ν¬νΈν΄λ¦¬μ€ μΉμ¬μ΄νΈ
κ° νλ‘μ νΈ μΉ΄λκ° μ€ν¬λ‘€ μ μμν λ±μ₯ν΄ μ λ¬Έμ±μ΄ κ°μ‘°λ©λλ€.
ποΈ μ ν μμΈ νμ΄μ§
νΉμ§, μ΄λ―Έμ§, νκΈ° μμμ΄ μμ°¨μ μΌλ‘ λ±μ₯νλ©΄ μ¬μ©μκ° μ½κ² λͺ°μ ν©λλ€.
π§π« κ΅μ‘ μ½ν μΈ νλ«νΌ
κ°μ μκ°, μΉμ  μμ½ λ±μ΄ λ±μ₯ μ λλ©μ΄μ μΌλ‘ μ¬μ©μ μμ μ μ§μ€μν΄
π λ±μ₯ μμ  νλ¨μ λ μ λ°νκ² νκΈ°
λ¨μν getBoundingClientRect().top λ§μΌλ‘ λ±μ₯ μμΉλ₯Ό 체ν¬νλ©΄,
μμκ° μ§λμΉκ² λΉ λ₯΄κ² λνλκ±°λ μ¬μ©μ νκ²½μ λ°λΌ λ°μμ±μ΄ λ¨μ΄μ§ μ μμ΄μ.
κ·Έλμ λ±μ₯ νΈλ¦¬κ±° μμ μ 컀μ€ν°λ§μ΄μ§νλ λ°©μλ μκ°ν΄λ³Όκ²μ:
const triggerPoint = window.innerHeight * 0.8; // νλ©΄ 80% μμΉ κΈ°μ€
if (rect.top < triggerPoint) {
  el.classList.add('visible');
}
π‘ μ΄λ κ² νλ©΄ μ¬μ©μκ° μ½ν μΈ μ μ§μ€ν μ μλ νμ΄λ°μ λ±μ₯νκ² λκ³ ,
λͺ¨λ°μΌμμλ λμ± λΆλλ¬μ΄ UXλ₯Ό μ 곡ν©λλ€.
π CSS λ±μ₯ ν¨κ³Ό λ€λ¬κΈ°
κΈ°λ³Έμ μΈ opacity + translateY μΈμλ λ€μμ²λΌ
μ λλ©μ΄μ μ λ€μνν μ μμ΄μ:
.fade-in {
  clip-path: inset(0 0 100% 0);
  transition: clip-path 0.6s ease, opacity 0.6s ease;
}
.fade-in.visible {
  clip-path: inset(0 0 0% 0);
  opacity: 1;
}
πΉ μ μμ λ μμκ° μ¬λΌμ΄λλ‘ μ»€λ²κ° μ΄λ¦¬λ―μ΄ λ±μ₯νλ λλμ μ€λλ€.
μκ°μ μΌλ‘ λμ± μΈλ ¨λκ² λ³΄μ΄μ£ .
β‘ Intersection Observerλ₯Ό νμ©ν κ³ κΈ λ²μ 
μ±λ₯ μ΅μ νμ λλΆμ΄ λΉλκΈ°μ  κ°μ§ λ°©μμ μ°λ©΄
μλ°± κ°μ μμκ° μμ΄λ λΆλλ½κ² μ²λ¦¬λ©λλ€:
const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      entry.target.classList.add('visible');
      observer.unobserve(entry.target);
    }
  });
}, { threshold: 0.3 });
document.querySelectorAll('.fade-in').forEach(el => {
  observer.observe(el);
});
β μ΄ λ°©μμ μμκ° μΌμ  λΉμ¨ μ΄μ λ³΄μΌ λλ§ μ²λ¦¬νλ―λ‘,
리μμ€ λλΉ μμ΄ μ νν νμ΄λ°μ λ±μ₯ν©λλ€.
π¬ μ¬μ©μ λ°μκ³Ό ν μ€νΈ ν
- λ±μ₯ μμλ₯Ό ν μ€νΈν λλ κ°λ°μ λꡬμμ μ€ν¬λ‘€ μλ μ‘°μ νλ©΄μ νμΈ
 - λͺ¨λ°μΌμμλ κ°κΈμ  translateY λ²μλ₯Ό μ€μ¬μΌ μ λλ©μ΄μ μ΄ κ³Όνμ§ μκ² λ³΄μ
 - μ½ν μΈ λΈλ‘λ³λ‘ transition-delay μ‘°μ ν΄ λ μ λ°ν μ μ΄ κ°λ₯
 
π§Ύ λ§λ¬΄λ¦¬νλ©°
μ€ν¬λ‘€ μ λλ©μ΄μ μ λ¨μν μκ° ν¨κ³Όλ₯Ό λμ΄μ,
μ¬μ©μμ λͺ°μ λμ μ½ν μΈ μ§μ€λ ₯μ λμ΄λ κ°λ ₯ν λꡬμ λλ€.
μ΄λ² κΈμμλ GSAPμ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬ μμ΄λ,
λ°λλΌ μλ°μ€ν¬λ¦½νΈμ CSSλ§μΌλ‘λ
μΆ©λΆν λΆλλ¬μ΄ UIλ₯Ό ꡬνν μ μλ€λ κ°λ₯μ±μ
보μ¬λλ Έμ΅λλ€.
μ΄ λ°©μμ λΉκ΅μ  κ°λ³κ³ μ μ°νκ² μ μ©ν μ μκΈ° λλ¬Έμ,
ν¬νΈν΄λ¦¬μ€, μ ν μκ°, λΈλ‘κ·Έ λ± λ€μν νμ΄μ§μμ
μλν΄λ³Ό μ μμ΄μ. π¨π»
μμΌλ‘ λ λμ μ¬μ©μ κ²½νμ μν΄ μ§μ  ꡬ쑰λ₯Ό μ€κ³νκ³
컀μ€ν°λ§μ΄μ§ν΄λ³΄μΈμ. π
μμ μΈν°λμ  νλλ‘ μ¬μ΄νΈμ μΈμμ΄
λ¬λΌμ§ μ μλ€λ μ μ κΌ κΈ°μ΅ν΄μ£ΌμΈμ!
λ€μ κΈμμλ μ€ν¬λ‘€ μμΉμ λ°λΌ UI μμκ° κ³ μ λλ
Sticky Scroll UI μ λν΄ μμλ³Ό μμ μ΄μμ.
λ μ€λ§νΈνκ³ μ§κ΄μ μΈ λ μ΄μμμ λ§λλ λ°©λ²μ΄
κΆκΈνλ€λ©΄ κΈ°λν΄μ£ΌμΈμ!