๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๋ฐ˜์‘ํ˜•

์ตœ๊ทผ ์›น์‚ฌ์ดํŠธ๋“ค์€ ์‚ฌ์šฉ์ž ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹คํฌ๋ชจ๋“œ๋ฅผ ๊ธฐ๋ณธ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.
๋‹คํฌ๋ชจ๋“œ๋Š” ๋ˆˆ๋ถ€์‹ฌ์„ ์ค„์ด๊ณ , OLED ํ™”๋ฉด์—์„œ๋Š” ์ „๋ ฅ ์†Œ๋ชจ๋ฅผ ์ค„์ด๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
ํ‹ฐ์Šคํ† ๋ฆฌ์—์„œ๋„ ์ง์ ‘ CSS๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ๋ธ”๋กœ๊ทธ์—์„œ๋„ ๋‹ฌ์ด๋‚˜ ํ•ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๊ตฌํ˜„๋˜๋„๋ก ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

(1) ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์ด๋™

  • ํ‹ฐ์Šคํ† ๋ฆฌ ๊ด€๋ฆฌ์ž → ์Šคํ‚จ ํŽธ์ง‘ ๋ฉ”๋‰ด๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
  • HTML/CSS ํŽธ์ง‘์ด ๊ฐ€๋Šฅํ•œ ์Šคํ‚จ ํŽธ์ง‘๊ธฐ๋ฅผ ์—ฝ๋‹ˆ๋‹ค.

(2) CSS ๋ณ€์ˆ˜ ์ถ”๊ฐ€ํ•˜๊ธฐ

/* ๊ธฐ๋ณธ(๋ผ์ดํŠธ) ๋ชจ๋“œ */
body {
  background-color: #ffffff;
  color: #000000;
}

/* ๋‹คํฌ๋ชจ๋“œ */
body.dark-mode {
  background-color: #121212;
  color: #e0e0e0;
}

/* ์ถ”๊ฐ€ ์Šคํƒ€์ผ (์˜ˆ์‹œ) */
body.dark-mode a {
  color: #80cbc4; /* ๋งํฌ ์ƒ‰์ƒ */
}

body.dark-mode header, 
body.dark-mode footer {
  background-color: #1f1f1f;
}

์ด๋ ‡๊ฒŒ CSS ๋ณ€์ˆ˜๋ฅผ ์ •์˜ํ•ด๋‘๋ฉด, ๋‹คํฌ๋ชจ๋“œ์ผ ๋•Œ ์ž๋™์œผ๋กœ ์ƒ‰์ƒ์ด ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

 

*์ฃผ์˜ํ•  ์  : ๋‹ค๋ฅธ ์Šคํ‚จ์ผ ๊ฒฝ์šฐ html ๊ตฌ์กฐ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ œ๋Œ€๋กœ ์„ค์ •์ด ๋˜์ง€์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

(3)ํ† ๊ธ€ ๋ฒ„ํŠผ ์ถ”๊ฐ€ํ•˜๊ธฐ

์Šคํ‚จHTML์— ๋ฒ„ํŠผ ํ•˜๋‚˜๋ฅผ ๋„ฃ์Šต๋‹ˆ๋‹ค. ์œ„์น˜๋Š” ์ž์œ ๋กญ์ง€๋งŒ ์ €๋Š” header์— ๋ฒ„ํŠผ๋ฉ”๋‰ด ์˜†์— ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

<button id="themeToggle">๐ŸŒ™ ๋‹คํฌ๋ชจ๋“œ</button>

 

(4) ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ํ…Œ๋งˆ ์ „ํ™˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€

(function() {
    const body = document.body;
    const toggleBtn = document.getElementById("themeToggle");

    const savedTheme = localStorage.getItem("theme");
    if (savedTheme === "dark") {
        body.classList.add("dark-mode");
        if (toggleBtn) toggleBtn.textContent = "โ˜€๏ธ";
    }

    if (toggleBtn) {
        toggleBtn.addEventListener("click", function() {
            body.classList.toggle("dark-mode");

            if (body.classList.contains("dark-mode")) {
                localStorage.setItem("theme", "dark");
                this.textContent = "โ˜€๏ธ";
            } else {
                localStorage.setItem("theme", "light");
                this.textContent = "๐ŸŒ™";
            }
        });
    }
})();

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ผ์ดํŠธ/๋‹คํฌ ๋ชจ๋“œ๊ฐ€ ์ „ํ™˜๋˜๊ณ , ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— ์ €์žฅ๋˜์–ด ์žฌ์ ‘์† ์‹œ์—๋„ ๋ชจ๋“œ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ ๊ธฐ๋Šฅ

