light-dark()

라이트/다크 모드용 색을 한 선언 안에 같이 적는 함수. `color-scheme`만 맞으면 브라우저가 알아서 고릅니다.

다른 이름: CSS color scheme function
···
html
<div class="wrap" id="scheme">
  <div class="badge" id="badge"><svg viewBox="0 0 10 10"><path id="bpath" d="M1.5 5.2l2.6 2.6L8.5 2.4" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"/></svg><span id="btext">확인 중</span></div>
  <div class="box" id="box">light-dark()</div>
</div>
css
.wrap{position:relative;width:100%;height:100%;display:grid;place-items:center;color-scheme:light dark}
.box{width:160px;height:70px;border-radius:12px;display:grid;place-items:center;font-size:12px;font-weight:700;
  background:light-dark(#f1f0fb,#1c1c2b);color:light-dark(#3d3dcf,#a7a6ff);border:1px solid light-dark(#dcdaf7,#33334a);transition:.4s}
.box.fallback.is-light{background:#f1f0fb;color:#3d3dcf;border-color:#dcdaf7}
.box.fallback.is-dark{background:#1c1c2b;color:#a7a6ff;border-color:#33334a}
.badge{position:absolute;top:10px;right:10px;display:flex;align-items:center;gap:5px;padding:4px 9px;border-radius:999px;font-size:10px;font-weight:700;background:var(--bg);border:1px solid var(--line);color:var(--accent-3);z-index:2}
.badge.no{color:var(--accent-2)}
.badge svg{width:9px;height:9px}
js
const ok = CSS.supports('color', 'light-dark(white, black)');
const b=document.getElementById('badge'),p=document.getElementById('bpath'),t=document.getElementById('btext');
b.classList.toggle('no', !ok);
p.setAttribute('d', ok ? 'M1.5 5.2l2.6 2.6L8.5 2.4' : 'M2 2l6 6M8 2l-6 6');
t.textContent = ok ? 'light-dark() 지원됨' : '미지원 · 이중정의 폴백';
const scheme = document.getElementById('scheme'), box = document.getElementById('box');
if (!ok) box.classList.add('fallback');
let dark = false;
setInterval(() => {
  dark = !dark;
  scheme.style.colorScheme = dark ? 'dark' : 'light';
  box.classList.toggle('is-dark', dark);
  box.classList.toggle('is-light', !dark);
}, 1600);

다크 모드를 지원하려면 보통 라이트용 커스텀 프로퍼티 세트를 `:root`에, 다크용을 `:root.dark`나 `@media (prefers-color-scheme: dark)`에 각각 정의하고, 값을 쓸 때는 `var(--bg)` 하나로 참조하는 간접 구조를 만들어야 했습니다. 토큰이 많아지면 이 이중 정의가 꽤 번거로워집니다.

`light-dark(#fff, #111)`은 그 자리에서 바로 "라이트일 땐 이 값, 다크일 땐 저 값"을 적습니다. 단, 요소(또는 조상)에 `color-scheme: light dark`가 선언돼 있어야 브라우저가 어느 값을 쓸지 압니다 — 이 선언이 빠지면 항상 첫 번째(라이트) 값만 씁니다.

기본 지원은 caniuse/MDN baseline을 확인하세요. 미지원 브라우저에서는 지금까지 해오던 대로 `:root`/`.dark` 커스텀 프로퍼티 이중 정의가 대안입니다.

언제 쓰나

다크 모드 색 토큰을 선언 하나로 줄이고 싶을 때. 토큰이 적은 컴포넌트 라이브러리에 특히 잘 맞습니다.