iT邦幫忙

2026 iThome 鐵人賽

DAY 19
0
Vibe Coding

別再只叫 AI 做漂亮一點:30 天 Vibe Coding UI 元件驗收實驗系列 第 19

Day 19|點資料表一列後,不一定要跳 Modal:Drawer、Sheet 與 Bottom Sheet

  • 分享至 

  • xImage
  •  

Day 19|點資料表一列後,不一定要跳 Modal:Drawer、Sheet 與 Bottom Sheet

安安~我是ChiYu~

昨天,我才用 Escape 取消了「停用林子安」這個危險動作。帳號保住了,管理員也沒有因此下班,反而接著問我:

那我可以先看一下林子安的部門、角色和目前專案嗎?

很合理。停用帳號以前先把資料看完,總比按下去之後才開始考古好。

於是我把需求改成:

點成員資料表的一列,顯示完整資料。

昨天結尾就停在下面這張圖。這是我依照第一版需求,在網站上重建的錯誤現場;它不含真實帳號與個人資料:

成員詳細資料的錯誤第一版:林子安的資料顯示在置中 Modal,背景成員清單被遮罩鎖住,無法直接比較下一位

圖 1:和昨天結尾是同一張畫面。林子安的資料出現了,原本拿來比較的成員清單卻被遮罩鎖住。

AI 很快就交出一張置中的白色卡片,背景順便變暗。林子安的資料確實出現了,但其他成員的部門與角色也被蓋得乾乾淨淨。

想比較下一位成員?先關掉 Modal、記住剛才看到的內容,再打開另一位。畫面沒有壞,使用者的記憶力倒是被當成系統資源用得很勤勞。

這就是今天的問題:詳細資料出現時,原本的工作脈絡還要不要留在畫面上?

我們會用 LumenDesk 的虛構成員管理情境,拆開 SheetDrawerBottom Sheet。所有人名與資料都只是示範,不會連到真實帳號。

我也把這組選型放進 Vibe UI Atlas 的 Dialog、Drawer 與 Bottom Sheet 比較頁。文章負責講判斷過程,網站則可以直接操作 Demo、對照差異與複製 AI Prompt。

在看個別元件以前,先看今天真正的岔路在哪裡:

Vibe UI Atlas 的 Dialog、Drawer 與 Bottom Sheet 比較:從原頁脈絡與裝置寬度選擇出口

圖 2:選擇浮動面板時,先看原頁是否仍有用,再看任務長度和裝置空間。

這張圖最值得記住的不是三個元件名稱,而是第一個問題:「背景裡的資料還有沒有用?」只要答案是有,就不該反射性地用一張置中卡片把它全部遮住。

這裡還有一條很容易被名稱蓋掉的界線:Drawer、Sheet 與 Bottom Sheet 是設計系統常用的視覺與版型名稱,不是各自對應一個固定的 ARIA 角色。背景要不要鎖住、焦點要不要限制在面板內,仍要由任務決定。面板從右邊滑出來,不會自動獲得「可以操作背景」的能力。

管理員只想看資料,AI 卻把整張清單關燈

我先在桌面版 Demo 點了「查看林子安的資料」。右側面板打開後,林子安的部門、角色與加入日期出現在眼前,背景的三筆成員資料仍然看得見。

注意,是「看得見」,不是「還能點」。目前網站 Demo 的 Drawer 裡可以變更角色,因此採用模態行為:背景清單保留作為視覺脈絡,但操作暫停,焦點也留在面板裡。若產品要讓管理員直接點下一列、逐人比對,那就要改成 Non-modal Drawer,並另外設計焦點如何在清單與面板之間移動。

更重要的是,面板標題直接寫「林子安」,不是一個放到誰身上都成立的「詳細資料」。使用者不需要猜自己剛才到底點了哪一列。

看完後,我故意什麼都不改,直接按 Escape。

結果是:

  • 面板關閉。
  • 資料沒有變更。
  • 焦點回到原本的查看按鈕。
  • 狀態文字顯示「已用 Escape 關閉面板;沒有變更資料」。

