μžλ°”μŠ€ν¬λ¦½νŠΈUI

πŸŒ‡ 닀크 λͺ¨λ“œ μ „ν™˜ μ‹œ, λΆ€λ“œλŸ½κ³  완성도 높은 μ›Ή UI λ§Œλ“€κΈ°

πŸ―κΏ€μƒμ΄πŸ 2025. 7. 28. 09:58

닀크 λͺ¨λ“œ μ „ν™˜ μ‹œ, λΆ€λ“œλŸ½κ³  완성도 높은 μ›Ή UI λ§Œλ“€κΈ°

 

 

졜근 μ›Ήμ‚¬μ΄νŠΈμ—μ„œ 닀크 λͺ¨λ“œ μ „ν™˜ κΈ°λŠ₯은

λ‹¨μˆœν•œ νŠΈλ Œλ“œλ₯Ό λ„˜μ–΄

μ‚¬μš©μž κ²½ν—˜(UX)의 핡심 μš”μ†Œλ‘œ 자리 작고 μžˆμŠ΅λ‹ˆλ‹€.

 

λ³Έ κΈ€μ—μ„œλŠ” CSS와 JavaScriptλ₯Ό ν™œμš©ν•˜μ—¬

ν…Œλ§ˆ λ³€κ²½ μ‹œ λΆ€λ“œλŸ½κ³  λ§€λ„λŸ¬μš΄ μ „ν™˜μ„ κ΅¬ν˜„ν•˜λŠ”

방법을 심도 있게 λ‹€λ€„λ΄…λ‹ˆλ‹€.

 

ν”„λŸ°νŠΈμ—”λ“œ κ°œλ°œμžλŠ” λ¬Όλ‘ ,

UX/UI λ””μžμ΄λ„ˆμ—κ²Œλ„ 도움이 λ˜λŠ”

μ‹€μ „ νŒμ„ μ •λ¦¬ν–ˆμŠ΅λ‹ˆλ‹€.

 

✨ μ™œ λΆ€λ“œλŸ¬μš΄ ν…Œλ§ˆ μ „ν™˜μ΄ μ€‘μš”ν•œκ°€?

  • κ°‘μž‘μŠ€λŸ¬μš΄ ν™”λ©΄ μ „ν™˜μ€ μ‹œκ°μ  ν”Όλ‘œλ₯Ό μœ λ°œν•  수 있음
  • μ „ν™˜ 방식이 μ„Έλ ¨λ μˆ˜λ‘ μ„œλΉ„μŠ€ ν’ˆμ§ˆμ— λŒ€ν•œ 인식이 μƒμŠΉ
  • 특히 닀크 λͺ¨λ“œλŠ” 밝기 λŒ€λΉ„κ°€ 크기 λ•Œλ¬Έμ—, μ „ν™˜ μ™„κΈ‰ 쑰절이 μ€‘μš”

 

🎨 CSS Transition으둜 λΆ€λ“œλŸ¬μš΄ μŠ€νƒ€μΌ μ „ν™˜

 

CSS λ³€μˆ˜ 기반 ν…Œλ§ˆ μ‹œμŠ€ν…œμ„ ν™œμš©ν•˜λ©΄, transition μ†μ„±λ§ŒμœΌλ‘œλ„ λΆ€λ“œλŸ¬μš΄ μ‹œκ° 효과λ₯Ό λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 
body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s ease-in-out, color 0.3s ease-in-out;
}

λ³€μˆ˜ 적용이 ν•„μš”ν•œ μš”μ†Œμ— transition을 λ°˜λ“œμ‹œ μ„€μ •ν•΄μ•Ό μž‘λ™ν•©λ‹ˆλ‹€.

 

🧩 μ•„μ΄μ½˜·κ·Έλž˜ν”½ μš”μ†Œλ„ ν•¨κ»˜ μ „ν™˜μ‹œν‚€κΈ°

 

