iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
Vibe Coding

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

Day 25|Card 不是比較漂亮的 List:內容容器怎麼選才讀得懂

  • 分享至 

  • xImage
  •  

安安~我是ChiYu~

專案資料恢復後,AI 很貼心地替每一筆套上圓角、陰影和滑過去會浮起來的效果。三張 Card 排在一起,SaaS 感可以說是相當充足。

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

請把近期專案做成現代、好看的 Card。

結果同一個「下一個里程碑」,分別被放到卡片上方、中間與底部。

三筆專案都被做成 Card,里程碑日期卻散落在不同位置

圖 1:同樣都是里程碑日期,卻待在三個不同位置。三張 Card 個別能讀,放在一起卻很難比較。

接著我只做了一件事:找出哪個專案的下一個里程碑最早。

這下就不太充足了。我得先進第一張 Card 找日期,再把視線移到第二張、第三張;標題、摘要、狀態和操作還輪流跑出來搶版面。

Card 沒壞,是我把需要跨筆比較的任務,塞進了適合獨立閱讀的容器。

Vibe Coding 很容易在這裡被畫面帶著走。只要 Prompt 出現「現代後台」「近期專案」和「好看一點」,Card 幾乎是標準答案。但容器選錯,陰影減半、圓角改成 12px,資料還是一樣難找。

所以今天拿同一批專案做兩個任務:

  1. 找出最早的里程碑。
  2. 收藏一筆想晚點回來看的專案。

Card、List、Description List、Media Object 與 Metadata 都會出場,但裁判不是誰長得比較像 SaaS,而是讀者到底要怎麼讀。

完整 Demo 與選型流程已整理在 Vibe UI Atlas 的內容結構比較頁。

三張 Card 找日期很累,收藏單一專案卻剛剛好

我把三筆專案分別放進 Card 和 List,刻意做兩個方向相反的任務。

第一題是「哪個專案的下一個里程碑最早?」Card 把每筆資料包成獨立區塊,我得逐張鑽進去找日期。換成 List 後,里程碑固定在每列同一位置,視線往下掃就能比較。

第二題改成「收藏 LumenCore 後台改版,晚點再回來看。」這次 Card 反而更自然。專案名稱、狀態、負責人、里程碑和收藏操作都屬於同一筆內容,我不用先理解整張清單,就知道自己正在操作誰。

任務 Card 的結果 List 的結果 我的選擇
比較三筆里程碑 日期散在各張卡片內,視線來回移動 日期維持固定位置,可以直接往下掃 List
理解並收藏一筆專案 摘要與操作能獨立成立 操作仍依賴整列與清單脈絡 Card

這輪沒有容器冠軍。結果很明確:

比較多筆資料時用規律結構;理解並操作單筆內容時,才讓它獨立成卡。

五種內容結構,不是在搶同一個位置

先用同一筆「LumenCore 後台改版」建立資料地圖:

  • 名稱:LumenCore 後台改版
  • 負責人:林子安
  • 狀態:進行中
  • 下一個里程碑:8 月 18 日
  • 說明:重新整理成員管理與批次操作

資料不變,閱讀任務不同,容器就會分工:

讀者正在做什麼 適合的元件 它負責整理什麼
瀏覽幾個可以各自打開的專案摘要 Card 把一筆能獨立成立的內容與操作收在一起
快速掃過多筆專案名稱與狀態 List 讓同類項目維持重複、規律的閱讀順序
查看單一專案的負責人、日期與狀態 Description List 配對一組欄位名稱和值
閱讀帶有縮圖、標題與摘要的動態 Media Object 讓媒體與文字共同辨識一筆內容
補充作者、時間、分類或狀態 Metadata 說明主內容的來源與脈絡

這五個名稱不在同一層競爭。Card 和 List 會改變整批內容的排列;Description List 整理單筆詳細資料;Media Object 是其中一種內容組合;Metadata 則貼著主內容當配角。

如果一開始把它們全部當成容器候選,AI 很容易做出「Card 裡放 List,List 裡再放 Description List,每一列還帶 Media Object 和 Metadata」的俄羅斯娃娃。技術上都能塞,閱讀上不一定需要。

Card:一筆內容能獨立成立,才值得單獨成卡

Card 適合把一筆完整但精簡的內容組成可辨識單位。標題、摘要、狀態與操作都要指向同一個對象;把它從其他卡片旁邊拿走,讀者仍知道這是什麼、可以做什麼。

Card:一筆專案有自己的狀態、摘要與入口

