UIXHERO

Empty State(空状態)

コンテンツが存在しない状態をユーザーに伝えるUIコンポーネント。「データなし」「検索結果なし」「エラー」の3種類の設計・イラスト/アイコン/テキスト/CTAの組み合わせ・アクセシビリティの実装を解説する。

2026年3月3日
更新: 2026年9月3日
16
by Dengen Yosho(DGYS)

リスト・テーブル・フィード・検索結果などのコンテンツ領域が空である状態をユーザーに伝えるコンポーネント。「まだデータがない」「検索結果がない」「エラーでデータを取得できない」など、様々な原因で空になる状況をユーザーが次に何をすべきかを示しながら伝えることが設計の核心。

この記事を読むと、3種類のEmpty State(データなし・検索結果なし・エラー)の使い分け・「何もない」と表示するだけでは不十分な理由・イラスト/アイコン/テキスト/CTAの組み合わせ設計が自分でできるようになります。


1. UI例(Preview / Live)

この空状態は、 GUNJO の EmptyState 実装です。(データなし / 検索結果なし / 権限なし …)を切り替えて確認できます(右上 Code で編集可)。

実装で見る(GunjoUI)

この部品を、デザインシステム GUNJO の実装で確かめられます。

2. 定義(Definition)

コンテンツ領域が空である状態を伝えるUIコンポーネント。単に「何もない」と表示するのではなく、なぜ空なのか・次に何をすべきかをユーザーに伝えることが目的。

Empty Stateの5種類

種類原因の例
初回空(No Data)ユーザーがまだデータを作成していない「作成する」ボタン
検索結果なし検索キーワードに一致しない「フィルターをクリア」
フィルター結果なしフィルター条件に一致しない「フィルターをリセット」
エラーデータ取得に失敗「再試行」
権限なしユーザーが閲覧権限を持たない「管理者に依頼」

3. 使い分け(When to use / When NOT to use)

3.1 When to use

  • リスト・テーブル・フィードが空の時
  • 検索・フィルターの結果が0件の時
  • エラーでデータを表示できない時
  • 権限がないコンテンツにアクセスした時

3.2 When NOT to use

  • ページ全体のエラー(404・500)→ 専用のエラーページを使う
  • フォームの空フィールド → インラインのプレースホルダーテキストを使う

3.3 代替UI(Alternatives)

  • ページ全体のエラー → エラーページ(404 / 500)
  • データ取得中 → Loading / Skeleton
  • 部分的なエラー通知 → Alert

4. 設計判断の核(Decision Principles)

Empty Stateの核は「空の原因の明示」と「次のアクションへの誘導」——「データがありません」だけでは、ユーザーは何をすべきか分からず手詰まりになる。

判断の優先順位:① 原因の明示(なぜ空か)→ ② CTAの提供(何をすべきか)→ ③ 視覚的な伝達(アイコン)→ ④ 種類別のデザイン差異

  • 「初回空」と「検索結果なし」は見た目を変える:初回空のEmpty Stateには「作成する」の積極的なCTAを置き、検索結果なしには「フィルターをクリア」の修正的なCTAを置く。同じデザインにすると意図が伝わらない
  • エラー系Empty Stateには「再試行」と「サポートへの連絡」を両方置く:ユーザーが自分で解決できる場合(ネットワーク一時エラー)と解決できない場合(権限エラー)で、取るべき行動が違う。両方提供することで詰まりを防ぐ
  • アイコンは状況を象徴するものを選ぶ:空の受け皿・虫眼鏡・ロックアイコンなど、状況を直感的に表すアイコンを使う。同じアイコンを全種類に使うと空の原因が区別できない

5. 状態設計(States)

5.1 Empty Stateの構成要素(4点セット)

要素必須説明
アイコン / イラスト状況を視覚的に象徴
タイトル(短い説明)「なぜ空か」を1文で
説明文タイトルの補足・次の行動のヒント
CTAボタン初回空・検索/フィルター空・エラーには必須

6. バリエーション設計(Variants)

種類によってアイコン・タイトル・CTA が変わる。

バリアントアイコン例タイトルCTA
初回空ドキュメントアイコン「まだ〇〇がありません」「〇〇を作成」(Primary)
検索結果なし虫眼鏡「「〇〇」の結果はありません」「検索をクリア」(Secondary)
フィルター空フィルターアイコン「条件に一致しません」「リセット」(Secondary)
エラー警告三角「読み込めませんでした」「再試行」(Primary) + 「サポートへ」
権限なしロック「閲覧権限がありません」「管理者に依頼」

禁止パターン:Empty State にCTAを置かない → ユーザーが手詰まりになる。エラー系には最低「再試行」ボタンを置く。


7. パターン集(Good / Bad / How to fix)

7.0 よく崩れる設計パターン(3つ)

  • 全種類が同じEmpty State:初回空・検索結果なし・エラーが全部同じテキスト・同じデザインで、ユーザーが空の原因を理解できない
  • CTAがない:「データがありません」だけ表示し、次にどうすればいいか伝えない
  • Loading後にEmpty Stateが表示されない:データが0件の時に null をレンダリングして何も表示されず、エラーなのかローディング中なのか分からない

7.1 Bad(典型3つ)

  • 検索結果なしに「データがありません」と表示して、「フィルターをクリア」ボタンもなく手詰まりになる
  • 初回空に「まだデータがありません」だけ表示して、「作成する」ボタンがなく次のアクションが不明
  • エラー発生時に null をレンダリングして画面が空白になり、バグなのかローディング中なのか区別できない

