처음에는 span 안에 아이콘을 넣는 방식으로 했으나 다크/라이트 모드 2가지가 필요해서 input-checkbox로 바꾸고 해당 상태에 따라 변경되도록 수정
input은 id로 label과 연결시킨 다음 css에서 input은 display : none 으로 보이지 않게 함
css 변수 사용으로 모드에 따라 요소마다 다른 색상 적용
:root[color-theme='dark'] {
--background: #000;
--card-bg: #fff;
--font-color: #fff;
--btn-color: #727272;
--tag-border: #fff;
}
:root[color-theme='light'] {
--black: #fff;
--card-bg: #d4d4d4;
--white: #000;
--btn-color: #fff;
}
darkModeBtn.addEventListener('click', (e) => {
if (e.target.checked) {
localStorage.setItem('color-theme', 'dark');
document.documentElement.setAttribute('color-theme', 'dark');
} else {
localStorage.setItem('color-theme', 'light');
document.documentElement.setAttribute('color-theme', 'light');
}
});
```
이를 해결하기 위해 localStorage 에 저장
클릭시 바뀌는 체크 상태에 따라 localStroage에 알맞은 모드를 저장
처음 페이지가 로드 되었을 때 localStorage에 저장된 값(=모드)이 있다면 해당 모드로 사용, 없다면 기본 값은 라이트모드로 설정
let localStorageValue = localStorage.getItem('color-theme');
window.onload = function () {
if (localStorageValue) {
document.documentElement.setAttribute(
'color-theme',
`${localStorageValue}`
);
} else {
localStorage.setItem('color-theme', 'light');
}
};
window.onload = function () {
document.documentElement.setAttribute('color-theme', 'light');
if (localStorageValue) {
document.documentElement.setAttribute(
'color-theme',
`${localStorageValue}`
);
}
};
(window.matchMedia('(prefers-color-scheme: dark)').matches ? 를 사용하는 다른 방법이 있는 것 같지만 아직은 이해가 안돼서 이렇게 해결)