์œ„์—์„œ๋Š” ํ† ๊ธ€ ๋ฒ„ํŠผ์œผ๋กœ ๋‹คํฌ๋ชจ๋“œ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ค˜๋Š”๋ฐ

CSS๋งŒ์œผ๋กœ๋„ ๋ธŒ๋ผ์šฐ์ €/OS ๋‹คํฌ๋ชจ๋“œ ์„ค์ •์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•ด์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

/* ๋ผ์ดํŠธ ๋ชจ๋“œ ๊ธฐ๋ณธ */
body {
  background-color: #ffffff;
  color: #000000;
}

/* ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹คํฌ๋ชจ๋“œ์ผ ๊ฒฝ์šฐ */
@media (prefers-color-scheme: dark) {
  body {
    background-color: #121212;
    color: #e0e0e0;
  }
}

์ด๋ ‡๊ฒŒ ์ž‘์„ฑํ•ด๋‘๋ฉด,

  • ์‚ฌ์šฉ์ž๊ฐ€ ๋ผ์ดํŠธ ๋ชจ๋“œ ๋ธŒ๋ผ์šฐ์ € → ํฐ์ƒ‰ ๋ฐฐ๊ฒฝ ์ ์šฉ
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋‹คํฌ ๋ชจ๋“œ ๋ธŒ๋ผ์šฐ์ € → ๊ฒ€์ •์ƒ‰ ๋ฐฐ๊ฒฝ ์ ์šฉ

์ž๋™์œผ๋กœ ํ…Œ๋งˆ๊ฐ€ ์ „ํ™˜๋ฉ๋‹ˆ๋‹ค.

 

ํ† ๊ธ€ ๊ธฐ๋Šฅ + ์ž๋™ ๊ฐ์ง€ ํ˜ผํ•ฉํ•˜๊ธฐ

๋งŒ์•ฝ ์ž๋™ ๊ฐ์ง€๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋‹คํฌ๋ชจ๋“œ๋ฅผ ์ผœ๊ฑฐ๋‚˜ ๋Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด
์•„๋ž˜์ฒ˜๋Ÿผ localStorage + matchMedia๋ฅผ ๊ฐ™์ด ์“ฐ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

(function() {
  const body = document.body;
  const toggleBtn = document.getElementById("darkModeToggle");

  // ์ €์žฅ๋œ ํ…Œ๋งˆ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
  let savedTheme = localStorage.getItem("theme");

  // ์ €์žฅ๋œ ํ…Œ๋งˆ๊ฐ€ ์—†์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ์„ค์ • ๋”ฐ๋ผ๊ฐ€๊ธฐ
  if (!savedTheme) {
    if (window.matchMedia("(prefers-color-scheme: dark)").matches) {
      savedTheme = "dark";
    } else {
      savedTheme = "light";
    }
  }

  // ํ…Œ๋งˆ ์ ์šฉ ํ•จ์ˆ˜
  function applyTheme(theme) {
    if (theme === "dark") {
      body.classList.add("dark-mode");
      if (toggleBtn) toggleBtn.textContent = "โ˜€๏ธ";
    } else {
      body.classList.remove("dark-mode");
      if (toggleBtn) toggleBtn.textContent = "๐ŸŒ™";
    }
  }

  // ์ดˆ๊ธฐ ์ ์šฉ
  applyTheme(savedTheme);

  // ํ† ๊ธ€ ์ด๋ฒคํŠธ
  if (toggleBtn) {
    toggleBtn.addEventListener("click", function() {
      const newTheme = body.classList.contains("dark-mode") ? "light" : "dark";
      applyTheme(newTheme);
      localStorage.setItem("theme", newTheme);
    });
  }
})();

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:

์ฒ˜์Œ ์ ‘์† → ๋ธŒ๋ผ์šฐ์ € ๋ชจ๋“œ๋ฅผ ๋”ฐ๋ผ๊ฐ

๋ฒ„ํŠผ์œผ๋กœ ์ „ํ™˜ → ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๋ชจ๋“œ๊ฐ€ ์ €์žฅ๋จ

๋‹ค์Œ ์ ‘์† ์‹œ → ์ €์žฅ๋œ ๋ชจ๋“œ๊ฐ€ ์šฐ์„  ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

 
๋ฐ˜์‘ํ˜•