結論

プロは空状態とローディングを「設計された状態」として扱い、後回しにしない。空状態は情報を伝えるコピー+補助ビジュアル+ただ1つの主要CTAの3点構成を、4つの型(初回利用/ユーザー消去後/データなし・検索0件/エラー)に合わせて書き分ける。ローディングは所要時間でゲートし、1秒未満は何も出さない・2〜10秒は最終レイアウトを写したスケルトン・10秒超は確定的プログレスバーを使い分ける。

01 — 空状態は「コピー+ビジュアル+1つのCTA」で組む

No data のような汎用プレースホルダは、なぜ空なのか・次に何をすべきかを何も伝えず、システムが壊れているように見える。空状態の最小単位は短く具体的なコピー+(任意の)補助ビジュアル+ちょうど1つの主要CTA。コピーは必須、イラストとCTAは状況次第だが、初回利用ではCTAが必須だ。

No data
✗ 汎用プレースホルダ → 理由も次の一手も不明
プロジェクトはまだありません
最初のプロジェクトを作って、チームと共有しましょう。
✓ コピー+装飾ビジュアル+主要CTA1つ
幅:コンテナは約360pxに絞り、コピーは「強い一文+任意の補足一行」に収める。CTAは1つだけ。

blogEmpty State UX Examples & Best Practices — Pencil & Paper

blogEmpty State UI Design: Best practices — Mobbin

02 — 4つの型を見分けてからコピーを書く

空状態は1種類ではない。初回利用(白紙+手順+主要CTA)、ユーザー消去後(タスク完了・受信箱ゼロ。祝福してよい)、データなし/検索0件(理由を説明し、ドキュメントやFAQへ逃がす)、エラー(障害。説明+復旧アクション)。型を先に決め、それからコピーとCTAの意図を変える。下は同じ「検索0件」を、行き止まりにするか・逃げ道を用意するかの違い。

検索結果: 0件
✗ 行き止まり → ユーザーが取り残される
「{keyword}」に一致なし
スペルを変えるか、絞り込みをクリア。困ったら サポート へ。
✓ 型=no-results → 代替経路へ誘導

blogDesigning the Overlooked Empty States — UXPin

primaryEmpty states — Carbon Design System

03 — ローディングは所要時間でゲートする

インジケータは「時間予算」で選ぶ。1秒未満は何も出さない(注意が散るのは約1秒の空白以降)。2〜10秒の全画面読込はスケルトン10秒超は確定的プログレスバー+残り時間の目安。素のスピナーが許されるのは小さな単一モジュールだけで、全画面の素スピナーはスケルトンより遅く感じられ、進捗もレイアウトも伝えない。

✗ 全画面を素スピナー → 進捗もレイアウトも不明
✓ 2〜10秒はレイアウトを写すスケルトン

primarySkeleton Screens 101 — Nielsen Norman Group

04 — スケルトンは最終レイアウトを写す

スケルトンの効果は「データが届いた瞬間に再レイアウト(reflow)が起きない」ことに尽きる。だから各ブロックは実コンテンツの構造(アバター48px、16:9サムネ、タイトル60%幅、本文行)に一致させる。ヘッダー/フッターだけ光って本文が空白の枠だけスケルトンは、データ着地時にガクッとずれて知覚パフォーマンスの利点を壊す。動きは控えめにし、prefers-reduced-motion を尊重する。

✗ 枠だけ光る → 着地で本文がずれる
✓ 実カードと同じ骨格 → reflowなし

primarySkeleton Screens 101 — Nielsen Norman Group

05 — タグラインをボタン風に書かない/装飾は支援技術から隠す

イラストやタグラインはタップに反応しない非インタラクティブ要素。なのにボタンのような文言(「ここをタップ」等)を載せると、ユーザーを誤誘導する。実行可能な指示は本物のボタンに置く。また、空状態のイラストはたいてい装飾なので、alt=""role="presentation" でスクリーンリーダーから隠し、ノイズを増やさない。

+ 新規作成(タップ不可)
✗ 非操作イラスト上のボタン風コピー → 誤誘導
まだ項目がありません。
✓ 指示は本物のボタンに/装飾は alt="" で隠す

primaryEmpty states — Material Design

primaryEmpty states — Carbon Design System

06 — ダッシュボードで空が連発するなら「テキストのみ」

複数モジュールが同時に空・失敗する画面でイラスト付き空状態を繰り返すと、アイコンは効果を失い視覚的ノイズだけが増える。Carbon の指針どおり、こうした場面ではイラストを外しテキストのみの空状態にして、繰り返しが静かに収まるようにする。検索0件なら、インラインリンクでドキュメントやFAQへ逃がす。

🗒️
🗒️
🗒️
✗ 同じ空イラストが連発 → ノイズ化
データなし。ソースを追加
データなし。設定ガイド
✓ テキストのみ+逃げ道リンクで静かに

primaryEmpty states — Carbon Design System

07 — 10秒超は「確定的」プログレスバーで

10秒を超える処理(大量インポート等)では、進捗が見えないと不安が募る。確定的なバー+数量や残り時間の見積もりを出す。幅はデータ駆動で更新し、不確定スイープでごまかさない。下の左は嘘の不確定スイープ、右は実進捗を反映した確定バー。

処理中…(いつ終わる?)
✗ 10秒超を不確定スイープ → 進捗が読めない
5,000行中 3,100行 — 残り約20秒
✓ 確定バー+数量・残り時間の見積もり

primarySkeleton Screens 101 — Nielsen Norman Group

実装スニペット

