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

UI Code Lab

๐ŸŒ™ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ์•ˆํ•จ์„ ์ œ๊ณตํ•˜๋Š” ์›น – ๋ฐ”๋‹๋ผ JS๋กœ ๋‹คํฌ ๋ชจ๋“œ ์ „ํ™˜ ๊ตฌํ˜„ํ•˜๊ธฐ ๋ณธ๋ฌธ

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

๐ŸŒ™ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ์•ˆํ•จ์„ ์ œ๊ณตํ•˜๋Š” ์›น – ๋ฐ”๋‹๋ผ JS๋กœ ๋‹คํฌ ๋ชจ๋“œ ์ „ํ™˜ ๊ตฌํ˜„ํ•˜๊ธฐ

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

๋ฐ”๋‹๋ผ JS๋กœ ๋‹คํฌ ๋ชจ๋“œ ์ „ํ™˜ ๊ตฌํ˜„ํ•˜๊ธฐ

 

 

์›น์‚ฌ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋Š” ํ™˜๊ฒฝ์ด ๋‹ค์–‘ํ•ด์ง€๋ฉด์„œ,

์ด์šฉ์ž๋“ค์€ ๋ฐ๊ณ  ํ™”๋ คํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ณด๋‹ค

๋ˆˆ์— ํŽธ์•ˆํ•œ ์–ด๋‘์šด ํ…Œ๋งˆ๋ฅผ ์„ ํ˜ธํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค.

 

ํŠนํžˆ ๋ฐค ์‹œ๊ฐ„์ด๋‚˜ ์กฐ๋ช…์ด ๋‚ฎ์€ ๊ณณ์—์„œ ์ ‘์†ํ•  ๊ฒฝ์šฐ,

ํ™”๋ฉด์ด ์ง€๋‚˜์น˜๊ฒŒ ๋ฐ์œผ๋ฉด ์‹œ์•ผ์— ๋ถ€๋‹ด์„ ์ค„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

 

์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ˆœ์ˆ˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(๋ฐ”๋‹๋ผ JS)๋งŒ์œผ๋กœ

๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์ง๊ด€์ ์ธ ๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ ,

์‚ฌ์šฉ์ž ์„ค์ •์„ ๊ธฐ์–ตํ•˜๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ํฌํ•จ๋˜์–ด ์žˆ์–ด

์‹ค๋ฌด์—๋„ ์ถฉ๋ถ„ํžˆ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿงฑ HTML ๊ตฌ์„ฑ – ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ ์‹œ์ž‘

๋จผ์ € ํ…Œ๋งˆ ์ „ํ™˜ ๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

 
<button id="toggle-theme">๐ŸŒž / ๐ŸŒš ๋ชจ๋“œ ์ „ํ™˜</button>

 

์ด ๋ฒ„ํŠผ์€ ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ ์ „ํ™˜์„ ๋‹ด๋‹นํ•˜๋ฉฐ,

id ์†์„ฑ์„ ํ†ตํ•ด ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‰ฝ๊ฒŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŽจ CSS ์„ค๊ณ„ – CSS ๋ณ€์ˆ˜๋กœ ์œ ์—ฐํ•œ ํ…Œ๋งˆ ์ ์šฉ

 

์ƒ‰์ƒ ์ „ํ™˜์„ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด CSS ๋ณ€์ˆ˜๋กœ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ํ…์ŠคํŠธ ์ƒ‰์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

 

์ƒ‰์ƒ ๋ณ€์ˆ˜๋Š” :root์— ์ •์˜๋˜๋ฉฐ, data-theme ์†์„ฑ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ์ž๋™์œผ๋กœ ์ ์šฉ๋˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์ด๋Ÿฐ ๊ตฌ์กฐ๋Š” ์œ ์ง€ ๊ด€๋ฆฌ์—๋„ ํšจ๊ณผ์ ์ด์—์š”.

 

โš™๏ธ JavaScript ๋กœ์ง – ์‚ฌ์šฉ์ž ์„ค์ • ๊ธฐ์–ตํ•˜๊ธฐ

 

์ „ํ™˜ ๋ฒ„ํŠผ์ด ํด๋ฆญ๋˜์—ˆ์„ ๋•Œ ํ˜„์žฌ ํ…Œ๋งˆ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ ,

์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ํ…Œ๋งˆ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์— ์ €์žฅํ•ด ๋‹ค์Œ ๋ฐฉ๋ฌธ ์‹œ์—๋„ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

 
const toggleBtn = document.getElementById("toggle-theme");
const currentTheme = localStorage.getItem("theme");

if (currentTheme) {
  document.documentElement.setAttribute("data-theme", currentTheme);
}

toggleBtn.addEventListener("click", () => {
  let theme = document.documentElement.getAttribute("data-theme");
  if (theme === "dark") {
    document.documentElement.setAttribute("data-theme", "light");
    localStorage.setItem("theme", "light");
  } else {
    document.documentElement.setAttribute("data-theme", "dark");
    localStorage.setItem("theme", "dark");
  }
});

 