圖 2:LumenCore 後台改版以獨立 Card 呈現,收藏和查看專案各自有清楚入口。

我在網站按下「收藏專案」後,按鈕名稱改成「取消收藏專案」,畫面同時顯示「已收藏 LumenCore 專案」。專案名稱、里程碑和「查看專案」都沒有被改掉。收藏是這筆專案的狀態;查看內容是另一個入口,兩件事沒有混在一起。

整張 Card 可點,不代表裡面每個控制項都能疊在一起

Card 最容易出問題的地方,是「整張都能點」和「裡面還有其他按鈕」同時出現。

若外層是一個連結,裡面又放收藏按鈕、三點選單或 Checkbox,就不能把互動元素互相巢狀,也不該用透明連結蓋住整張卡。那種做法滑鼠看起來很方便,鍵盤焦點、事件觸發和可存取名稱卻會開始互相打架。

比較穩定的做法是:

  • 標題或明確的「查看專案」負責導覽。
  • 收藏、更多操作各自使用自己的 Button。
  • 整張卡片可以有 hover 樣式,但不必因此整張都成為一個巨大 Link。
  • 若真的採用整卡點擊,必須確保內部沒有衝突控制,並讓焦點樣式與點擊行為一致。

卡片裡再塞三四顆同等醒目的按鈕,也會讓主要入口失焦。Card 能獨立成立,不等於它要獨自承擔整個後台。

我也不會因為資料很多就全部改成 Card。卡片高度不同、欄位位置不固定時,跨筆比較會越來越慢。需要比較價格、權限或狀態,結構規律的 List 或 Table 通常更直接。

查看 Card 元件頁

List:重點不是前面有沒有圓點,而是能不能一路掃下去

List 是一組彼此相關、結構重複的項目。它可以只供閱讀,也可以讓每列帶連結或操作;同一層級的項目要維持一致節奏,讀者才不用每看一列就重新學一次版型。

LumenDesk 的 List 把專案名稱、負責人與日期放在固定位置。

List:固定欄位讓讀者快速掃過多筆專案

圖 3:每筆專案沿用相同欄位順序,負責人與里程碑可以由上往下快速掃讀。

把三筆里程碑放回同一位置後,我不必在卡片內找日期,第一個任務也就成立了。若順序本身有意義,例如「最早里程碑」或「最後更新」,畫面還要把排序方式說出來。

List 什麼時候該升級成 Table?

List 也有失控的時候。當每一列開始出現:

  • 多個固定欄位需要垂直對齊。
  • 使用者要依日期、狀態或負責人排序。
  • 需要批次選取與批次操作。
  • 欄位名稱必須有共同表頭。
  • 每列內容高度因為不同區塊而失去規律。

這時 List 已經在偷偷扮演沒有表頭的資料表。後天要談的 Table 會更適合,不用硬把 List 養成另一種元件。

相反地,若每筆只有標題、摘要和一個入口,Table 反而會顯得過重。選型不是看資料筆數,而是看使用者是否需要沿著欄位比較。

查看 List 元件頁

Description List:欄位名稱和值要成對,別讓讀者玩連連看

Description List 適合描述單一對象,例如專案負責人、預算、建立日期與目前狀態。它處理的是「這個欄位的值是什麼」,不是拿來比較很多筆資料的迷你 Table。

Description List:用名稱和值描述單一專案

圖 4:單一專案的負責人、日期與狀態以名稱和值成對呈現,展開後仍保留欄位關係。

W3C 的內容結構教學也將 Description List 說明為彼此關聯的詞語與描述群組。內容確實是名稱和值的關係時,可以使用原生 <dl>、<dt> 與 <dd>。

一個欄名可以有多個值,一個值也可以對應一組名稱,但資料關係要清楚。不要只因版面看起來像左右兩欄,就把所有屬性面板硬塞成 Description List。

語意選對後,手機版改成上下排列,欄位和值的關係仍存在,不會因左右位置消失就斷線。

如果要比較五位成員的部門與角色,Description List 會重複產生五組欄名,讀者還是得一組一組找。這種跨筆比較交給 Table 會比較乾脆。

查看 Description List 元件頁

Media Object:先讓圖片失敗,才知道文字撐不撐得住

Media Object 常見排列是左邊媒體、右邊文字,適合動態消息、留言、文章摘要或人員資訊。真正的判斷不是「我想在左邊放張圖」,而是圖片或 Avatar 是否真的能幫助辨識這筆內容。

