λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🐣codeLab

darkmode λ§Œλ“€μ–΄λ³΄κΈ°

λ°˜μ‘ν˜•
const theme = localStorage.getItem('theme');
// console.log(theme); // ν˜„μž¬ themeλ₯Ό μ•Œ 수 있음. // dark || light
if(theme) {
    document.documentElement.SetAttribute('data-theme', theme);
}

localStorage ::

Storage κ°μ²΄λŠ” λ‹¨μˆœν•œ key-value μ €μž₯μ†Œμ΄λ©°, μ΄λŠ” 객체와 λΉ„μŠ·ν•˜λ‹€.

이 데이터듀은 νŽ˜μ΄μ§€ λ‘œλ”©μ—λ„ μ˜¨μ „ν•˜κ²Œ μœ μ§€λœλ‹€. (λ‹€μ‹œ μ›ΉνŽ˜μ΄μ§€μ— 접속 ν•  λ•Œ λ§ˆμ§€λ§‰ 섀정을 뢈러올 수 μžˆλ‹€.)

localStorage

getItem(key) :: 킀에 ν•΄λ‹Ήν•˜λŠ” 값을 λ°›μ•„μ˜¨λ‹€.

setItem(key, value) :: ν‚€, 값을 λ³΄κ΄€ν•œλ‹€.

getItem, setItem

document.documentElement === <HTML>

setAttribute(속성이름, 속성값) :: μ„ νƒν•œ μš”μ†Œ(element)의 속성(attribute)값을 μ •ν•œλ‹€.

document.documentElement

setAttribute

 

// μ‹œμŠ€ν…œμ„€μ •ν™•μΈ 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λŠ” μ§€κΈˆ λ‹Ήμž₯의 ν…Œλ§ˆλ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

 

λ°˜μ‘ν˜•