iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Vibe Coding

看得懂、叫得出、驗得過:30 天 VibeCoding UI 元件實戰系列 第 21

Day 21|重要訊息到底該放在哪裡?Alert、Banner 與 Callout

  • 分享至 

  • xImage
  •  

安安~我是ChiYu~

管理員準備儲存成員角色時,畫面同時冒出三則訊息:

  • 通知管道尚未選擇,設定無法儲存。
  • 系統今晚會維護一小時。
  • 新成員最好先從最小權限開始。

我當時留給 AI 的需求只有一句:

系統有錯誤或提醒時,顯示一個通知。

結果三句話全部被送到頁面最上方,再統一換成黃色橫幅。

訊息位置的錯誤第一版:通知管道錯誤、維護公告與最小權限建議全部放在頁首黃色 Banner,真正要修正的欄位仍在下方

圖 1:三句話都站在頁首,真正阻止儲存的通知管道錯誤,反而離修正欄位最遠。

畫面的配色很團結,訊息的責任完全沒有。

使用者要自己判斷:哪一句正在擋住眼前操作?哪一句會影響其他頁面?哪一句只是做決定前的建議?黃色不會替產品回答這三題,紅色也不會自動讓訊息站到正確位置。

所以今天不先挑顏色,而是先問三件事:

  1. 這則訊息在回應哪個事件?
  2. 影響範圍是目前欄位、這個工作區,還是整個服務?
  3. 使用者看完後,下一步要在哪裡完成?

這三個答案會把 AlertBannerCallout 分開。我也把完整操作整理在 Vibe UI Atlas 的比較頁

Vibe UI Atlas 的 Alert、Banner 與 Callout 比較:訊息離任務多遠,決定它該放在哪裡

圖 2:眼前的操作錯誤、跨頁公告與決策建議,分別靠近當前操作、主要內容與相關設定。

先替訊息畫出影響範圍,不要先挑一個通知元件

把三則訊息攤開後,位置其實不難判斷:

事件 影響範圍 使用者接著要做什麼 合適位置與元件
沒選通知管道就儲存 通知設定卡 補選一種管道後重試 Alert,留在設定區附近
晚上系統維護一小時 成員管理與相關頁面 知道時間與受影響功能,必要時提早處理 Banner,放在主要內容前
正在設定新成員角色 角色選擇這個決策 先理解最小權限原則 Callout,貼著決策說明
儲存成功,後面沒有工作 當前操作已完成 知道結果即可 不硬塞進這三種;明天再談 Toast

同一個頁面可以同時有三種訊息,前提是它們各自回答不同範圍。真正要避免的不是元件一起出現,而是所有訊息都擠到頁首,讓使用者再走一遍尋路流程。

如果訊息的下一步在某個欄位旁,距離就應該近;如果影響整個服務,才值得站到主要內容之前;如果只是決策建議,就別用警報語氣把人嚇一跳。

同一句儲存錯誤搬三次,只有 Alert 沒讓人找路

我先拿「請至少選擇一種通知管道」做測試,故意放到三個位置。

放到頁首 Banner 時確實醒目,但問題只發生在通知設定卡。使用者得先往上找訊息,再回頭找出是哪一組欄位有問題。

改成 Callout,語氣又像儲存前的建議,沒有明確告訴人「剛才的儲存已經失敗」。如果做成會自動消失的 Toast,使用者還沒修完,錯誤原因可能先下班。

最後,我回到網站的 Alert Demo:不選任何通知管道,直接按「儲存通知設定」。警示出現在同一張設定卡裡:

無法儲存通知設定,請至少選擇一種通知管道,再重新儲存。

鍵盤焦點仍留在儲存按鈕。訊息被宣布,但沒有擅自把焦點抓走;使用者下一步可以直接回到通知選項修正。

Vibe UI Atlas 的 Alert 實際 Demo:儲存問題緊貼通知設定,訊息不搶走鍵盤焦點

圖 3:通知設定儲存失敗後,Alert 出現在同一張卡片裡,訊息寫出原因與修正方法。

這種把同一句話搬錯位置的測試,比看三張完成圖更有用。訊息有沒有幫忙,不是看它有多醒目,而是看出現後能不能讓人繼續完成工作。

Alert:回報眼前問題,但不要搶走使用者的位置

在這篇的產品設計語境裡,Alert 是一塊需要立刻注意、但不必把整個流程按下暫停的訊息。它可能使用 ARIA 的 alert 語意,也可能只是留在錯誤區域,再用其他 live region 策略通知變化;不能只因為畫了一個紅框,就一律加上 role="alert"

LumenDesk 的通知設定失敗,就應該讓 Alert 靠近設定卡,並說清楚:

  • 哪一件事沒有完成。
  • 為什麼沒有完成。
  • 使用者要去哪裡修正。
  • 修正後訊息何時離開。