Media Object:縮圖、標題與摘要共同組成一筆內容

圖 5:媒體與文字共同呈現一筆內容;Demo 可模擬圖片載入失敗,檢查標題與摘要是否仍能辨識內容。

圖片失敗後,標題與摘要仍要足以完成閱讀,否則這個元件把太多責任壓在一個不保證永遠載得到的資源上。

圖片若只是裝飾,不必讓替代文字重複朗讀標題;圖片本身若提供必要資訊,替代文字就要把那份資訊說出來。若是人物 Avatar,姓名不能只存在於圖片 alt;原頁仍應有可讀姓名。

版面也要測極端內容:沒有圖片、超長標題、兩行摘要、不同長寬比,以及 200% 縮放。固定高度若只適合範例資料,正式內容一來就會開始裁字或把操作推到卡片外面。

目前 Demo 已保留圖片故障情境,正式發布前仍要複驗故障後的閱讀順序與輔助科技結果。畫面沒有散掉,不等於閱讀體驗已經全部通過。

查看 Media Object 元件頁

Metadata:「剛剛更新」很好讀,稽核時卻需要真正時間

作者、更新時間、閱讀時間、狀態與分類常被統稱為 Metadata。它們幫忙交代主內容的新舊、來源與脈絡,位置要靠近主內容,視覺上卻不該搶過標題。

Metadata:作者、時間與狀態緊跟在主內容旁

圖 6:作者、更新時間與狀態靠近主內容;相對時間與精確時間可依閱讀任務切換。

「剛剛更新」適合快速閱讀,但到了稽核或多人協作情境,使用者可能需要真正時間點。這不是二選一:畫面可以先顯示相對時間,再用 <time datetime="…"> 或清楚補充文字提供精確值。

時間還要交代時區。跨國團隊若只看到「8 月 18 日 09:00」,很容易各自在腦中補一個不同時區。日期是否包含年份,也要依資料的新舊與任務決定。

Metadata 字比較小,不代表什麼都能往同一行塞。內容過長時應換行或重新排序;一律截斷,最後留下的可能剛好是最沒用的半句。狀態如果會影響操作,也不能只藏在低對比的小字裡。

查看 Metadata 元件頁

內容容器選型:同一份資料,先問讀者要怎麼讀

Card、List、Description List、Media Object 與 Metadata 的選擇流程

圖 7:先判斷內容能否獨立成立、是否需要快速掃描,以及目前是不是在閱讀一組名稱和值。

我會照這個順序問:

  1. 這一筆內容離開其他項目後,還能獨立成立嗎?可以,才考慮 Card。
  2. 使用者需要快速掃過很多筆同類資料嗎?需要,先考慮 List。
  3. 是否要沿多個固定欄位比較、排序或批次操作?是,就升級成 Table。
  4. 現在是在描述單一對象的一組名稱和值嗎?是,使用 Description List。
  5. 圖片或 Avatar 真的能幫忙辨識內容嗎?能,才使用 Media Object。
  6. 作者、時間與狀態只是補充資訊嗎?把它們當 Metadata,靠近所描述的主內容。

選擇流程沒有硬把所有資料送進今天的五個終點。元件百科不是吃到飽,看到名字不代表一定得選一個。

第二版近期專案:List 負責比較,Card 留給單筆摘要

最後,我把「近期專案」改成結構一致的 List。專案名稱、負責人、狀態與里程碑各自留在固定位置,沿著日期往下掃就能比較。

Card 沒有被刪掉。當使用者要收藏、理解或前往一筆獨立專案時,Card 仍然保留;進入詳細內容後,再由 Description List 配對負責人、日期與狀態。Media Object 只在縮圖確實幫助辨識時出場,Metadata 則貼著標題補充作者與時間。

同一份資料會因閱讀任務不同,進入不同層次的容器。這才是分工,不是把 Card 改醜一點逼它退休。

響應式版面不是把所有欄位直直往下堆

桌面 List 可能把負責人、狀態與里程碑排在同一列,到了 360px 就要重新決定優先順序。

  • 專案名稱與狀態通常先保留。
  • 里程碑若是主要比較欄位,不能被藏進「更多」。
  • 次要 Metadata 可以換行或移到第二列。
  • 操作按鈕要有足夠點擊範圍,不能只剩三個貼在一起的小圖示。
  • 欄位重排後,閱讀順序與 DOM 順序要一致,不能視覺上先看到日期,鍵盤卻最後才走到。

