狀態

頁面沒資料、載入中、出錯了,這三種「不是正常內容」的狀態最容易被草草帶過。這章把 Empty、Error、Loading 的定稿做法講清楚,讓你永遠不會留一片真空白。當你要決定「載入該用 spinner 還是 skeleton」、或寫 error 文案時,就翻這頁對一下規格。

Empty State

這是什麼

沒有資料時要給圖示或插圖、說明為什麼是空的、以及下一步按鈕;第一次使用、搜尋無結果、沒權限要分開設計。

什麼時候用

列表或區塊為空時不要只留白;第一次要鼓勵建立,篩選無結果要讓人清除條件,沒權限要說明如何申請。

預覽依本指南規則實作

尚無專案

找不到符合結果

您沒有檢視權限

三要素

  1. 視覺
  2. 解釋「這是什麼 + 為什麼是空的」
  3. 引導 CTA
  • First-use:大插圖 + 完整說明 + 強 CTA + 文件連結。
  • Filter 無結果:小 icon + Clear filters。
  • Permission:鎖頭 + 聯絡管理員。

Error State

這是什麼

載入失敗時說明發生什麼事、可以怎麼處理,並提供「重試」;單一區塊錯誤不要讓整頁都不能用。

什麼時候用

列表或區塊請求失敗時用;文案要具體,避免只顯示錯誤代碼。

預覽依本指南規則實作

無法載入專案列表

請檢查網路連線後再試一次

  • 三要素:發生什麼事、怎麼復原、Retry(可重試時)。
  • 整頁 / 區塊 / 欄位 / toast 分級見 回饋 章。
  • 文案要具體,避免只顯示 Error 500。

Loading State

這是什麼

等待時依時間長短選擇:很快可不顯示、約一秒內用轉圈、有版面結構用骨架、很久用進度條並估計剩餘時間。

什麼時候用

少於半秒避免閃一下的轉圈;使用者需要知道還要等多久時,進度條比一直轉圈安心。

預覽依本指南規則實作

Spinner(< 1.5s)

Skeleton(1.5–10s)

匯出報表68%

約 2 分鐘剩餘 · 可背景執行

等待時間用什麼
< 0.5 秒不顯示(避免閃爍)
0.5–1.5 秒Spinner
1.5–10 秒Skeleton
> 10 秒Progress bar + 預估時間

Optimistic UI

這是什麼

多半會成功的操作(例如標記、切換狀態)先讓畫面立刻反映,背景再送請求;失敗就還原並提示錯誤。

什麼時候用

按讚、勾選、改狀態等低風險動作用;付款、不可復原刪除要等伺服器確認後再改畫面。

預覽依本指南規則實作

點擊即反映;API 失敗時還原並 toast

  • 高機率成功(like、status、checkbox):UI 先變、背景送 API;失敗 rollback + error toast。
  • 付款、不可逆刪除:pessimistic,等 server 回應。

規格速查

狀態定稿做法
Empty插圖+說明+CTA,永不真的空白;分首次使用與無結果兩種
Error說明發生什麼+怎麼復原+Retry 按鈕
Loading< 1.5 秒用 spinner;≥ 1.5 秒有結構用 skeleton;≥ 10 秒用 progress bar
  • 首次使用 empty 用大插圖+強 CTA;filter/search 無結果用小 icon+「清除篩選」。
  • progress bar 顯示預估剩餘時間,且允許使用者離開不卡住。
  • skeleton 與 spinner 不可同時出現。
  • 高機率成功的操作用 optimistic UI:先更新畫面,失敗再 rollback。

常見做錯

做錯正確
沒資料就留一片真空白一律給 empty state(插圖+說明+CTA)
error 只說「出錯了」說明發生什麼、怎麼復原,並附 Retry
有結構的內容用 spinner有結構就用 skeleton 還原內容形狀
skeleton 與 spinner 並用兩者擇一,避免畫面雙重載入感

相關章節

  • 回饋 — 暫時性 error 與欄位 error 該用 toast 還是 inline
  • 資料表格 — 表格的 empty 與 skeleton row 怎麼配
  • 錯誤頁 40x/50x — 整頁 error 與 404/500 的標準頁面