W3C 對 ARIA Alert 的描述很貼近這種「按下儲存後才出現的重要結果」:動態加入的訊息通常會被螢幕閱讀器宣布,也不應改變鍵盤焦點。W3C WAI-ARIA APG:Alert Pattern

但 Alert 不能取代欄位錯誤。若只有一個欄位填錯,具體修法仍要留在欄位附近;若一次有多個問題,再加上表單錯誤摘要。否則整張卡都知道出事了,只有真正填錯的地方保持沉默。

這類阻礙性錯誤也不適合幾秒後自動消失。問題還沒修正,證據就不該先離場。使用者修正通知管道並重新儲存成功後,Alert 才能收起,或改成適合的成功回饋。

還有一個很容易被忽略的細節:同一個錯誤若連續重試,不要每按一次就讓 live region 把完全相同的句子重新喊一遍。需要更新時,可以補上重試失敗的時間、次數或新的原因;內容沒有改變,就不必把輔助科技當成廣播重播機。

Alert 和 Confirmation Dialog 也不是同一件事。停用帳號或刪除資料時,使用者必須先看懂後果,再選擇取消或確認;那是 Dialog 家族。Alert 負責回報眼前狀態,不替危險操作做決定。

Banner:處理跨頁影響,但 role="banner" 不能順手借來用

第二則訊息是系統維護。

LumenDesk 預計在 8 月 12 日 22:00 到 23:00 維護,期間不能調整成員角色。它影響的不是某一個欄位,而是一段時間內的成員管理工作。

這時把通知放在主要內容前比較合理。使用者進入相關頁面時,就能看到維護時間、受影響功能與需不需要提早處理,不必等按鈕失敗後才收到一句「操作失敗」。

Vibe UI Atlas 的 Banner 實際 Demo:維護時間與影響範圍出現在成員清單前,可關閉並重新顯示

圖 4:維護通知放在成員管理主要內容前,交代 8 月 12 日 22:00–23:00 的時間與角色功能影響。

Banner 的內容至少要有:

  • 事件是什麼。
  • 何時開始、何時結束。
  • 哪些功能受到影響。
  • 使用者是否需要提前處理。
  • 關閉後還能去哪裡重新查看。

產品若允許關閉 Banner,也要先決定關閉的有效範圍。只在本頁暫時收起、這次工作階段不再顯示,還是記住到事件版本變更?維護時間若從 22:00 改到 21:30,舊的「已關閉」紀錄不能讓新版公告永遠消失。實務上可以替公告建立版本或事件 ID,內容更新後重新顯示。

這裡有一個名字很像、語意卻完全不同的坑:產品設計常把通知橫條叫做 Banner,但它不等於 ARIA 的 role="banner"

ARIA 的 banner 是網站頁首 landmark,通常包含站點識別、導覽或站內搜尋。一份文件通常不該到處出現這個 landmark。通知元件若因名稱相同就順手套上,輔助科技會讀到一排假頁首。W3C WAI-ARIA 1.2:banner role

GOV.UK 的 Notification Banner 指引也提供很實際的邊界:它適合服務整體問題、接近期限,或前一頁操作的結果;若資訊直接關係到正在處理的欄位,就應放回主要內容。表單驗證錯誤不該只靠頁首 Banner 解決。GOV.UK Design System:Notification banner

Callout:在做決定前給建議,不要把教學文字喊成警報

第三則訊息是「先從最小權限開始」。

它沒有回報錯誤,也不影響整個服務。這句話只需要在管理員選擇新成員角色時出現,幫忙少做一次權限過大的決定。

Vibe UI Atlas 的 Callout 實際 Demo:角色設定旁的最小權限提醒

圖 5:Callout 留在角色選擇附近,提醒新成員先使用檢視者角色,需要時再提高權限。

Callout 的價值是補上決策脈絡。它可以放原則、範例或例外,但內容應該和附近操作直接相關。若只是把整份權限文件搬進卡片,讀者依然不知道這次該怎麼選。

Callout 沒有通用的 ARIA role。它可能依文件關係使用 asidesection,也可能只需要一般段落;不要因為有邊框、圖示或藍色背景,就全部標成 alert

WCAG 對 Status Message 的要求是:頁面在不移動焦點的情況下新增重要狀態時,輔助科技仍要能辨識變化。靜態教學文字沒有緊急事件,不需要假裝自己正在拉警報。W3C WCAG 2.2:Status Messages

網站 Demo 可以把 Callout 標示為已閱讀,但這不等於產品一定要記住閱讀狀態。若內容會影響安全或合規,單純「看過」不能取代真正的授權規則;如果只是一般建議,也不必把每一句提示都變成永久待辦。

訊息排序:嚴重度、範圍與下一步不要混成一個分數

