컬러 스킴 생성기

Color scheme generator

기준 색상 하나와 배색 규칙(보색·유사색·삼각 등)을 무작위로 골라 조화로운 팔레트를 매번 새로 계산해 내는 도구의 원리.

다른 이름: Palette generator팔레트 생성기
···
html
<div class="wrap">
  <div class="head"><b>Generate</b><span class="tag" id="tag">Complementary</span></div>
  <div class="sws" id="sws"></div>
</div>
css
.wrap{width:min(480px,92%);display:grid;gap:clamp(8px,2.2vmin,14px)}
.head{display:flex;justify-content:space-between;align-items:center}
.head b{font:800 clamp(12px,3vmin,15px)/1 system-ui}
.tag{font:700 clamp(9px,2.4vmin,11px)/1 ui-monospace,monospace;padding:4px 10px;border-radius:999px;border:1px solid var(--line);color:var(--fg);background:var(--surface)}
.sws{display:grid;grid-template-columns:repeat(5,1fr);gap:6px}
.sws div{display:grid;gap:4px;justify-items:center}
.sws i{display:block;width:100%;aspect-ratio:1;border-radius:9px;border:1px solid var(--line)}
.sws b{font:700 clamp(7px,1.8vmin,9px)/1 ui-monospace,monospace;color:var(--muted)}
js
function hslToHex(h, s, l) {
  s /= 100; l /= 100;
  var k = function (n) { return (n + h / 30) % 12; };
  var a = s * Math.min(l, 1 - l);
  var f = function (n) { return l - a * Math.max(-1, Math.min(k(n) - 3, Math.min(9 - k(n), 1))); };
  var hex = function (x) { return Math.round(x * 255).toString(16).padStart(2, '0'); };
  return '#' + hex(f(0)) + hex(f(8)) + hex(f(4));
}
var RULES = [
  { name: 'Complementary', offsets: [0, 180, 0, 180, 90] },
  { name: 'Analogous', offsets: [-40, -20, 0, 20, 40] },
  { name: 'Triadic', offsets: [0, 120, 240, 60, 180] },
  { name: 'Split-Comp', offsets: [0, 150, 210, 75, 285] },
];
var sws = document.getElementById('sws'), tag = document.getElementById('tag');
sws.innerHTML = [0, 1, 2, 3, 4].map(function (i) { return '<div><i id="c' + i + '"></i><b id="t' + i + '"></b></div>'; }).join('');
var cells = [0, 1, 2, 3, 4].map(function (i) { return document.getElementById('c' + i); });
var labels = [0, 1, 2, 3, 4].map(function (i) { return document.getElementById('t' + i); });
function generate() {
  var rule = RULES[Math.floor(Math.random() * RULES.length)];
  var base = Math.floor(Math.random() * 360);
  var s = 62 + Math.random() * 20, l = 48 + Math.random() * 12;
  tag.textContent = rule.name;
  rule.offsets.forEach(function (off, i) {
    var h = (base + off + 360) % 360;
    var hex = hslToHex(h, s, Math.max(20, l - i * 3));
    cells[i].style.background = hex;
    labels[i].textContent = hex;
  });
}
generate();
setInterval(generate, 2600);

팔레트 생성기는 대부분 색을 완전히 무작위로 고르지 않습니다. 무작위 색상 다섯 개를 그냥 뽑으면 서로 안 어울릴 확률이 높기 때문에, 먼저 배색 규칙(보색 180°, 유사색 ±30°, 삼각 120°, 분할보색 150°/210° 등)을 무작위로 고른 뒤, 그 규칙이 정해둔 "각도"만 무작위 기준색에 적용해서 색을 뽑습니다.

즉 무작위성은 기준 색상(H)과 어떤 규칙을 쓸지 두 곳에만 있고, 색 사이의 관계(각도)는 항상 색상 이론이 검증한 값으로 고정됩니다 — 이래서 매번 다른 팔레트가 나오면서도 "그럴듯하게 어울리는" 느낌이 유지됩니다.

실제 서비스들은 여기에 채도·명도 변주, 낱개 잠금(lock) 기능, 접근성 체크까지 더하지만, 핵심 알고리즘은 이 두 단계 — 규칙 선택 + 각도 적용 — 로 요약됩니다.

언제 쓰나

팔레트를 처음부터 대량으로 뽑아 감을 잡을 때 씁니다. 최종 선택은 대비·의미(시맨틱 컬러)까지 사람이 검토해야 합니다.