この記事の要点(UIXHERO視点) UIXHEROでは、ツァイガルニク効果を「未完了の誘惑、空白への渇望」と捉える。 本記事では、人間が持つ「途中の気持ち悪さ」を逆手に取り、プログレスバーや連続記録を使ってコンプリート欲求を刺激し、ユーザーを離脱させない(熱中させる)ためのエンゲージメント設計を整理する。
ツァイガルニク効果とは?
1920年代、心理学者ブルーマ・ツァイガルニクは、カフェのウェイターが「まだ会計が終わっていない注文」は完璧に覚えているのに、「会計が終わった注文」はその瞬間に忘れてしまうことに気づきました。 人は 未完了の状態に緊張(テンション)を感じ、それを解消したいという衝動 を持ちます。これがツァイガルニク効果です。
UXデザインでの活用事例
1. プログレスバー (Progress Indicators)
「プロフィール入力率:85%」などと表示することで、ユーザーは「残りの15%を埋めて100%にしたい(コンプリートしたい)」という衝動に駆られます。LinkedInのプロフィール充実度が有名です。
2. 連続記録 (Streaks)
語学アプリ(Duolingoなど)で「連続学習記録:7日目」と表示されると、ユーザーは「記録を途切れさせたくない(完了させ続けたい)」と感じ、アプリを開く習慣が形成されます。
3. クリフハンガー (Cliffhangers)
動画サービスで、エピソードの最後を「続きが気になる」形で終わらせたり、次のエピソードを数秒後に自動再生することで、視聴を中断できないようにします(binge-watching)。
4. ニュースレターの件名
「あなたが知らない3つの秘密...」のように、文章を途中で切ることで、クリックして「続き(完了)」を見たいと思わせます。
実装例: 未完了タスクへの誘引
「完了したタスク」と「未完了のタスク」のリストを表示し、未完了のものほど「クリックして消し込みたい」と感じる心理を視覚化します。
Interactive Example (Live)
const ZeigarnikTaskDemo = () => { const [tasks, setTasks] = useState([ { id: 1, text: 'Sign up for account', done: true }, { id: 2, text: 'Verify email address', done: true }, { id: 3, text: 'Upload profile picture', done: false }, { id: 4, text: 'Write first bio', done: false }, ]); const toggleTask = (id) => { setTasks(tasks.map(t => t.id === id ? { ...t, done: !t.done } : t)); }; const completionRate = Math.round((tasks.filter(t => t.done).length / tasks.length) * 100); return ( <div className="p-8 bg-card rounded-xl shadow-lg max-w-sm mx-auto"> <div className="mb-6"> <div className="flex justify-between items-end mb-2"> <h3 className="font-bold text-card-foreground">Setup Progress</h3> <span className="text-2xl font-black text-primary">{completionRate}%</span> </div> {/* Progress Bar */} <div className="h-3 w-full bg-muted rounded-full overflow-hidden"> <div className="h-full bg-primary/100 transition-all duration-500 ease-out relative" style={{ width: `${completionRate}%` }} > {/* シマーエフェクト (光が走る) で注目を集める */} {completionRate < 100 && ( <div className="absolute inset-0 bg-card opacity-20 w-full animate-shimmer"></div> )} </div> </div> {completionRate === 100 ? ( <p className="text-xs text-green-500 mt-2 font-bold text-center">🎉 All set! You feel satisfied.</p> ) : ( <p className="text-xs text-primary mt-2 font-medium">Complete {4 - tasks.filter(t => t.done).length} more to finish!</p> )} </div> <div className="space-y-3"> {tasks.map(task => ( <button key={task.id} onClick={() => toggleTask(task.id)} className={`w-full flex items-center p-3 rounded-lg border transition-all ${ task.done ? 'bg-muted/30 border-border/50 text-muted-foreground' : 'bg-card border-primary/30 shadow-sm hover:translate-x-1' }`} > <div className={`w-5 h-5 rounded-full border mr-3 flex items-center justify-center ${ task.done ? 'bg-green-600 border-green-500' : 'border-border' }`}> {task.done && <span className="text-white text-xs">✓</span>} </div> <span className={task.done ? 'line-through' : 'font-medium text-foreground'}> {task.text} </span> {!task.done && ( <span className="ml-auto text-[10px] bg-red-100 text-destructive px-2 py-0.5 rounded-full font-bold"> TODO </span> )} </button> ))} </div> </div> ); }; render(<ZeigarnikTaskDemo />);
実践ガイドライン (Practical Guidelines)
実装チェックリスト
倫理的配慮 (Ethical Considerations)
- 中毒性 : 常に「未完了」の状態を見せ続けることで、ユーザーをアプリに縛り付ける(例:終わりのない通知バッジ、無限スクロール)ことは、デジタルウェルビーイングの観点から問題視されています。ユーザーに「完了の安らぎ」を与えるタイミングも設計に組み込むべきです。