코치 마크

Coach Marks

화면을 어둡게 깔고 특정 요소만 스포트라이트로 비추며 순서대로 설명하는 온보딩 투어 UI.

다른 이름: Onboarding tourFeature spotlight
···
html
<div class="screen">
  <div class="el e1"></div>
  <div class="el e2"></div>
  <div class="el e3"></div>
  <div class="spot" id="spot"></div>
  <div class="bub" id="bub">Step</div>
  <div class="dots"><span id="d0"></span><span id="d1"></span><span id="d2"></span></div>
</div>
css
.screen{position:relative;width:90%;height:88%;border-radius:12px;background:var(--surface);border:1px solid var(--line);overflow:hidden}
.el{position:absolute;border-radius:8px;background:var(--line)}
.e1{left:6%;top:10%;width:22%;height:14%}
.e2{right:6%;top:10%;width:16%;height:14%}
.e3{left:6%;bottom:10%;width:88%;height:16%}
.spot{position:absolute;border-radius:10px;box-shadow:0 0 0 2000px rgba(0,0,0,.55);border:2px solid var(--accent);transition:all .6s cubic-bezier(.4,0,.2,1)}
.bub{position:absolute;padding:5px 10px;border-radius:8px;background:var(--accent);color:#fff;font:700 10.5px/1 sans-serif;transition:all .6s cubic-bezier(.4,0,.2,1)}
.dots{position:absolute;bottom:6px;left:50%;transform:translateX(-50%);display:flex;gap:6px}
.dots span{width:6px;height:6px;border-radius:50%;background:var(--line)}
.dots span.on{background:var(--accent)}
js
const spot = document.getElementById('spot');
const bub = document.getElementById('bub');
const dots = [document.getElementById('d0'), document.getElementById('d1'), document.getElementById('d2')];
const steps = [
  { x: '6%', y: '10%', w: '22%', h: '14%', bx: '6%', by: '26%', label: '1. Search' },
  { x: '76%', y: '10%', w: '18%', h: '14%', bx: '58%', by: '26%', label: '2. Profile' },
  { x: '6%', y: '68%', w: '88%', h: '20%', bx: '6%', by: '58%', label: '3. Compose' },
];
let i = 0;
function apply() {
  const s = steps[i];
  spot.style.left = s.x; spot.style.top = s.y; spot.style.width = s.w; spot.style.height = s.h;
  bub.style.left = s.bx; bub.style.top = s.by; bub.textContent = s.label;
  dots.forEach((d, k) => d.classList.toggle('on', k === i));
}
apply();
setInterval(() => { i = (i + 1) % steps.length; apply(); }, 1800);

앱·웹 온보딩에서 널리 쓰이는 패턴으로 특정 발명자는 없지만, 모바일 앱이 보편화된 2010년대 이후 "처음 켰을 때 툴팁 투어"로 자리잡았습니다. 배경을 어둡게 죽이고(→ figure-ground) 요소 하나만 원형 구멍으로 뚫어 강조한 뒤, 화살표 달린 말풍선으로 설명을 답니다.

효과적이려면 (1) 3~4단계를 넘기지 않고, (2) 언제든 건너뛸 수 있게 하고, (3) 실제로 그 기능을 쓸 타이밍(처음 진입이 아니라 그 기능 근처에 왔을 때)에 보여주는 게 낫습니다. 로그인하자마자 5단계 투어를 강제하면 대부분 스킵하고 아무것도 기억하지 못합니다.

데모는 화면 3개 요소를 순서대로 스포트라이트로 돌며 1/2/3 단계 점을 진행시킵니다.

언제 쓰나

새 기능을 처음 노출시킬 때. 로그인 직후 강제 투어보다, 해당 기능 근처에서 문맥에 맞게 보여주는 편이 기억에 남습니다.