這串結果看起來很普通,卻是 Drawer 真正有價值的地方。使用者只是暫時靠近一筆資料,看完還能回到原本的位置;至於能不能在面板開啟時直接比較其他成員,則要看它被定義成 Modal 還是 Non-modal,不能只看面板從哪裡滑出來。

如果 Prompt 只寫「從右邊滑出一個漂亮面板」,AI 大概會把動畫做得很順。至於關閉後回哪裡、資料有沒有偷偷改掉、清單還剩多少可以看,那就只能靠緣分了。

Sheet 是面板家族,不是免填規格通行證

Sheet、Drawer、Bottom Sheet 這三個名稱,最容易卡住人的其實是 Sheet。

在不同設計系統與元件套件裡,Sheet 的定義不一定完全相同。這篇把它當成一個比較泛用的家族稱呼:有一塊浮動面板,用來承載內容或操作。

問題是,「有一塊面板」只說了一半。至少還缺兩件事:

  • 它從哪裡出現?置中、右側、左側,還是底部?
  • 面板開啟後,背景還能不能操作?

同樣是白底、圓角和陰影,可能是要求使用者先處理完的 Dialog,也可能是保留資料表脈絡的 Drawer,還可能是手機底部的 Bottom Sheet。外觀很像,工作方式卻完全不同。

我在 Sheet 元件頁 放了一個刻意寫完整的版本:面板置中出現、背景暫停、Escape 可以關閉。以互動語意來看,它就是一個 Modal Dialog,只是使用 Sheet 的視覺樣式。Sheet 不能代替我們回答模態與否。

Vibe UI Atlas 的 Sheet 實際 Demo:置中面板、背景暫停與關閉操作

圖 3:Sheet 描述的是浮動面板樣式;這個 Demo 另外指定置中、模態與 Escape 關閉,所以互動上屬於 Modal Dialog。

所以當我跟 AI 說「做一個 Sheet」時,我不會把這句當成需求已經寫完。它比較像是在說「我要一台車」:四輪、兩輪、載人還是載貨,最好還是補一下。

Drawer 不只是從右邊飛進來

Drawer 通常從畫面側邊滑出。這個方向很常見,但從右邊滑出來只是外觀,保留原頁脈絡才是用途。原頁可以只是留在眼前,也可以繼續操作;兩者差很多,Prompt 必須選一個。

在 LumenDesk 裡,管理員本來就在成員清單比對部門、角色與狀態。點擊林子安後,如果右側打開 Drawer,原本的列、排序與篩選結果還留在旁邊,使用者就知道自己從哪裡來,也能接著查看下一位。

網站上的 Drawer Demo 就是這個情境:

Vibe UI Atlas 的 Drawer 實際 Demo:資料表仍保留在背景,右側面板只處理林子安的角色

圖 4:右側 Drawer 顯示林子安的資料與角色操作;這個 Demo 保留背景清單的視覺脈絡,但在編輯期間暫停背景操作。

我會在 Drawer 裡放這些內容:

  • 姓名、部門、目前角色與加入日期。
  • 一項短小而明確的編輯,例如變更角色。
  • 關閉、取消與儲存出口。

但我不會把一張十幾欄的完整表單、分三步才能完成的邀請流程,或需要大量閱讀的設定頁塞進去。那些工作縮到側邊不會變簡單,只會讓捲動、比對與錯誤修正一起變辛苦。

你可以直接操作 Drawer Demo:選擇角色後按儲存,只會更新示範訊息;按 Escape 或取消則會關閉面板,並把焦點還給原本的開啟按鈕。

因此我會這樣記:Drawer 的價值不是「不用跳頁」,而是「原頁仍值得留在眼前」。 若原頁還必須能操作,再明確加上 Non-modal 規格;若面板正在編輯資料,採 Modal 也合理,但不能假裝背景還能點。

手機沒有那麼多右邊可以借

把同一個情境搬到 360px 手機上,桌面 Drawer 很快就出事了。

左邊想留一點清單,右邊又要塞完整資料,最後兩邊都只剩一條縫。這時候若只是把 Drawer 改成「由下往上滑」,名字換成 Bottom Sheet,工作也只完成一半。

