강제 색상 모드

Forced Colors

Windows 고대비 모드처럼 OS가 시스템 팔레트를 강제로 씌울 때, 배경 이미지·커스텀 색이 사라질 수 있다는 것을 대비하는 CSS 기능.

다른 이름: Windows High Contrast Modeforced-colors
···
html
<div class="stage">
  <div class="card" id="card">
    <div class="ico" id="ico"></div>
    <div class="ln"></div>
    <div class="ln short"></div>
    <div class="badge" id="badge">default</div>
  </div>
</div>
css
.stage{width:64%;height:82%;display:grid;place-items:center}
.card{width:100%;height:100%;border-radius:14px;border:1px solid var(--line);background:var(--surface);padding:10%;display:flex;flex-direction:column;gap:10%;transition:background .4s ease,border-color .4s ease}
.card.forced{background:#000;border:2px solid #fff}
.ico{width:26%;height:26%;border-radius:8px;background:linear-gradient(135deg,var(--accent),var(--accent-2));transition:opacity .4s ease,background .4s ease,border-color .4s ease;border:2px solid transparent}
.card.forced .ico{background:transparent;border-color:#ff0}
.ln{height:10px;border-radius:5px;background:var(--muted);opacity:.3;transition:background .4s ease,opacity .4s ease}
.card.forced .ln{background:#fff;opacity:1}
.short{width:55%}
.badge{margin-top:auto;font:700 10px/1 ui-monospace,monospace;color:var(--muted)}
.card.forced .badge{color:#0ff}
js
const card = document.getElementById('card');
const badge = document.getElementById('badge');
function toggle() {
  const on = card.classList.toggle('forced');
  badge.textContent = on ? 'forced-colors: active' : 'default';
}
setInterval(toggle, 1900);

Windows 고대비 모드를 켜면 브라우저는 대부분의 커스텀 색상·그림자·배경 이미지를 무시하고, 사용자가 OS에서 고른 소수의 시스템 색(Canvas, CanvasText, LinkText, ButtonFace, Highlight 등)만으로 페이지를 다시 그립니다. `@media (forced-colors: active)`로 이 상태를 감지할 수 있고, 시스템 색 키워드를 CSS에서 직접 쓸 수도 있습니다.

문제는 `background-image`나 `border: none` + `background-color`로만 경계를 표현한 요소입니다 — 강제 색상 모드에서 배경이 통째로 지워지면 카드·버튼의 경계가 아예 안 보이게 됩니다. `forced-color-adjust: none`으로 특정 요소를 이 강제 적용에서 제외할 수 있지만, 신중하게 최소한으로 써야 합니다 — 고대비 모드를 켠 이유 자체를 해치지 않도록요.

데모는 카드 하나가 일반 팔레트와 강제 색상 시뮬레이션 팔레트를 오가는 모습을 보여줍니다. 배경 그라데이션 아이콘이 사라지고, 테두리가 시스템 색으로 강제 전환되는 부분에 주목하세요.

언제 쓰나

경계·강조를 배경색이나 그림자로만 표현하지 말고, 실제 border도 함께 그리세요. 고대비 모드에서도 살아남는지 확인하려면 개발자 도구에서 forced-colors: active를 강제로 켜볼 수 있습니다.