피드로 돌아가기
Dev.toFrontend
원문 읽기
Head 내 Inline Script와 CSS Variables를 통한 Theme Flash 제로 구현
A practical CSS variable setup for light/dark mode without theme flash
AI 요약
Context
브라우저의 HTML/CSS 파싱 속도가 JavaScript 실행 속도보다 빨라 발생하는 Theme Flash 현상 분석. localStorage 기반의 테마 설정이 렌더링 이후에 적용되어 사용자 경험을 저해하는 구조적 한계 존재.
Technical Solution
- CSS Variables 기반의 Semantic Token 설계로 컴포넌트 수준의 테마 의존성 제거
- HTML root 요소에 data-theme 속성을 부여하여 CSS 선택자 기반의 스타일 오버라이드 구조 구축
- prefers-color-scheme와 :not([data-theme="light"]) 선택자를 조합하여 OS 설정 기반의 Fallback 메커니즘 구현
- 브라우저의 Top-down 파싱 특성을 이용해 상단에 즉시 실행 함수(IIFE) 형태의 Inline Script 배치
- DOMContentLoaded 대기 없이 실행되는 스크립트로 First Paint 전 data-theme 속성을 확정하여 시각적 깜빡임 원천 차단
실천 포인트
1. 테마 결정 로직을 외부 JS 파일이 아닌 <head> 내 Inline Script로 구현했는가
2. CSS Variables를 사용하여 컴포넌트가 현재 테마 상태를 직접 참조하지 않도록 설계했는가
3. OS 기본 설정(prefers-color-scheme)과 사용자 명시적 설정을 구분하는 우선순위 로직이 반영되었는가
4. 디자인 토큰의 유지보수 효율을 위해 설정 객체 기반의 CSS 생성 자동화 로직을 검토했는가