const theme = localStorage.getItem('theme');
// console.log(theme); // ํ์ฌ theme๋ฅผ ์ ์ ์์. // dark || light
if(theme) {
document.documentElement.SetAttribute('data-theme', theme);
}
localStorage ::
Storage ๊ฐ์ฒด๋ ๋จ์ํ key-value ์ ์ฅ์์ด๋ฉฐ, ์ด๋ ๊ฐ์ฒด์ ๋น์ทํ๋ค.
์ด ๋ฐ์ดํฐ๋ค์ ํ์ด์ง ๋ก๋ฉ์๋ ์จ์ ํ๊ฒ ์ ์ง๋๋ค. (๋ค์ ์นํ์ด์ง์ ์ ์ ํ ๋ ๋ง์ง๋ง ์ค์ ์ ๋ถ๋ฌ์ฌ ์ ์๋ค.)
getItem(key)
:: ํค์ ํด๋นํ๋ ๊ฐ์ ๋ฐ์์จ๋ค.
setItem(key, value)
:: ํค, ๊ฐ์ ๋ณด๊ดํ๋ค.
document.documentElement
===<HTML>
setAttribute(์์ฑ์ด๋ฆ, ์์ฑ๊ฐ)
:: ์ ํํ ์์(element)์ ์์ฑ(attribute)๊ฐ์ ์ ํ๋ค.
// ์์คํ
์ค์ ํ์ธ window.matchMedia() :: CSS์ ๋ฏธ๋์ด์ฟผ๋ฆฌ๊ฐ ํ์ฌ ํ์ด์ง์ ํด๋นํ๋์ง ํ์ธ.
const currentTheme = localStorage.getItem('theme') ||
(window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
currentTheme ์์์์
localStorage
๊ฐ 'theme'
๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๊ฑฐ๋ window.matchMedia(...)
๊ฐ 'dark'
์ผ ๋,
๋ ์ค ํ๋๊ฐ true์ด๋ฉด 'dark'
, false์ด๋ฉด 'light'
์ด๋ค.
window.matchMedia(medaiQueryString)
:: ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ด์ฉํด์ ์ ์ํ๋ ์น ๋ธ๋ผ์ฐ์ ์ ํฌ๊ธฐ๋ฅผ ์ ์ ์๋ค.
์์ฑ
media
:: mediaQueryString์ ๋ฐํ.matches
:: ๋ฒ์์ ๋ง๋์ง ๊ฒ์ฌ. true false ๋ฐํ.
// ์์ ์ด์ด์..
const newTheme = currentTheme === 'dark' ? 'light' : 'dark';
console.log(currentTheme); // (1)
document.documentElement.setAttribute('data-theme', newTheme);
locaStorage.setItem('theme', newTheme);
console.log(newTheme, currentTheme); // (2)
(1) dark ์ผ ๋, (2) light dark
currentTheme
๋ ํ์ฌ ์๋ก๊ณ ์นจํ ํ ํ
๋ง์ด๋ฉฐ, ๊ณผ๊ฑฐ์ ํ
๋ง์ด๋ค.
newTheme
๋ ์ง๊ธ ๋น์ฅ์ ํ
๋ง๋ฅผ ๋ํ๋ธ๋ค.