同一頁同時出現多則訊息時,我不會只按顏色排序。

  • 阻礙目前工作的錯誤應靠近操作,並提供修正路徑。
  • 跨頁且有時效的公告應放在主要內容前,交代影響範圍。
  • 局部建議留在決策旁,不必搶走整頁注意力。

這三種訊息可以同時存在,卻不需要互相競爭誰的背景色更亮。真正的優先順序,是使用者能不能完成眼前任務,以及不處理會造成什麼後果。

Alert、Banner 與 Callout 的訊息位置選擇圖:眼前任務的問題使用 Alert,跨頁通知使用 Banner,教學與建議使用 Callout

圖 6:先從使用者正在處理的任務出發,再依影響範圍把訊息放到局部操作、主要內容或決策旁。

我的判斷順序是:先找事件發生的位置,再確認影響範圍,最後寫出下一步。走完後,元件通常已經選好了,還沒必要打開配色表。

改寫 Prompt:把「顯示通知」改成三條訊息路由規則

在 LumenDesk 的成員管理後台建立三種不同訊息,不要把它們全部放到頁首。

1. 通知設定表單:使用者未選任何通知管道就按儲存時,在設定區附近動態顯示 Inline Alert:「無法儲存通知設定:請至少選擇一種通知管道。」Alert 不可自動消失,需保留到問題修正;螢幕閱讀器要能得知新訊息,但不要自動移走鍵盤焦點。欄位旁仍保留具體錯誤與修法。

2. 成員管理主要內容前:顯示 Notification Banner:「8 月 12 日 22:00–23:00 進行系統維護,期間無法變更成員角色。」交代影響範圍和時間,提供「關閉通知」與重新顯示方式。以公告版本識別關閉狀態;時間或內容更新後,要重新顯示。這是視覺通知橫幅,不可使用 role="banner",因為網站 Header 已是頁首 landmark。

3. 角色設定旁:放 Callout「先從最小權限開始」,說明新成員預設為檢視者,需要時再提高權限。它是可持續閱讀的建議,不用 role="alert",也不要做成自動消失的 Toast。

同一錯誤重複送出時,不要無條件重複宣告完全相同的 live message;只有內容、重試結果或原因改變時才更新訊息。

這份 Prompt 沒有指定三個不同顏色,卻把 AI 最容易混在一起的地方拆開了:哪裡出現、影響多大、何時離開、要不要宣布,以及使用者下一步在哪裡。

驗收訊息,先走使用者的下一步

交付前,我會逐則確認:

  • 這是眼前操作的問題,還是會影響其他頁面與一段時間?
  • 訊息有沒有直接寫出事件、原因、影響範圍與下一步?
  • Alert 是否靠近相關欄位或操作,並保留到問題修正?
  • 視覺 Banner 是否交代時間與範圍,也避免誤用 role="banner"
  • 關閉 Banner 後能否重新顯示?公告內容更新時是否會重新出現?
  • Callout 是否真的和附近決策有關,還是只把更多文件塞進頁面?
  • 訊息出現後,鍵盤焦點與螢幕閱讀器各自會得到什麼結果?
  • 同一錯誤連續發生時,是否造成重複宣告或訊息堆疊?

如果 Alert 只寫「發生錯誤」、Banner 沒有時間、Callout 又離決策八百公尺遠,換再漂亮的圖示也還不能交付。

三則訊息站對位置,時間規則又開始出事

最後,我把未選通知管道的錯誤留在設定卡,把維護公告放到主要內容前,再讓最小權限建議待在角色設定旁。

重新操作一次後,使用者不必來回捲動畫面找錯誤,也能在維護前看見影響範圍。三則訊息沒有互相搶工作,開頭那排黃色橫幅也終於可以拆掉。

位置解決了,時間卻又出事。

角色儲存成功,只要短暫告知;移除活動草稿後,要留下復原機會;新的專案申請則不能看過就消失。我把三件事交給 AI 時,只補了一句:

儲存完成後跳一個通知;刪除草稿後也跳同一種。新的申請同樣顯示通知。

LumenDesk 的儲存成功、刪除草稿與專案申請都使用相同通知,並在四秒後消失

圖 7:三件事共用同一種通知和四秒倒數;連復原入口與待處理紀錄,也被當成可以準時下班的東西。

儲存完成可以消失,刪除後的「復原」不能跟著蒸發,新的申請更不該四秒後就當作處理完畢。

明天,這三則訊息會一起走上時間軸。我們來看看 Toast、Snackbar 與 Notification 各自應該活多久,又該在什麼條件下離開。

今日元件入口

參考資料


上一篇
Day 20|滑過去出現的,不一定是 Tooltip:Tooltip、Popover 與 Hover Card
下一篇
Day 22|訊息可以自己消失嗎?Toast、Snackbar 與 Notification
系列文
看得懂、叫得出、驗得過:30 天 VibeCoding UI 元件實戰23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言