μ•„μ΄μ½˜μ— opacity, transform 등을 μ μš©ν•˜λ©΄ ν…Œλ§ˆ μ „ν™˜μ΄ λ”μš± 생동감 있게 λŠκ»΄μ§‘λ‹ˆλ‹€.

 
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

.theme-icon {
  animation: fadeIn 0.5s ease;
}

 

λ˜λŠ” νƒœμ–‘ 🌞 ↔️ 달 🌚 μ „ν™˜μ²˜λŸΌ rotate λ˜λŠ” scale을 ν™œμš©ν•œ λͺ¨μ…˜λ„ μ‹œλ„ν•΄λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ”§ JavaScript둜 ν…Œλ§ˆ μ„€μ • μƒνƒœ κ΄€λ¦¬ν•˜κΈ°

 

CSSλ§ŒμœΌλ‘œλŠ” μ œν•œμ μΌ 수 μžˆμœΌλ―€λ‘œ, JS둜 data-theme 속성 값을 μ„€μ •ν•΄ λ™μ μœΌλ‘œ μŠ€νƒ€μΌμ„ λ³€κ²½ν•©λ‹ˆλ‹€.

 
function setTheme(theme) {
  document.documentElement.setAttribute("data-theme", theme);
}

 

πŸ”„ 운영체제 ν…Œλ§ˆ 감지 + μ‹€μ‹œκ°„ 적용

 

μ‚¬μš©μžκ°€ λ³„λ„λ‘œ μ„€μ •ν•˜μ§€ μ•Šμ€ 경우, 운영체제의 라이트/닀크 섀정을 λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

 
window.matchMedia("(prefers-color-scheme: dark)")
  .addEventListener("change", (e) => {
    const newTheme = e.matches ? "dark" : "light";
    setTheme(newTheme);
  });

matchMedia 이벀트λ₯Ό 톡해 운영체제 ν…Œλ§ˆ 변경을 μ‹€μ‹œκ°„ 감지할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ“· ν…Œλ§ˆ μ „ν™˜ UI의 흐름을 μ΄λ―Έμ§€λ‘œ ν‘œν˜„ν•˜λ©΄ μ’‹μŠ΅λ‹ˆλ‹€

  • 닀크 λͺ¨λ“œ 적용 μ „/ν›„ 비ꡐ 이미지
  • μ‚¬μš©μž 클릭 → μ• λ‹ˆλ©”μ΄μ…˜ 흐름을 μ‹œκ°ν™”ν•œ λ‹€μ΄μ–΄κ·Έλž¨
  • ν…Œλ§ˆ ν† κΈ€ μΈν„°νŽ˜μ΄μŠ€ ꡬ성도

 

πŸ“š κ΄€λ ¨ μ½˜ν…μΈ 

 

πŸ“ μš”μ•½ν•˜λ©°

 

CSS의 transitionκ³Ό λ³€μˆ˜,

JS의 matchMedia와 이벀트 감지λ₯Ό 적절히 μ‘°ν•©ν•˜λ©΄

λΆ€λ“œλŸ¬μš΄ ν…Œλ§ˆ μ „ν™˜ UXλ₯Ό κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

μ΄λŠ” λ‹¨μˆœ κΈ°λŠ₯을 λ„˜μ–΄

μ‚¬μš©μž 쀑심 μ›Ή λ””μžμΈμ˜

μ€‘μš”ν•œ ν¬μΈνŠΈμž…λ‹ˆλ‹€.

 

λ‹€μŒ κΈ€μ—μ„œλŠ”

ν…Œλ§ˆ λ³€κ²½ μ‹œ λ°°κ²½ κ·Έλž˜ν”½μ΄λ‚˜

λͺ¨μ…˜μ„ 더 μ •κ΅ν•˜κ²Œ λ‹€λ£¨λŠ”

κ³ κΈ‰ UI κ΅¬ν˜„λ²•λ„ μ†Œκ°œν•  μ˜ˆμ •μž…λ‹ˆλ‹€.