color-mix()

두 색을 CSS 안에서 직접 섞는 함수. Sass의 `mix()`나 JS 색상 라이브러리 없이 톤 변형을 만듭니다.

다른 이름: CSS color mixing
···
html
<div class="wrap">
  <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="row" id="row">
    <div class="sw" style="--p:90%"></div><div class="sw" style="--p:70%"></div><div class="sw" style="--p:50%"></div>
    <div class="sw" style="--p:30%"></div><div class="sw" style="--p:10%"></div>
  </div>
</div>
css
.wrap{position:relative;width:min(320px,92%)}
.row{display:flex;gap:8px}
.sw{flex:1;height:52px;border-radius:8px;background:color-mix(in oklch, var(--accent) var(--p), white)}
.row.fallback .sw:nth-child(1){background:#c7c6fb}.row.fallback .sw:nth-child(2){background:#9d9cf9}
.row.fallback .sw:nth-child(3){background:#7373f8}.row.fallback .sw:nth-child(4){background:#4a49e0}.row.fallback .sw:nth-child(5){background:#2f2ea8}
.badge{position:absolute;top:-30px;right:0;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)}
.badge.no{color:var(--accent-2)}
.badge svg{width:9px;height:9px}
js
const ok = CSS.supports('color', 'color-mix(in oklch, red 50%, blue)');
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 ? 'color-mix() 지원됨' : '미지원 · 정적 팔레트 폴백';
if (!ok) document.getElementById('row').classList.add('fallback');

브랜드 색 하나로 밝은 배경, 어두운 텍스트, 반투명 보더 같은 파생 색을 만드는 건 전처리기(Sass `mix()`, `lighten()`)나 JS 색상 계산 라이브러리의 오래된 일이었습니다. 순수 CSS에는 "이 색과 저 색을 7:3으로 섞어라" 같은 연산이 없었기 때문입니다.

`color-mix(in oklch, var(--accent) 70%, white)`처럼 색 공간과 비율을 지정하면 브라우저가 직접 섞습니다. `in oklch`나 `in srgb` 같은 보간 공간을 고르는 게 핵심인데, oklch/oklab은 사람 눈에 고르게 밝기가 변해서 sRGB로 섞을 때 생기는 탁한 중간톤을 피할 수 있습니다. 커스텀 프로퍼티와 함께 쓰면 디자인 토큰 하나로 hover·disabled 톤을 전부 계산해 낼 수 있습니다.

기본 지원은 caniuse/MDN baseline을 확인하세요. 미지원 브라우저에서는 전처리기에서 미리 계산한 정적 색상값(또는 JS로 계산한 값)을 커스텀 프로퍼티에 직접 넣는 것이 대안입니다.

언제 쓰나

hover·disabled·틴트 배경처럼 브랜드 색 하나에서 파생 톤을 여러 개 뽑아낼 때.