명암 선호

Prefers Contrast

OS의 대비 높이기 설정을 감지해 테두리·텍스트 대비를 자동으로 끌어올리는 CSS 미디어 쿼리.

다른 이름: prefers-contrast: more
···
html
<div class="stage">
  <div class="card" id="card">
    <div class="badge" id="badge">no-preference</div>
    <div class="ln"></div>
    <div class="ln short"></div>
  </div>
</div>
css
.stage{width:70%;height:80%;display:grid;place-items:center}
.card{width:100%;height:100%;border-radius:14px;border:1px solid var(--line);background:var(--surface);padding:12%;display:flex;flex-direction:column;gap:10%;transition:border-color .4s ease,border-width .4s ease}
.card.more{border-width:2.5px;border-color:var(--fg)}
.badge{align-self:flex-start;font:700 10px/1 ui-monospace,monospace;color:var(--muted);padding:5px 9px;border-radius:999px;border:1px solid var(--line);transition:color .4s ease,border-color .4s ease}
.card.more .badge{color:var(--fg);border-color:var(--fg)}
.ln{height:10px;border-radius:5px;background:var(--muted);opacity:.35;transition:opacity .4s ease,background .4s ease}
.card.more .ln{opacity:1;background:var(--fg)}
.short{width:60%}
js
const card = document.getElementById('card');
const badge = document.getElementById('badge');
function toggle() {
  const on = card.classList.toggle('more');
  badge.textContent = on ? 'prefers-contrast: more' : 'no-preference';
}
setInterval(toggle, 1800);

저시력 사용자는 macOS·Windows의 손쉬운 사용 설정에서 "대비 높이기"를 켜서 옅은 테두리, 흐린 회색 텍스트를 더 진하게 만들곤 합니다. `@media (prefers-contrast: more)`는 이 설정을 CSS에서 감지해, 평소엔 은은하게 디자인한 테두리·텍스트를 필요한 사용자에게만 더 뚜렷하게 바꿔줄 수 있습니다.

`prefers-contrast: less`(대비 낮추기)도 있지만 브라우저 지원이 더 제한적입니다. 이 미디어쿼리 자체는 WCAG의 성공 기준이 아니라 사용자 환경을 감지하는 CSS 기능이고, 1.4.3 Contrast (Minimum)처럼 애초에 충분한 대비를 지키는 것이 먼저이며 이건 그 위에 얹는 추가 개선입니다.

데모는 카드 하나가 `no-preference`(기본, 옅은 테두리)와 `more`(굵고 진한 테두리·텍스트)를 오가며 값이 바뀌는 모습을 보여줍니다.

언제 쓰나

디자인 토큰에 --line·--muted 색을 낮은 대비로 잡았다면, prefers-contrast: more에서 그 값만 진하게 오버라이드하는 걸 고려하세요. 처음부터 충분한 대비(4.5:1)를 지키는 게 우선입니다.