如果手機版為了保留所有桌面欄位,最後每列高到像一張 Card,那就要重新評估:是否改成摘要 List 加詳細頁,而不是硬把整張桌面表格折進口袋。

改寫 Prompt:先交代閱讀任務,再讓 AI 排版

請為 LumenDesk 的近期專案設計內容區塊。

- 使用者主要任務是快速掃過專案名稱、負責人、狀態與里程碑,不是欣賞獨立卡片。
- 預設使用結構一致的 List;每列欄位位置固定,專案標題或明確的「查看專案」負責導覽。
- 收藏與更多操作各自使用 Button,不要用透明 Link 覆蓋整列,也不要巢狀互動元素。
- 當欄位增加到需要共同表頭、排序、批次選取或跨欄比較時,改用 Table,不要把 List 養成沒有表頭的資料表。
- 單一專案詳細資訊使用 Description List,清楚配對欄名和值;手機重排後仍要維持關係。
- 只有一筆專案能獨立成立、需要自己的摘要與操作時才使用 Card。
- 作者、更新時間與狀態是 Metadata,視覺層級低於標題;相對時間要能取得精確時間與時區。
- 圖片載入失敗後,文字仍能辨識內容;裝飾圖片不要重複朗讀標題。
- 提供 Loading、Empty、Error 與 360px 手機版;手機版依任務重新排序欄位,不要只靠縮小文字塞下全部內容。

這份 Prompt 沒有規定 Card 要幾度圓角。它把 AI 不能自行猜測的部分寫清楚:主要閱讀任務、哪些內容能獨立、互動入口如何分工、何時升級成 Table,以及圖片與手機版出問題時要留下什麼。

驗收內容容器:好看之外,八個任務要真的做得完

  1. 容器是否反映讀者正在「看一筆」或「比較多筆」?
  2. Card 離開其他卡片後,仍能說清楚自己並完成單筆操作嗎?
  3. Card 的 Link、Button 與選取控制是否互不衝突?
  4. List 的同層項目是否維持相同結構、欄位位置與閱讀順序?
  5. 需要排序、批次操作與跨欄比較時,是否已改用 Table?
  6. Description List 的名稱和值是否真的成對,手機重排後也不會斷掉?
  7. Media Object 的圖片失敗、缺少或比例改變後,文字是否仍能辨識內容?
  8. Metadata 是否靠近主內容,提供精確時間,又沒有搶走標題層級?

目前已確認 Card 的收藏狀態會從「收藏專案」改為「取消收藏專案」,並顯示「已收藏 LumenCore 專案」;近期專案也已改用 List 支援跨筆掃讀。圖片故障後的閱讀順序、200% 縮放與正式輔助科技結果仍待發布前複驗,這幾項先不假裝打勾。

專案資料終於好讀,旁邊的小膠囊卻開始集體撞臉

開頭那三張 Card 不是做錯元件,而是被交付了不適合的任務。現在 List 負責跨筆掃讀,Card 處理獨立摘要與操作,Description List 整理單筆欄位;Media Object 和 Metadata 也回到需要它們的位置。

資料排整齊後,下一個問題反而更顯眼。每列旁邊都有一排彩色小膠囊:待處理數量、分類、已選成員、篩選條件、同步狀態和負責人全部長得很像,有些能按、有些不能按。

我當時又補了一句:

請在每筆專案旁加上彩色標籤,顯示數量、分類、已選成員、篩選、同步狀態和負責人。

Badge、Tag、Chip、Filter Chip、Status Indicator 與 Avatar 都使用相同的灰色膠囊外觀

圖 8:六顆膠囊外觀完全相同,只有「陳怡安 ×」和「進行中」會改變資料。其餘四顆看起來也能按,實際上只是資訊。

有一說一,彩色版本至少還能靠顏色硬記;我把顏色拿掉後,這排元件直接集體失去身分。哪一顆能按、哪一顆只是說明,畫面完全沒有答案。

明天就從同一張灰階畫面繼續。Badge、Tag、Chip、Filter Chip、Status Indicator 與 Avatar 都很小,但它們承諾的事情可不能一起縮水。

參考來源

資料查閱:2026-08-07。


上一篇
Day 24|畫面空白,不代表沒有資料:Empty、Error、Offline、Permission 與 Success State
下一篇
Day 26|小型標記怎麼分工?Badge、Tag、Chip、Filter Chip、Status 與 Avatar
系列文
看得懂、叫得出、驗得過:30 天 VibeCoding UI 元件實戰 共 27 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言