난색과 한색

Warm and cool colors

빨강·주황·노랑처럼 불과 태양을 떠올리는 난색, 파랑·초록·보라처럼 물과 그늘을 떠올리는 한색. 색상(hue)만으로 나뉘는 감각입니다.

다른 이름: Warm/cool따뜻한 색 차가운 색
···
html
<div class="wrap">
  <div class="big" id="big"></div>
  <div class="label" id="lbl">Warm</div>
  <div class="strip" id="strip"><i id="dot"></i></div>
</div>
css
.wrap{width:min(460px,92%)}
.strip{position:relative;height:clamp(12px,3.4vmin,16px);border-radius:8px;border:1px solid var(--line);cursor:pointer;touch-action:none;
  background:linear-gradient(90deg,hsl(0,75%,55%),hsl(60,75%,55%),hsl(120,75%,55%),hsl(180,75%,55%),hsl(240,75%,55%),hsl(300,75%,55%),hsl(360,75%,55%))}
.big{width:clamp(80px,24vmin,140px);height:clamp(80px,24vmin,140px);border-radius:50%;margin:0 auto clamp(10px,2.6vmin,16px);box-shadow:0 10px 26px rgba(0,0,0,.18)}
.label{text-align:center;font:800 clamp(15px,4.4vmin,22px)/1 system-ui;margin-bottom:clamp(10px,2.6vmin,16px);letter-spacing:-.01em}
#dot{position:absolute;top:50%;width:16px;height:16px;margin:-8px 0 0 -8px;border-radius:50%;background:#fff;border:2px solid var(--fg);box-shadow:0 1px 3px rgba(0,0,0,.35);pointer-events:none}
js
let hue = 20, autoRotate = true;
const big = document.getElementById('big'), lbl = document.getElementById('lbl'), strip = document.getElementById('strip'), dot = document.getElementById('dot');

function classify(h) {
  if (h < 60 || h > 330) return { ko: '따뜻한 색', en: 'Warm', color: '#ef4444' };
  if (h > 150 && h < 270) return { ko: '차가운 색', en: 'Cool', color: '#3b82f6' };
  return { ko: '중간색', en: 'Neutral', color: '#a3a3a3' };
}
function render() {
  big.style.background = 'hsl(' + hue + ', 75%, 55%)';
  dot.style.left = (hue / 360 * 100) + '%';
  const c = classify(hue);
  lbl.textContent = c.en + ' · ' + c.ko;
  lbl.style.color = c.color;
}
function fromEvent(e) {
  const r = strip.getBoundingClientRect();
  hue = Math.min(1, Math.max(0, (e.clientX - r.left) / r.width)) * 360;
  render();
}
strip.addEventListener('pointerdown', e => { autoRotate = false; strip.setPointerCapture(e.pointerId); fromEvent(e); });
strip.addEventListener('pointermove', e => { if (e.buttons) fromEvent(e); });

(function tick() {
  if (autoRotate) hue = (hue + 0.4) % 360;
  render();
  requestAnimationFrame(tick);
})();

색상환에서 대략 빨강~노랑 쪽(0~60°와 330~360°)은 난색, 초록~보라 쪽(150~270°)은 한색으로 느껴집니다. 그 사이(황록색, 자홍색 부근)는 어느 쪽으로도 잘 안 읽히는 중간 지대입니다.

같은 파랑이라도 살짝 보라 쪽으로 기울면 더 따뜻하게, 초록 쪽으로 기울면 더 차갑게 느껴지는 식으로 "상대적인" 감각이라는 점이 중요합니다. 그래서 한 화면 안에서도 난색 계열 안의 위계, 한색 계열 안의 위계를 따로 만들 수 있습니다.

난색은 앞으로 튀어나와 보이고 시선을 먼저 끌어서 CTA·경고에, 한색은 물러나 보여서 배경·차분한 정보 영역에 잘 맞습니다.

언제 쓰나

앞에 둘 요소와 뒤로 물릴 요소를 색만으로 구분하고 싶을 때.