개발자

로컬 스토리지에 저장한 값이 CSS 에 제대로 적용되지 않는 문제가 있습니다

2023년 04월 18일조회 320

로컬 스토리지에 'nightMode'라는 키로 true/false 값을 사용하여 야간 모드를 구현하려고 합니다. 그런데 문제는 로컬 스토리지에서 'nightMode' 값이 false로 설정되어 있을 때 페이지를 새로 고침하면, CSS 스타일이 야간 모드로 표시됩니다. false로 설정된 경우에는 야간 모드가 적용되지 않은 CSS 스타일로 페이지가 표시되어야 하는데 말이죠..... 토글 버튼을 클릭하여 야간 모드와 주간 모드를 전환하는 건 정상적으로 작동합니다. 하지만 로컬 스토리지의 'nightMode' 값이 false로 설정된 상태에서 페이지를 새로 고침하면, 로컬 스토리지에는 'nightMode' 값이 false임에도 불구하고, 페이지 CSS는 야간 모드로 표시됩니다. 뭐가 문제일까요?

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.
profile picture
익명님의 질문

답변 3

진성주님의 프로필 사진

음 로컬스토리지 달라지는것에 따라 css를 어떻게 적용하시는걸까요?

권민수님의 프로필 사진

제 추측으로는 로컬 스토리지에서 값을 불러온 뒤에, 별도의 파싱 과정을 거치지 않고 사용하고 있는게 아닐까 생각됩니다. 로컬 스토리지에 저장되는 값은 모두 문자열로 저장되기 때문에, getItem으로 받아오신 뒤 값을 다시 한 번 확인하셔야될 것 같아요(`false`라는 문자열은 Boolean으로 변환 된 경우 true로 계산됩니다). 당장 개발자 콘솔에서 아래 코드를 실행해보시면 무슨 말인지 아실 것 같습니다! 로컬 스토리지에서 값을 받아온 뒤, `true`/`false` 문자열과 비교 연산을 하거나, JSON.parse를 이용해서 한번 파싱을 하신 뒤 사용하셔야 할 것 같아요. 참고 - https://developer.mozilla.org/ko/docs/Web/API/Window/localStorage > 키와 값은 항상 각 문자에 2바이트를 할당하는 UTF-16 DOMString의 형태로 저장합니다. 객체와 마찬가지로 정수 키는 자동으로 문자열로 변환합니다.

1
2
3
4
5
6
7
8
9
window.localStorage.setItem('nightMode', false)
var localStorageValue = window.localStorage.getItem('nightMode')

console.log(localStorageValue); // false
console.log(typeof localStorageValue); // string
console.log(Boolean(localStorageValue)); // true

console.log(localStorageValue === 'true') // false
console.log(JSON.parse(localStorageValue)) // false
커리어리 AI 봇님의 프로필 사진

문제가 발생하는 원인은 페이지가 처음 로딩될 때 로컬 스토리지의 'nightMode' 값이 CSS에 제대로 반영되지 않기 때문입니다. 페이지 로딩 시점에 로컬 스토리지의 값을 확인하고 해당 값을 CSS에 반영해야 합니다. 예를 들어, JavaScript를 사용하여 로컬 스토리지의 'nightMode' 값을 확인하고 페이지에 야간 모드를 적용할 수 있습니다. 다음과 같이 코드를 작성해 보세요: 이렇게 구현하면 페이지가 처음 로딩될 때 로컬 스토리지의 'nightMode' 값을 확인하여 야간 모드가 적용된 CSS 스타일로 페이지가 표시되거나, 야간 모드가 적용되지 않은 CSS 스타일로 페이지가 표시되도록 할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 페이지 로딩 시 로컬 스토리지의 값을 확인하고 야간 모드를 적용/해제하는 함수
function applyNightMode() {
  const nightMode = localStorage.getItem('nightMode');
  const body = document.body;

  if (nightMode === 'true') {
    body.classList.add('night-mode'); // 야간 모드를 적용할 클래스 이름을 설정하세요
  } else {
    body.classList.remove('night-mode');
  }
}

// 페이지 로딩 시 함수 호출
window.addEventListener('DOMContentLoaded', applyNightMode);

// 토글 버튼 클릭 시 야간 모드와 주간 모드를 전환하는 함수
function toggleNightMode() {
  const nightMode = localStorage.getItem('nightMode') === 'true';
  localStorage.setItem('nightMode', !nightMode);
  applyNightMode();
}

// 토글 버튼에 클릭 이벤트 리스너 등록
document.getElementById('toggleButton').addEventListener('click', toggleNightMode);

커리어리 AI 봇의 답변을 평가해 주세요!

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!