最終レイアウトを写すスケルトン(reduced-motion ガード付き)。各ブロックのサイズを実カードに合わせる。

.skeleton { --sk-base:#e8eaed; --sk-shine:#f4f5f7; }
.skeleton__line,
.skeleton__avatar,
.skeleton__thumb {
  background: var(--sk-base);
  border-radius: 6px;
  position: relative;
  overflow: hidden;
}
.skeleton__avatar { width:48px; height:48px; border-radius:50%; }
.skeleton__thumb  { aspect-ratio:16/9; width:100%; border-radius:8px; }
.skeleton__line   { height:12px; margin:8px 0; }
.skeleton__line--title { height:16px; width:60%; }
.skeleton__line--short { width:40%; }

.skeleton__line::after,
.skeleton__thumb::after {
  content:""; position:absolute; inset:0;
  transform: translateX(-100%);
  background: linear-gradient(90deg, transparent, var(--sk-shine), transparent);
  animation: sk-shimmer 1.4s ease-in-out infinite;
}
@keyframes sk-shimmer { 100% { transform: translateX(100%); } }

@media (prefers-reduced-motion: reduce) {
  .skeleton__line::after,
  .skeleton__thumb::after { animation: none; }
  .skeleton { animation: sk-pulse 1.6s ease-in-out infinite; }
}
@keyframes sk-pulse { 50% { opacity:.6; } }

空状態ブロック:コピー+装飾ビジュアル(AT非表示)+CTA1つ。

.empty-state {
  display: grid; justify-items: center; gap: 12px;
  max-width: 360px; margin: 64px auto; text-align: center;
}
.empty-state__art   { width:96px; height:96px; opacity:.9; }
.empty-state__title { font-size:18px; font-weight:600; line-height:1.4; }
.empty-state__body  { font-size:14px; line-height:1.6; color:#5f6368; }
.empty-state__cta {
  margin-top:4px; padding:10px 20px; border-radius:8px;
  font-weight:600; background:#1a73e8; color:#fff; border:0;
}
/* <img class="empty-state__art" alt="" role="presentation"> */

繰り返す/失敗ウィジェット用のテキストのみ空状態。

.widget-empty {
  display: flex; align-items: center; justify-content: center;
  min-height: 120px; padding: 16px; text-align: center;
  font-size: 13px; line-height: 1.5; color: #6b7280;
  background: #f8f9fa; border: 1px dashed #d2d5da; border-radius: 8px;
}
.widget-empty a { color:#1a73e8; text-decoration: underline; }
/* 例: "まだ活動がありません。ソースを追加するか <a>設定ガイド</a> を参照。" */

10秒超向けの確定的プログレスバー(幅は JS で更新)。

.progress {
  width: 100%; height: 6px; background: #e8eaed;
  border-radius: 999px; overflow: hidden;
}
.progress__fill {
  height: 100%;
  width: var(--pct, 0%); /* JSで: el.style.setProperty('--pct', p+'%') */
  background: #1a73e8; border-radius: inherit;
  transition: width .3s ease;
}
/* ラベル併記: "5,000行中 1,240行 — 残り約20秒" */

チェックリスト

  • 空状態の「型」を先に決めた(初回利用/ユーザー消去後/データなし・0件/エラー)。
  • 各空状態に、具体的なコピー+(任意の)ビジュアル+主要CTA**1つ**がある。`No data` 等の汎用文は排除した。
  • 初回利用には主要CTAが必ずある。コピーは「指示2:遊び心1」でClarityを優先。
  • ローディングは時間で出し分け:1秒未満=何も出さない/2〜10秒=スケルトン/10秒超=確定バー。
  • スケルトンは実コンテンツの骨格(アバター・サムネ比率・行幅)に一致し、reflowが起きない。
  • `prefers-reduced-motion: reduce` でシマーを止め、穏やかな opacity パルスにフォールバックした。
  • 装飾イラストは `alt=""` / `role="presentation"` で支援技術から隠した。
  • ダッシュボードで空・失敗が連発する箇所はテキストのみにした。
  • 検索0件・エラーに逃げ道(ドキュメント/FAQ/サポート)を用意した。
  • タグライン/イラストにボタン風コピーを置かず、操作は本物のボタンに集約した。
  • 10秒超の確定バーは実データで幅を更新し、不確定スイープでごまかしていない。

限界 / 出典

注意:所要時間のしきい値(1秒/2〜10秒/10秒)は NNg のヒューリスティックで、絶対的な境界ではない。実測レイテンシとコンテンツ種別に合わせて調整し、小さな単一モジュールはスピナーでもよい。「指示2:遊び心1」も覚えやすい目安(Smashing, 2017)で、実測値ではない。Material(2017)や Smashing(2017)は2024年以前の出典だが、パターン自体は現役で、新しいトレンドではない。Pencil & Paper の「自然のイメージがストレスを下げる」という主張は根拠が弱く、低信頼として扱い過度に依拠しない。スニペットの色・サイズ(Material系ブルー #1a73e8 など)は無難な初期値なので、自社ブランドトークンへ差し替えること。出典はすべて英語の設計系リファレンスで、日本語LP/バナーのコピー長や palt・約物詰めは自社のタイポルールに合わせて調整する必要がある。

primarySkeleton Screens 101 — Nielsen Norman Group

primaryEmpty states — Carbon Design System

primaryEmpty states — Material Design

blogEmpty State UX Examples & Best Practices — Pencil & Paper

blogDesigning the Overlooked Empty States — UXPin

blogEmpty State UI Design: Best practices — Mobbin

blogThe Role Of Empty States In User Onboarding — Smashing Magazine