자동 및 수동 어두운 모드 전환
기본적으로 시스템 설정을 따르고 사용자가 수동으로 재정의할 수 있는 테마 전환 기능을 만듭니다.
자동 및 수동 어두운 모드 전환은(는) CoddyKit의 무료 CSS Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 CSS Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. CSS Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
목표
이상적인 dark 모드 구현은 기본적으로 OS 설정을 자동으로 감지하고, 사용자가 이를 독립적으로 재정의할 수 있는 toggle 버튼을 제공하며, 페이지를 다시 로드해도 설정을 유지합니다.
구조 개요
처리해야 할 세 가지 states:
- system 설정: CSS 변수와 함께
prefers-color-scheme을 사용합니다 - 사용자 재정의: dark:
<html>에 클래스 또는 데이터 속성을 설정합니다 - 사용자 재정의: 밝은 모드: 자동 dark 모드를 방지하도록 다른 클래스를 설정합니다
CSS 토큰 설정
모든 states에 올바르게 상속되는 CSS 변수를 정의하세요:
<div class="demo" data-theme="dark">Dark token demo</div>
<div class="demo" data-theme="light">Light token demo</div>
JavaScript 토글 로직
저장된 설정을 읽고 적용한 뒤 toggle 시 업데이트하세요:
<div class="demo" id="theme-demo">Toggle my theme</div>
<div class="demo" data-theme="dark">Dark override example</div>
<button id="toggle-btn">Toggle Theme</button>
<script>
function toggleTheme() {
const current = document.getElementById('theme-demo').dataset.theme;
const system = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
if (!current) {
const next = system === 'dark' ? 'light' : 'dark';
document.getElementById('theme-demo').dataset.theme = next;
} else {
delete document.getElementById('theme-demo').dataset.theme;
}
}
document.getElementById('toggle-btn').addEventListener('click', toggleTheme);
</script>
세 가지 상태 toggle
더 정교한 세 가지 상태 toggle: 밝게 | system | dark:
<div class="demo" id="theme-demo">Cycles: light → system → dark</div>
<div class="demo" data-theme="dark">Dark state example</div>
<p id="state-label">system</p>
<button id="cycle-btn">Cycle Theme</button>
<script>
const states = ['light', 'system', 'dark'];
let current = 'system';
const demo = document.getElementById('theme-demo');
const label = document.getElementById('state-label');
document.getElementById('cycle-btn').addEventListener('click', () => {
current = states[(states.indexOf(current) + 1) % states.length];
label.textContent = current;
if (current === 'system') { delete demo.dataset.theme; } else { demo.dataset.theme = current; }
});
</script>
잘못된 테마가 깜박이는 현상 방지
페이지가 렌더링되기 전에 저장된 테마를 동기적으로 적용하세요:
<pre class="code-sample"><!-- In <head>, before any styles -->
<script>
const t = localStorage.getItem("theme");
if (t) document.documentElement.dataset.theme = t;
</script></pre>
toggle 버튼 접근성
toggle 버튼은 화면 낭독기에 현재 상태를 알려야 합니다. 전환할 때 접근 가능한 label을 업데이트하세요:
<button id="theme-toggle" aria-label="Switch to dark mode">🌙</button>
애니메이션 테마 전환
테마가 변경될 때 색상을 부드럽게 전환합니다:
<div class="demo" id="at-demo">Smooth theme transition</div>
<button onclick="document.documentElement.classList.add('theme-transitioning'); const d=document.getElementById('at-demo'); const dark = d.style.background==='rgb(17, 17, 17)'; d.style.background = dark ? '#fff' : '#111'; d.style.color = dark ? '#111' : '#fff'; setTimeout(()=>document.documentElement.classList.remove('theme-transitioning'),250);">Toggle</button>
system 변경 감지
페이지가 열려 있는 동안 사용자가 OS 설정을 변경하는 경우에도 반응하세요:
<p id="status">Listening for system theme changes…</p>
<script>
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', (e) => {
document.getElementById('status').textContent = 'System changed to ' + (e.matches ? 'dark' : 'light');
});
</script>
dark 모드 아이콘
각 모드에 맞는 아이콘으로 교체하세요. 테마를 인식하는 이미지에는 picture 요소를 사용하거나, CSS로 서로 다른 아이콘을 표시하거나 숨기세요:
<div>Light: <span class="icon-sun">☀️</span><span class="icon-moon">🌙</span></div>
<div data-theme="dark">Dark: <span class="icon-sun">☀️</span><span class="icon-moon">🌙</span></div>
요약: 구현 확인 목록
dark 모드 확인 목록:
- 모든 색상 토큰에 CSS 변수 사용
- 자동 감지를 위한 선호 색상 구성표 미디어 쿼리
- 수동 재정의를 위한 data-theme 속성
- 설정 유지를 위한 localStorage
- 화면 깜박임 방지를 위한 head 내부 인라인 스크립트
- 동적으로 변경되는 접근 가능한 aria-label을 사용하는 toggle 버튼
빠른 확인
페이지가 로드될 때 "잘못된 테마가 깜박이는 현상"을 방지하는 기법은 무엇인가요?
요약
완전한 dark 모드 toggle은 테마 토큰에 CSS 변수를 사용하고, 자동 감지에 prefers-color-scheme 쿼리를 사용하며, 수동 재정의에 data-theme 속성을 사용합니다. 또한 설정 유지를 위해 localStorage를 사용하고, 깜박임을 방지하기 위해 헤드에서 동기적으로 실행되는 스크립트를 사용합니다. 최상의 사용자 경험을 위해 접근 가능한 세 가지 상태 toggle(밝게/system/dark)을 제공하세요.
자주 묻는 질문
“자동 및 수동 어두운 모드 전환” 강의는 무료인가요?
네 — “자동 및 수동 어두운 모드 전환” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 CSS Academy 강의 전체를 잠금 해제할 수 있습니다. CSS Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“자동 및 수동 어두운 모드 전환”에서 뭘 배우나요?
기본적으로 시스템 설정을 따르고 사용자가 수동으로 재정의할 수 있는 테마 전환 기능을 만듭니다. 브라우저에서 직접 실행하는 실습 코드로 CSS Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
CSS Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 CSS Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.
“자동 및 수동 어두운 모드 전환” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 CSS Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 CSS Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- prefers-color-scheme 미디어 쿼리
- 테마 설정을 위한 CSS 변수
- color-scheme 속성
- 자동 및 수동 어두운 모드 전환