카드 소팅

Card sorting

콘텐츠 항목을 카드로 하나씩 써서 참가자가 직접 분류하게 하는, 사용자 머릿속 분류 체계를 캐내는 리서치 방법.

다른 이름: 카드 분류법
···
html
<div class="stage">
  <div class="pool" id="pool"></div>
  <div class="cols">
    <div class="col"><div class="colhd">Food</div><div class="drop" id="d1"></div></div>
    <div class="col"><div class="colhd">Travel</div><div class="drop" id="d2"></div></div>
    <div class="col"><div class="colhd">Tech</div><div class="drop" id="d3"></div></div>
  </div>
</div>
css
.stage{width:94%;height:88%;display:flex;flex-direction:column;gap:6px}
.pool{position:relative;height:30%;border:1px dashed var(--line);border-radius:8px}
.cols{flex:1;display:flex;gap:8px}
.col{flex:1;display:flex;flex-direction:column;gap:4px}
.colhd{font:700 10px/1 monospace;color:var(--muted);text-align:center}
.drop{flex:1;border:1px solid var(--line);border-radius:8px;position:relative;background:var(--surface)}
.card{position:absolute;width:38px;height:22px;border-radius:5px;background:var(--accent);color:#fff;
  font:700 9px/22px sans-serif;text-align:center;transition:left .6s ease,top .6s ease,background .6s}
.card.travel{background:var(--accent-2)}
.card.tech{background:var(--accent-3)}
js
const pool = document.getElementById('pool');
const items = [
  { t: 'Apple', cls: '', col: 'd1' },
  { t: 'Rice', cls: '', col: 'd1' },
  { t: 'Paris', cls: 'travel', col: 'd2' },
  { t: 'Hotel', cls: 'travel', col: 'd2' },
  { t: 'App', cls: 'tech', col: 'd3' },
  { t: 'Cloud', cls: 'tech', col: 'd3' },
];
const els = items.map((it, i) => {
  const d = document.createElement('div');
  d.className = 'card ' + it.cls;
  d.textContent = it.t;
  d.style.left = (10 + (i % 3) * 60) + 'px';
  d.style.top = (10 + Math.floor(i / 3) * 28) + 'px';
  pool.appendChild(d);
  return d;
});
function sortAll() {
  items.forEach((it, i) => {
    const target = document.getElementById(it.col);
    const r = target.getBoundingClientRect();
    const p = pool.getBoundingClientRect();
    els[i].style.left = (14 + (i % 2) * 44) + 'px';
    els[i].style.top = (target.offsetTop + 10 + Math.floor(i / 2) * 26) + 'px';
    target.appendChild(els[i]);
    els[i].style.position = 'absolute';
  });
}
function resetAll() {
  items.forEach((it, i) => {
    pool.appendChild(els[i]);
    els[i].style.left = (10 + (i % 3) * 60) + 'px';
    els[i].style.top = (10 + Math.floor(i / 3) * 28) + 'px';
  });
}
let sorted = false;
function toggle() {
  sorted = !sorted;
  if (sorted) sortAll(); else resetAll();
}
setInterval(toggle, 2200);

메뉴 이름을 뭐라고 붙일지, 몇 개 카테고리로 나눌지를 디자이너 혼자 정하는 대신, 콘텐츠 항목 하나하나를 카드에 적어 참가자에게 주고 "말이 되는 대로" 묶어보게 합니다. 정해진 카테고리가 없는 오픈 카드 소팅은 사용자가 직접 이름까지 붙이게 하고, 클로즈드 카드 소팅은 미리 정한 카테고리에 카드를 배정하게 해 기존 구조를 검증합니다.

핵심은 참가자마다 묶는 방식이 다르다는 것입니다. 여러 명의 결과를 겹쳐 보면(유사도 매트릭스, 덴드로그램) 사람들이 공통적으로 같이 묶는 항목과 갈리는 항목이 드러나고, 그게 곧 내비게이션 카테고리의 근거가 됩니다.

정보 구조를 새로 짤 때는 오픈 소팅으로 사용자의 분류 체계를 발견하고, 이미 만든 구조를 검증할 때는 클로즈드 소팅이나 트리 테스팅으로 넘어가는 순서가 일반적입니다.

언제 쓰나

내비게이션 카테고리 이름이나 개수를 팀 안에서 논쟁하고 있을 때. 논쟁을 의견 대신 데이터로 끝낼 수 있습니다.