์‚ฌ์šฉ์ž๊ฐ€ ์ด์ „์— ์„ ํƒํ•œ ํ…Œ๋งˆ๋ฅผ ๊ธฐ์–ตํ•จ์œผ๋กœ์จ,

์žฌ๋ฐฉ๋ฌธ ์‹œ ๊ฒฝํ—˜์˜ ์—ฐ์†์„ฑ์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐ŸŒŸ ๊ธฐ๋Šฅ ํ™•์žฅ ํŒ

 

๋‹จ์ˆœํ•œ ํ…Œ๋งˆ ์ „ํ™˜์— ๊ทธ์น˜์ง€ ์•Š๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์š”์†Œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋”์šฑ ํ’๋ถ€ํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ๋ฒ„ํŠผ ๋‚ด ์ด๋ชจ์ง€ ์ „ํ™˜์œผ๋กœ ์‹œ๊ฐ์  ํ”ผ๋“œ๋ฐฑ ์ œ๊ณต
  • ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ํ…Œ๋งˆ ์ž๋™ ๊ฐ์ง€ (prefers-color-scheme)
  • ํ…Œ๋งˆ ์ „ํ™˜ ์‹œ ํŽ˜์ด๋“œ ์ธ/์•„์›ƒ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ถ”๊ฐ€

์ด๋Ÿฌํ•œ ๋””ํ…Œ์ผ์€ UI๋ฅผ ์™„์„ฑ๋„ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ณ , ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋งค๋ ฅ์ ์œผ๋กœ ๋‹ค๊ฐ€๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

 

๐Ÿ’ฌ ์‚ฌ์šฉ์ž ์ค‘์‹ฌ ์›น์„ ์œ„ํ•œ ๋งˆ๋ฌด๋ฆฌ ์ƒ๊ฐ

 

์ด์ฒ˜๋Ÿผ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ CSS๋งŒ์œผ๋กœ๋„ ํ…Œ๋งˆ ์ „ํ™˜ ๊ธฐ๋Šฅ์„ ์ถฉ๋ถ„ํžˆ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์žกํ•œ ์ฝ”๋“œ ์—†์ด๋„ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ,

์‚ฌ์šฉ์ž ํŽธ์˜์„ฑ๊ณผ ๋””์ž์ธ์„ ๋™์‹œ์— ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด์ฃ .

 

๋‹คํฌ ๋ชจ๋“œ๋Š” ์›น ๋””์ž์ธ์˜ ํ๋ฆ„์—์„œ ์ ์  ๋” ์ค‘์š”ํ•ด์ง€๊ณ  ์žˆ์œผ๋ฉฐ,

ํฌํŠธํด๋ฆฌ์˜ค๋‚˜ ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ, ๋ธŒ๋žœ๋“œ ํ™ˆํŽ˜์ด์ง€ ๋“ฑ์— ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋…น์—ฌ๋‚ด๋ฉด

์ „์ฒด์ ์ธ ํ’ˆ์งˆ๊ณผ ๋งŒ์กฑ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… ๋งˆ๋ฌด๋ฆฌ

 

๋‹จ ๋ช‡ ์ค„์˜ JavaScript์™€ CSS ๋ณ€์ˆ˜๋งŒ์œผ๋กœ๋„ ๊ฐ•๋ ฅํ•œ ๋‹คํฌ ๋ชจ๋“œ UI๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ ๊ฐœ์ธ ๋ธ”๋กœ๊ทธ๋ฟ ์•„๋‹ˆ๋ผ ๋‹ค์–‘ํ•œ ์›น ํ”„๋กœ์ ํŠธ์—๋„ ์‰ฝ๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ ,

์‚ฌ์šฉ์ž ์ค‘์‹ฌ์˜ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

๋‹คํฌ ๋ชจ๋“œ ํ† ๊ธ€ ๊ธฐ๋Šฅ์„ ๋งˆ์Šคํ„ฐํ–ˆ๋‹ค๋ฉด,

์ด์ œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋” ๋งŽ์€ ์„ ํƒ์ง€๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋กœ ํ™•์žฅํ•ด๋ณผ ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

 

๋‹ค์Œ ๊ธ€์—์„œ๋Š” ๋ฒ„ํŠผ ํด๋ฆญ๋งŒ์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ํ•„ํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š”

ํ…Œ๋งˆ๋ณ„ ์ฝ˜ํ…์ธ  ํ•„ํ„ฐ UI๋ฅผ ๋ฐ”๋‹๋ผ JavaScript๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

 

๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ๋ถ„๋ฅ˜ํ•˜๊ณ ,

์‚ฌ์šฉ์ž ์ฐธ์—ฌ๋„๋ฅผ ๋†’์ด๋Š” ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒํ•œ UI๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ๊ธฐ๋Œ€ํ•ด๋„ ์ข‹์•„์š”.

 

ํ•œ ๋ฒˆ ํด๋ฆญ์œผ๋กœ ์›ํ•˜๋Š” ์ •๋ณด๋งŒ ๋ณด๋Š” ๊ฒฝํ—˜,

๊ทธ ์‹œ์ž‘์„ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด๋ณด์„ธ์š”. ๐ŸŒŸ