7.2 Good(対になる3つ)

  • 検索結果なしの Empty State に「『〇〇』の検索結果はありません」 + 「フィルターをクリア」ボタンを置き、ユーザーがすぐに修正できる
  • 初回空にイラスト + 「まだ〇〇がありません」 + 「〇〇を作成」(Primary Button)を置き、最初の一歩を促す
  • エラー状態を isError フラグで管理し、isError && <ErrorEmptyState /> でエラー専用のEmpty Stateをレンダリングする

7.3 How to fix(手順)

  1. 空になるケースをリストアップ(初回空・検索なし・フィルターなし・エラー・権限なし)
  2. 各ケースに対応するEmpty Stateコンポーネントを別々に設計する
  3. 各Empty Stateにアイコン + タイトル + 説明 + CTAの4点セットを揃える
  4. データフェッチの状態管理(isLoading / isError / isEmpty)を整理し、それぞれの状態で適切なUIを表示する

7.4 GUNJO 実装で見る(Bad / Good)

同じ「空の状態」を、そっけない使い方と、GUNJO EmptyState で誘導する使い方で


8. ルール(Must / Better)

Must(守らないと壊れる)

Better(品質が跳ねる)


9. アクセシビリティ要件(必須)

Screen Reader

<section aria-label="検索結果なし">
  <img src="..." alt="" aria-hidden="true" />
  <!-- アイコン/イラストは装飾扱いでaria-hidden -->

  <h2>「React hooks」の検索結果はありません</h2>
  <p>キーワードを変えるか、フィルターを解除してみてください。</p>
  <button>フィルターをクリア</button>
</section>

アイコン・イラストは装飾扱い(aria-hidden="true")にして、意味はテキストで伝える。

Focus

  • CTAボタンはフォーカス可能でキーボードで操作できること
  • データが空になった時、フォーカスをEmpty Stateの見出しに移す(任意だがユーザビリティが向上する)

10. 実装メモ(Implementation Notes)

  • Empty Stateは多くの場合、データフェッチの状態管理と組み合わせる:isLoadingSkeletonisError → エラーEmpty State、data.length === 0 → 通常Empty State、data.length > 0 → コンテンツ表示、の4分岐で実装する
  • shadcn/ui に Empty State のネイティブコンポーネントはないが、Card + CardContent をベースに実装するのが一般的
  • イラストを使う場合は SVG の undraw.co(MIT ライセンス)が多く使われる。アイコンだけで実装する場合は lucide-react のアイコンをサイズを大きくして使う(w-12 h-12 程度)

11. 関連リンク


12. まとめ

Empty Stateの設計で最重要なのは「空の原因の明示」と「次のアクションへの誘導」です。迷ったら 4. 設計判断の核 に戻り、「なぜ空かをタイトルに書いているか」「CTAボタンがあるか」「種類(初回空/検索なし/エラー)ごとに使い分けているか」の3点を確認してください。null を返すだけのEmpty Stateは設計の放棄です——ユーザーを手詰まりにさせない最後の砦として、必ず実装してください。

更新のお知らせ

サイトに載せていない実例や、新しい記事のお知らせはこちらで出しています。

読んだ内容を、自分の画面に当てるとき

UIXHEROは、記事を書くほかに、画面の検品・判定、デザインシステムの構築、実装と改善の伴走を受けています。何を頼めばいいか決まっていない段階の相談も、同じ窓口で受けます。

UIXHEROに頼めることを見る

※ 記事の内容についての質問や、書いてほしいテーマの要望も同じ窓口で受けています

記事をシェア

メールでお知らせを受け取る

最終更新: 2026年9月3日

この記事を書いた人

Dengen Yosho(DGYS)

Dengen Yosho(DGYS)

UI/UXデザイナー兼デザインエンジニア デザイン歴25年以上 情報設計〜UIデザイン〜React/TypeScriptによる実装までを一気通貫で担当 大手企業のDXプロジェクトや決済アプリ領域で、デザインリードとして改善と構築を経験 現在はフリーランスとして、プロダクトのUI/UX改善とデザインシステム構築を支援 長年の実務の中で感じてきたのは、 「良いUI」はセンスではなく、再現可能な判断の積み重ねであるということ UIXHEROは、 心理学や行動科学の知見を、現場で使える設計言語に翻訳するための場所 関心領域は「ユーザーの行動が変わるUI」 人の認知・注意・意思決定の構造を理解し、 “なぜそのUIが機能するのか”を言語化することを目指している

あわせて読みたい

この記事に関連する記事をご紹介します

Bar Chart(棒グラフ)

カテゴリごとの量を棒の長さで比べるチャート。ゼロ基線の扱い、並び順、縦横の選び方、しきい値の見せ方という設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
18

Donut Chart(ドーナツチャート)

中央をくり抜いた円で構成比を示すチャート。中央に置く値の選び方、円グラフとの使い分け、リングの太さ、凡例の作りという設計判断と、色だけに頼らないアクセシビリティ要件を解説する。

2026年8月27日
17

Gauge Chart(ゲージチャート)

1つの値を範囲の中に置いて示す半円のチャート。範囲の両端に意味があるかという条件、しきい値の帯の設計、色だけで良否を伝えない書き方という設計判断とアクセシビリティ要件を解説する。

2026年8月27日
16

もっと深く知りたいですか?

ここに掲載されていないトピックについても、リクエストがあれば解説記事を追加します。 わかりにくい点や、具体的な事例について知りたいことがあれば教えてください。

リクエストを送る