手機上的 Bottom Sheet 還要重新決定:

  • 面板要顯示摘要,還是承擔完整編輯?
  • 主要動作放在哪裡,拇指是否容易碰到?
  • 除了拖曳手勢,有沒有清楚可見的關閉按鈕與系統返回路徑?
  • 底部有沒有安全留白?
  • 內容超過一個畫面後,要繼續往下堆,還是轉到完整頁面?

今天的 Demo 只保留林子安的摘要,以及「查看完整資料」和「變更角色」兩個下一步。需要編輯更多欄位時,就進完整頁面,不讓 Bottom Sheet 一路長到使用者開始懷疑自己是不是打開了另一個網站。

Android 的官方文件也把 Bottom Sheet 描述為錨定在畫面底部、用來呈現次要內容的表面。這很適合「先看摘要,再決定下一步」,不是把桌面設定頁整包塞進手機。Android Developers:Create a bottom sheet

我把這個情境放到 360px 的網站 Demo 裡實際檢查:

Vibe UI Atlas 的 Bottom Sheet 實際 Demo:360px 寬度下保留把手、摘要與兩個下一步

圖 5:手機版 Bottom Sheet 保留可見把手、關閉按鈕、成員摘要與兩個下一步,沒有把完整表單硬塞進去。

拖曳把手只是「這張面板可能可以移動」的提示,不是所有人都能理解或操作的關閉控制。在 Bottom Sheet Demo 裡,使用者還能按可見的關閉按鈕或 Escape;面板不會造成整頁水平捲動,關閉後焦點也會回到「快速查看林子安」。這些都比「滑上來的動畫有沒有很絲滑」更值得驗收。

浮在畫面上,不代表它們是同一種東西

到這裡,可以把幾個出口擺回同一張工作桌上:

使用者正在做的事 最需要留下什麼 建議出口 不要硬塞成
在桌面資料表查看或比對成員 原本的列、排序與篩選脈絡 Drawer;再決定 Modal 或 Non-modal 把清單完全遮住的置中面板
只看一段摘要,再決定下一步 目前頁面與一兩個主要動作 Sheet,但要補方向與背景規則 只有「做一個 Sheet」的模糊需求
在手機快速查看或處理少量動作 拇指可及性與底部安全空間 Bottom Sheet 被硬壓窄的桌面 Drawer
編輯多欄資料、跨步驟審核或長篇閱讀 完整工作空間與可分享網址 完整頁面 不斷加高、加寬的浮動面板

還有一個不能混進來的情境:如果管理員不是「查看林子安」,而是要「停用林子安的帳號」,使用者就必須先理解後果並做出決定。這時候仍應使用昨天的 Confirmation Dialog,不是在 Drawer 角落塞一顆紅色按鈕,希望大家都不要手滑。

W3C 對 Modal Dialog 的要求很明確:開啟後背景內容不可操作、焦點留在對話框內、Escape 提供可預期的關閉方式,關閉後焦點通常回到原本的觸發元素。W3C WAI-ARIA APG:Modal Dialog Pattern

如果還是拿不定主意,可以照這張圖走一次:

浮動介面選型地圖:先判斷是否中斷背景、是否需要保留列表脈絡,以及螢幕寬度

圖 6:先判斷使用者是否必須停下來回應,再看原頁脈絡是否有用,最後才處理裝置寬度。

我的判斷順序不會從「哪個元件比較新潮」開始,而是先問:這是中斷、查看,還是完整工作?元件名稱只是最後替這個判斷貼上的標籤。

把「右邊滑出來」改成可以驗收的 Prompt

原本那句「點一列,顯示完整資料」把裝置、內容範圍與返回路徑全部留給 AI 猜。改寫後,我會這樣交代:

在 LumenDesk 的成員管理頁製作「查看成員詳細資料」流程。

桌面版:使用者點選成員列表中的「林子安」後,從右側開啟 Drawer。保留背景資料表的視覺脈絡;Drawer 顯示姓名、部門、角色與加入日期,只允許變更一個角色欄位。因為這次包含編輯,採 Modal 行為:背景暫停操作,焦點留在面板內。提供關閉、取消與儲存;Escape 或取消不變更資料,關閉後焦點回到開啟 Drawer 的按鈕。若需求改為直接逐列比對,才改用 Non-modal Drawer,並補上清單與面板之間的鍵盤移動方式。

