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

UI Code Lab

๐ŸŒ™ ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ – ๋ฐ”๋‹๋ผ JS๋กœ UX ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ๋ณธ๋ฌธ

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

๐ŸŒ™ ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ – ๋ฐ”๋‹๋ผ JS๋กœ UX ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ

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

๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๋งŒ๋“ค๊ธฐ – ๋ฐ”๋‹๋ผ JS๋กœ UX ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ

 

 

 

์š”์ฆ˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋ฉด ๋‹คํฌ ๋ชจ๋“œ ๊ธฐ๋Šฅ์ด

๊ธฐ๋ณธ์ฒ˜๋Ÿผ ํƒ‘์žฌ๋˜์–ด ์žˆ์ฃ .

 

๋ˆˆ์˜ ํ”ผ๋กœ๋ฅผ ์ค„์ด๊ณ ,

์‚ฌ์šฉ์ž์˜ ํ™˜๊ฒฝ์— ๋งž์ถฐ ํ…Œ๋งˆ๋ฅผ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š”

๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์€

UX๋ฅผ ๋†’์ด๋Š” ๋ฐ ๋งค์šฐ ํšจ๊ณผ์ ์ž…๋‹ˆ๋‹ค.

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š”

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด

๋ฐ”๋‹๋ผ JavaScript์™€ CSS ๋ณ€์ˆ˜๋งŒ์œผ๋กœ

๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š”

๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

โœ… ๊ตฌํ˜„ ๋ชฉํ‘œ

  • ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋ผ์ดํŠธ ↔ ๋‹คํฌ ๋ชจ๋“œ ์ „ํ™˜
  • CSS ๋ณ€์ˆ˜(--color, --bg)๋ฅผ ํ™œ์šฉํ•œ ํ…Œ๋งˆ ์Šคํƒ€์ผ๋ง
  • JavaScript๋กœ data-theme ์†์„ฑ ์ œ์–ด
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ์‚ฌ์šฉ์ž ํ…Œ๋งˆ ์ €์žฅ

 

๐Ÿงฑ HTML ๊ตฌ์กฐ

 
<label class="theme-toggle">
  <input type="checkbox" id="toggle" />
  <span class="slider"></span>
</label>
  • input[type="checkbox"]๋กœ ํ† ๊ธ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„
  • label๊ณผ span.slider๋กœ ์Šคํƒ€์ผ๋ง

 

๐ŸŽจ CSS ์Šคํƒ€์ผ

 
:root {
  --bg-color: #ffffff;
  --text-color: #000000;
}

[data-theme="dark"] {
  --bg-color: #121212;
  --text-color: #ffffff;
}

body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s ease, color 0.3s ease;
}
  • :root์— ๊ธฐ๋ณธ ์ƒ‰์ƒ ์ •์˜
  • data-theme="dark"์ผ ๋•Œ ๋ณ€์ˆ˜ ๋ฎ์–ด์“ฐ๊ธฐ

 

โš™๏ธ JavaScript ๋กœ์ง

 
const toggle = document.getElementById("toggle");

toggle.addEventListener("change", () => {
  const isDark = toggle.checked;
  document.documentElement.setAttribute("data-theme", isDark ? "dark" : "light");
  localStorage.setItem("theme", isDark ? "dark" : "light");
});

// ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ ์ €์žฅ๋œ ํ…Œ๋งˆ ์ ์šฉ
window.addEventListener("DOMContentLoaded", () => {
  const savedTheme = localStorage.getItem("theme") || "light";
  document.documentElement.setAttribute("data-theme", savedTheme);
  toggle.checked = savedTheme === "dark";
});
  • data-theme ์†์„ฑ์œผ๋กœ CSS ์Šคํƒ€์ผ ๋ณ€๊ฒฝ
  • ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋กœ ์‚ฌ์šฉ์ž ์„ค์ • ์œ ์ง€

 

๐Ÿ’ก ํ™•์žฅ ์•„์ด๋””์–ด

  • ์•„์ด์ฝ˜(๐ŸŒž/๐ŸŒ™)์„ ํ•จ๊ป˜ ํ‘œ์‹œํ•ด ์ง๊ด€์„ฑ ๊ฐ•ํ™”
  • ์‹œ์Šคํ…œ ํ…Œ๋งˆ ๊ฐ์ง€ (prefers-color-scheme)๋กœ ์ž๋™ ์ ์šฉ
  • ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ ์ถ”๊ฐ€๋กœ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜

 

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ

 

๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์€ ๋‹จ์ˆœํ•œ UI ์š”์†Œ์ง€๋งŒ,

์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„๋ฅผ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ๋Š” ์š”์†Œ์ž…๋‹ˆ๋‹ค.

 

๋ฐ”๋‹๋ผ JS๋งŒ์œผ๋กœ๋„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋ฉฐ,

CSS ๋ณ€์ˆ˜์™€ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ™œ์šฉํ•˜๋ฉด

์œ ์ง€์„ฑ๊ณผ ํ™•์žฅ์„ฑ๋„ ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š”

์‹œ์Šคํ…œ ํ…Œ๋งˆ ๊ฐ์ง€ ๊ธฐ๋Šฅ์„

์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์†Œ๊ฐœํ•  ์˜ˆ์ •์ด์—์š”.

 

๊ธฐ๋Œ€ํ•ด์ฃผ์„ธ์š”! ๐Ÿ˜„