4つの状態
正常な画面だけを作ると、利用者が最初に見る画面を作り忘れます。画面は4つの状態を持ちます。
図の中身を文字で読む
- 画面は4つの状態を持つ。正常だけを作らない。
- 読み込み中 空
- まだ登録がありません
- 最初の1件を登録するとここに一覧が表示されます
- エラー 正常
- 読み込めませんでした
- 通信の状態をご確認のうえ
- もう一度お試しください
- 再読み込み
- 構造の形で見せる
- 寸法を実物と合わせる
- 部品が持つ状態
- 説明と、最初の操作への導線 原因だけでなく、次にできること
- 「データがありません」だけにしない 問い合わせ用の識別子は残す
- 通常 hover フォーカス 押下 無効 処理中
- 設計はここから始まるがここだけでは終わらない
- hover だけを設計してフォーカスを忘れると、キーボード操作で現在位置が分からなくなる。
- 視覚的に状態が変わっても、aria-* を更新しなければ支援技術には伝わらない。
ひと目で#
正常だけを作らない。 画面には4つの状態があります。
- 読み込み中
- 結果がまだ確定していない
- 空状態
- 結果は確定したが、データがない
- エラー状態
- 処理が失敗した
- 正常
- データがある
部品の側にも状態があります。通常、hover、フォーカス、押下、無効、処理中、選択済み。
空状態の3種類#
図の中身を文字で読む
- 同じ0件でも、要るものが違う
- 初めて開いた
- まだ予約はありません
- 予約が入ると、新しい順にここへ並びます
- 絞り込んで該当なし
- 条件に合う予約はありません
- 今週 ✕ 未確定 ✕
- 条件を1つ外す
- すべて処理済み
- 未対応は0件です
- 本日ぶんの確認は終わりました
- 空き時間から予約する
- 利用者がいちばん最初に見る画面。
- 何ができる場所かを、ここで伝える。
- 何で絞った結果なのかを見せ、条件を緩める手段を同じ場所に置く。
- これは失敗ではなく達成。
- 望ましい状態として見せる。
- ✕ 3つとも「データがありません」で済ませる → 次に何をすればよいかが、どの場合も分からない
| 状況 | 要るもの |
|---|---|
| 初めての利用。まだ何も作っていない | 何ができるかの説明と、最初の操作への導線 |
| 検索や絞り込みで該当なし | 条件の表示、条件を緩める手段、近い結果 |
| すべて処理済み | 達成の確認。望ましい状態として見せる |
使い分け#
| こう感じたら | 直すところ |
|---|---|
| 待てば出るのか、そもそも無いのか分からない | 読み込み中と空を、別の表示にする |
| エラーで行き詰まる | 原因だけでなく、次にできることを書く |
| 一覧の一部が取れない | 全体をエラーにせず、取れた分は見せる |
| キーボードで現在位置が分からない | フォーカスの状態を設計していない |
| 無効なボタンの理由が分からない | 押せるようにして、理由を返す形も考える |
間違えやすいところ#
- 「データがありません」だけを表示する次に何をすればよいか分からない
- 初回の空状態を後回しにする利用者が最初に見る画面がそれ
- 検索結果が空のとき条件を示さない何で絞った結果なのか分からない
- 技術的なエラーコードだけを出す利用者には意味が通じない
- hover だけ設計してフォーカスを忘れるキー操作で現在位置が分からない
- 無効状態を薄くするだけにする理由が伝わらない
- 見た目の状態は変えて
aria-*を更新しない支援技術に伝わらない - カード全体をリンクにしつつ、中にもリンクを置く入れ子のリンクは操作を誤らせる
直す例#
架空の案件を1つ例にとります。どこを見て、何をどう直すかを書きます。
予約システムの初回ログイン後、一覧が真っ白です。データを取りに行く1〜2秒も、0件という結果も、通信の失敗も、すべて同じ白なので、利用者には壊れたのか待てばよいのか判断できません。
白を3つに分けます。読み込み中はスケルトンで骨組みを見せ、0件は「まだ予約はありません」と最初の操作への導線、失敗は原因と再読み込みの手段を出します。

どの状態でも見出しと枠の位置は動かしません。状態が変わるたびにレイアウトが組み変わると、それ自体が壊れたように見えます。
確認する#
- データ0件の画面に説明と次の操作がある。白紙の領域が残っていない
- 読み込み中と0件が別の見た目になっている。待てば出るのか無いのかが分かる
- 失敗の画面に再試行の手段がある。エラーコードだけで終わっていない
使えるパターン#
このページで扱う語#
このページで扱う語を並べる本文では太字9 語
語の名前から引くなら用語索引へ。
- 読み込み状態
- データの取得や処理が完了していない状態の画面。
- 状態遷移
- 要素や画面が、ある状態から別の状態へ変わること。およびその設計。
- カード
- 関連する情報を1つの矩形にまとめ、独立した単位として扱えるようにした部品。
- データテーブル
- 行と列で構成され、多数のデータを比較・走査できるようにした表。
- アコーディオン
- 複数の見出しを縦に並べ、押すとその下の内容が開く部品。
- ディスクロージャー
- 押すと隠れていた内容が現れる、単一の開閉要素。
- カルーセル
- 同じ領域に複数の内容を順に表示し、切り替えて見せる部品。
- ステッパー
- 複数の手順に分けた流れの中で、現在どの段階にいるかを示す部品。
- アバター
- 利用者や組織を視覚的に識別するための小さな画像。顔写真、ロゴ、頭文字などを使う。
この話が要る場面#
このページが答えになる、現場の困り事です。困り事の側から探すと、同じ場所に着きます。
読み込み中・空・エラー・正常の4つを必ず作る。空の画面には最初の操作への導線を置く。
このコードで動いている見本です
回転する印より、これから出る形をかたどった枠のほうが待ち時間を短く感じる。
このコードで動いている見本です
この場面のほかの困り事と、そのまま貼れる部品は部品を選ぶにまとめてある。逆引きには全188件。
4状態を試す#
同じ一覧画面を、空・読み込み中・エラー・正常の4つの状態で切り替えます。プレビューは実物のマークアップで、選んだ状態の完成 HTML と CSS をそのまま持ち帰れます。
制作事例
まだ制作事例が登録されていません
最初の事例を登録すると、ここに一覧が表示されます。
<div class="empty-state">
<h2>まだ制作事例が登録されていません</h2>
<p>最初の事例を登録すると、ここに一覧が表示されます。</p>
<a href="/works/new/" class="button">事例を登録する</a>
</div>
<style>
.empty-state { display: grid; gap: var(--space-3); justify-items: center;
padding: var(--space-8) var(--space-5); text-align: center; }
.empty-state h2 { margin: 0; font-size: var(--text-lg); }
.empty-state p { margin: 0; color: var(--color-text-muted); }
.empty-state .button { margin-block-start: var(--space-2); }
</style>
この道具は JavaScript で動きます。無効の場合は、上の空状態の3種類の表を手引きにしてください。