手機版:改用 Modal Bottom Sheet,從底部顯示林子安摘要與「查看完整資料」「變更角色」兩個動作。除了可見拖曳把手,還要提供明確的「關閉」按鈕、Escape/系統返回路徑與足夠底部安全留白;背景暫停操作,並在 360px 寬度下不能出現水平捲動。關閉後焦點回到開啟入口。

若需要編輯多個欄位、跨多步驟或長篇說明,改到完整頁面;不要塞進 Drawer 或 Bottom Sheet。停用帳號等高風險動作另用 Confirmation Dialog。

這段 Prompt 沒有要求「像現代 SaaS」,但它把真正會影響操作的條件說清楚了:桌面保留什麼、手機留下什麼、關閉後回哪裡,以及內容長大後該從哪個出口離開。

Vibe Coding 要的不是把所有 UI 名詞都塞進 Prompt。先做出選型判斷,再把不能被 AI 自由發揮的界線寫進去,通常更有用。

交付前,別讓面板偷偷長成另一個頁面

我會沿著這條路徑驗收:

  • 使用者需要立刻做決定,還是只是查看細節?
  • 原本的資料表、列表或畫布,是否仍是理解這筆資料的重要脈絡?
  • 面板只放摘要與少量動作,還是已經被塞成長表單?
  • Sheet、Drawer 與 Bottom Sheet 的出現方向、背景是否可操作,有沒有分別寫清楚?
  • 手機版是否真的改成 Bottom Sheet 或完整頁面,而不是把桌面 Drawer 硬壓窄?
  • 開啟後焦點在哪裡?Escape、取消與關閉後又會回到哪裡?

只要其中一題開始答得很勉強,通常不是再多加一點寬度就能解決,而是這份內容已經該搬到完整頁面了。

清單留住了,角色問號卻長成一間迷你設定頁

最後,我在桌面選擇 Drawer,在手機改用 Bottom Sheet。兩邊都只保留摘要與少量下一步;按 Escape 關閉時,資料不會改變,焦點也回到原本的觸發點。

和昨天的 Confirmation Dialog 相比,今天沒有逼管理員先回答一個危險問題,而是讓他靠近資料、看完,再回到原本的清單繼續工作。開頭那句「顯示完整資料」,也終於從一張遮住所有東西的白色卡片,變成可以依裝置與任務驗收的介面。

不過 Drawer 裡又冒出三個需求:角色欄位旁的問號要解釋權限規則、管理員要能變更角色,滑過主管姓名時還想先看一份人物摘要。最初的 Prompt 把它們揉成一句:

「在問號圖示上滑過去,顯示詳細說明和操作。」

下面這張圖,是我依照第一版需求在網站上重建的錯誤現場,不含真實帳號與個人資料:

角色說明的錯誤第一版:問號 Tooltip 同時放入權限說明、角色選擇、儲存按鈕與主管預覽,而且只交代滑鼠 Hover

圖 7:短提示被做成迷你設定頁。滑鼠一移開,權限說明、角色選擇、儲存按鈕和主管資料就一起消失。

這張 Tooltip 看起來很會做事,實際上同時扛了說明、操作與人物預覽。鍵盤怎麼打開、觸控裝置要按哪裡,以及滑鼠移進按鈕後浮層會不會收起來,需求全都沒有交代。

明天,我們就從 Drawer 裡繼續拆 Tooltip、Popover 與 Hover Card。滑過去會出現,只能證明它會出現;至於裡面該放說明、操作還是人物摘要,那又是另一場選型現場。

今日元件入口

參考資料


上一篇
Day 18|彈窗要不要鎖住背景?Modal、Non-modal、Alert Dialog 與危險確認
下一篇
Day 20|滑過去出現的,不一定是 Tooltip:Tooltip、Popover 與 Hover Card
系列文
別再只叫 AI 做漂亮一點:30 天 Vibe Coding UI 元件驗收實驗20
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言