보색

Complementary colors

색상환에서 정반대(180°)에 있는 두 색. 가장 강한 대비를 만드는 배색입니다.

다른 이름: Complementary harmony반대색
···
html
<div class="wrap">
  <div class="wheel" id="wheel"><div class="marker" id="m0"></div><div class="marker" id="m1"></div></div>
  <div class="swatches" id="sws"></div>
</div>
css
.wrap{display:grid;grid-template-columns:auto 1fr;gap:clamp(14px,4vmin,28px);align-items:center;width:min(560px,94%)}
.wheel{position:relative;width:clamp(100px,32vmin,190px);height:clamp(100px,32vmin,190px);border-radius:50%;cursor:grab;touch-action:none;
  background:conic-gradient(hsl(0 80% 55%),hsl(60 80% 55%),hsl(120 80% 55%),hsl(180 80% 55%),hsl(240 80% 55%),hsl(300 80% 55%),hsl(360 80% 55%));
  box-shadow:0 0 0 1px var(--line),0 10px 26px rgba(0,0,0,.18)}
.marker{position:absolute;width:18%;height:18%;min-width:14px;min-height:14px;border-radius:50%;background:#fff;border:3px solid var(--fg);transform:translate(-50%,-50%);box-shadow:0 2px 6px rgba(0,0,0,.35)}
.swatches{display:grid;gap:8px}
.sw{height:clamp(26px,6.5vmin,38px);border-radius:8px;border:1px solid var(--line);display:flex;align-items:center;padding:0 10px;font:700 clamp(10px,2.6vmin,12px)/1 ui-monospace,monospace;color:#fff;text-shadow:0 1px 2px rgba(0,0,0,.4)}
js
const OFFSETS = [0, 180];
const wheel = document.getElementById('wheel');
const markers = OFFSETS.map((_, i) => document.getElementById('m' + i));
const sws = document.getElementById('sws');
sws.innerHTML = OFFSETS.map((_, i) => '<div class="sw" id="s' + i + '"></div>').join('');
const swatchEls = OFFSETS.map((_, i) => document.getElementById('s' + i));

let base = 200, autoRotate = true;
function place(hue, el, R) {
  const rad = hue * Math.PI / 180;
  el.style.left = (50 + R * Math.sin(rad)) + '%';
  el.style.top = (50 - R * Math.cos(rad)) + '%';
}
function render() {
  OFFSETS.forEach((off, i) => {
    const h = (base + off + 360) % 360;
    place(h, markers[i], 41);
    const c = 'hsl(' + h + ', 78%, 52%)';
    markers[i].style.background = c;
    swatchEls[i].style.background = c;
    swatchEls[i].textContent = Math.round(h) + '°';
  });
}
function angleFromEvent(e) {
  const r = wheel.getBoundingClientRect();
  const cx = r.left + r.width / 2, cy = r.top + r.height / 2;
  const deg = Math.atan2(e.clientX - cx, -(e.clientY - cy)) * 180 / Math.PI;
  return (deg + 360) % 360;
}
wheel.addEventListener('pointerdown', e => { autoRotate = false; wheel.setPointerCapture(e.pointerId); base = angleFromEvent(e); render(); });
wheel.addEventListener('pointermove', e => { if (e.buttons) { base = angleFromEvent(e); render(); } });

(function tick() {
  if (autoRotate) base = (base + 0.3) % 360;
  render();
  requestAnimationFrame(tick);
})();

색상값을 HSL로 두면 계산은 단순합니다 — 색상(H)에 180을 더하고 360으로 나눈 나머지를 취하면 보색입니다. 채도·명도는 그대로 두거나 살짝만 조절합니다.

대비가 가장 강해서 시선을 확실히 끌지만, 두 색을 같은 면적·같은 채도로 많이 쓰면 눈이 피로해집니다. 보통 한쪽을 넓은 배경(낮은 채도)으로, 다른 한쪽을 좁은 강조색(높은 채도)으로 씁니다.

스포츠 브랜드나 CTA 버튼처럼 "여기 보세요"를 말해야 하는 곳에 잘 맞습니다.

언제 쓰나

CTA 버튼처럼 딱 하나를 강조하고 싶을 때. 면적을 5:1 이상으로 비대칭하게 두세요.