前端開發 別再只叫 AI 做漂亮一點:30 天 Vibe Coding UI 元件驗收實驗 · 第 15 / 30 篇

Day 15|同一區域怎麼切換內容?Tabs、Accordion、Disclosure 與 Segmented Control

2026 iThome 鐵人賽 Vibe Coding UI Day 15:安安~我是ChiYu~ 昨天把 Breadcrumb、Stepper、Pagination 和完成進度分開後,我總算不會再用一條藍線回答所有問題。接著進入工作區設定,畫面又送來一排整整齊齊的 Tabs。 當時我留給 AI 的需求只有…

快速導覽 查看本文目錄

本文同步自 2026 iThome 鐵人賽原文 。完整系列可見 iThome 系列頁 。

安安~我是ChiYu~

昨天把 Breadcrumb、Stepper、Pagination 和完成進度分開後,我總算不會再用一條藍線回答所有問題。接著進入工作區設定,畫面又送來一排整整齊齊的 Tabs。

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

把設定頁內容分區,畫面做得精簡一點。

下面是依這句需求重建的第一版,不含真實資料:

工作區設定的錯誤第一版:設定、說明與檢視模式全部被放進同一排 Tabs

圖 1:同一排放了八個 Tab,現在只顯示一般設定;另外七類內容全得靠使用者逐一打開尋找。

AI 很俐落。一般設定一個 Tab、成員權限一個 Tab、雙重驗證一個 Tab、資料保留說明一個 Tab,連列表、看板和行事曆也排成一列。

原本塞滿內容的設定頁確實變短了,代價是每一段內容都得先躲起來。

操作幾次後,問題開始跑出來:

  • 為什麼雙重驗證和資料匯出規則不能同時打開比較?
  • 資料保留明明只是一小段補充,為什麼要切走整個面板?
  • 列表和看板只是同一批專案的不同看法,怎麼長得像在切換網站頁面?

這些內容都會「切換」或「收合」,關係卻完全不同。只寫「做成 Tabs,畫面乾淨一點」,AI 會很努力替每一段內容找地方藏,卻不會自動知道哪些內容互相平行、哪些需要同時閱讀。

我把四種關係放進 Tabs、Accordion、Disclosure、Segmented Control 完整比較頁 :

內容切換元件比較頁:平行面板、長內容分段、補充資訊與檢視模式各有責任

圖 2:一般設定、進階規則、補充說明與檢視模式都能被切換,但它們不該全住進 Tabs。

先說出內容關係,再決定要切換還是收合

內容關係LumenDesk 的例子適合的元件使用者正在做什麼
幾個平行工作區一般設定/成員與權限/通知Tabs一次進入一個完整面板。
可以獨立閱讀的長段落邀請限制/雙重驗證/資料匯出設定Accordion展開一段,也可能同時比較兩段。
原地補上一小段可選說明資料保留期限的解釋Disclosure想知道時才展開,不離開目前脈絡。
同一批資料的局部檢視列表/看板/行事曆Segmented Control立刻換一種觀看方式。

有一個很好用的反向檢查:兩塊內容如果需要同時閱讀或同時修改,就不要為了「看起來乾淨」把它們關進互斥的 Tab。

乾淨是畫面結果,內容關係才是元件選擇的原因。

如果還在兩個候選之間猶豫,可以沿著這張圖往下判斷:

Tabs、Accordion、Disclosure 與 Segmented Control 的選型地圖

圖 3:先問內容是平行、分段、補充,還是同一批資料的檢視模式,再決定切換或收合。

這張圖不是把四條路導向四種造型,而是先確認內容關係。只要所有答案最後都通往 Tabs,需求大概還停在「幫我藏起來」這一層。

切換元件不只顯示或隱藏,還要保存自己的狀態

內容被藏起來後,資料並沒有因此消失。每種元件都要先決定:切換前的輸入、目前選取與錯誤狀態要不要保留?

元件需要保存的狀態最容易漏掉的規則
Tabs目前面板、各面板尚未送出的輸入與載入結果切去別的 Tab 後,剛填的內容被重設;遠端面板反覆重新載入。
Accordion哪些段落已展開,以及段落裡的輸入或錯誤收合後錯誤也一起失蹤,使用者只知道表單送不出去。
Disclosure目前是否展開,以及補充內容與主內容的關係把必要規則藏起來,沒展開就無法完成任務。
Segmented Control目前檢視模式,以及共用的搜尋、篩選與選取狀態從列表切到看板後,資料範圍和選取項目全部重設。

這些規則不一定要用相同方式保存,但不能交給 AI 臨時猜。切換只是畫面動作;切換後使用者原本做到哪裡,才是產品行為。

平行面板用 Tabs:按下 End 後,四個位置要一起換

Tabs 元件頁 使用「一般設定、成員與權限、通知」三個同層級面板。這些內容沒有先後依賴,先看通知或先看一般設定都不會破壞任務。

UI 元件百科的 Tabs 實際操作畫面

圖 4:選到「通知」後,Tab 的選取狀態、下方面板、狀態文字與焦點要一起更新。

一個 Tab 對應一個 tabpanel。目前項目使用 aria-selected="true",下方內容也要跟著換。只有藍色底線從「一般設定」滑到「通知」,面板還在顯示成員權限,那不是切換,只是底線自己出去散步。

我先把焦點放在「一般設定」,再按 End。接著對照四個位置:

檢查位置實際結果
選取狀態「通知」成為目前 Tab。
可見面板顯示 Email、站內通知與每週摘要。
狀態文字更新為「目前顯示『通知』」。
鍵盤焦點留在 Tablist,可繼續使用方向鍵、Home 或 End。

四個結果一起同步,Tab 和 Tabpanel 才真的綁在一起。

Tabs 的鍵盤行為還要先決定自動或手動啟用。LumenDesk 三個面板已在本機載入,因此方向鍵、Home、End 移到新 Tab 時會直接換面板。內容若要等 API 回來,我會改成手動啟用:先移動焦點,再由使用者按 Enter 或 Space 決定是否載入。W3C 也只建議在面板能無延遲顯示時使用自動啟用。 W3C WAI:Tabs Pattern

遠端載入還會多一層狀態:第一次打開時顯示 Loading,失敗時讓目前面板重試,切走再回來是否沿用快取也要先決定。不能每按一次方向鍵就重新呼叫 API,讓鍵盤導覽順便變成壓力測試。

面板裡若有尚未儲存的表單,切換 Tab 後要保留輸入;真的準備丟棄內容時,應明確提醒,而不是因為面板不可見就當作資料可以一起清掉。

昨天的四步驟申請則不適合 Tabs。申請人資訊填完才走到權限設定,內容有先後依賴,應交給 Stepper。

需要比較的長段落用 Accordion;一小段補充才用 Disclosure

Accordion 允許多段一起打開

工作區的邀請限制、雙重驗證與資料匯出設定都是完整段落。有人只想查看其中一段,也有人需要把兩段規則一起攤開核對,因此 Accordion 元件頁 允許多段同時展開。

360px 手機版的 Accordion 實際操作畫面

圖 5:手機版維持單欄閱讀,兩段進階規則也能同時展開,不會互相把對方關掉。

每段標題要有合適層級的 Heading,Heading 裡再放完整可操作的 Button;展開時更新 aria-expanded,並用 aria-controls 對應內容區。箭頭只是狀態提示,不能縮成唯一可點的地方。

一次只能開一段,還是能同時開很多段,要由內容決定。這次需要比對規則,所以允許多段展開;若打開新內容會讓前一段失去意義,才適合互斥。W3C 的 Accordion Pattern 沒有規定所有 Accordion 都必須玩打地鼠。 W3C WAI:Accordion Pattern

必要欄位與錯誤訊息不要藏進收合區。使用者連「哪裡填錯」都得先猜該展開哪一段,表單只會更短,不會更好修。表單送出失敗時,包含第一個錯誤的段落至少要自動展開,或由摘要提供能展開並定位的路徑。

收合也不應清空段落裡尚未送出的資料。Accordion 在整理閱讀空間,不是在替表單執行 Reset。

Disclosure 只在原地補一段說明

資料保留期限旁邊只有一段方案說明,不需要為它切走整個設定面板。 Disclosure 元件頁 在原位置放了一個「顯示資料保留說明」,需要時再展開。

Vibe UI Atlas 的 Disclosure 實際 Demo:在原本脈絡展開一段可選補充資訊

圖 6:補充文字在目前設定旁展開,讀者沒有被送到另一個面板。

Disclosure 適合定義、備註或一小段規則。內容簡單時,原生 <details> 與 <summary> 已經能提供鍵盤可用的展開/收合,不必急著自己重做整套控制。 MDN:<details>

它和 Accordion 的差別不只在數量。Disclosure 是主要內容旁的可選補充;Accordion 則組織幾段相對完整、可獨立閱讀的內容。當 Disclosure 裡開始塞 FAQ、三組安全設定和一張資料表,它已經不是補充,根本是偷偷搬了一間套房進去。

反過來,會影響使用者決策的必要規則也不應只躲在 Disclosure 裡。若使用者不展開就可能填錯或誤解後果,那段資訊應直接留在主要內容,Disclosure 只補充細節。

同一批資料換看法,交給 Segmented Control

專案仍是同一批,只是有時想看列表,有時需要看板或行事曆。 Segmented Control 元件頁 把三種檢視放在資料旁邊,切換後立刻更新附近內容。

Vibe UI Atlas 的 Segmented Control 實際 Demo:切換列表、看板與行事曆的局部檢視

圖 7:列表、看板與行事曆共用同一批專案資料,改變的是觀看方式。

HTML 沒有一個叫 Segmented Control 的原生元素,所以規格要先選語意模型。LumenDesk 的三種檢視一次只能選一種,這次採單選 Radio Group:方向鍵移動時一併改變選取模式,附近資料也立即更新。 W3C WAI:Radio Group Pattern

只讓「看板」外觀變藍,下方繼續排著列表,和剛才只會散步的 Tab 底線是同一個問題。若控制項其實在執行粗體、對齊或排序命令,則應改用 Button/Toggle Button 模型,不要看見膠囊外觀就一律塞進 Radio Group。

切換檢視時,搜尋字、篩選條件與目前選取的專案通常仍應保留,因為資料沒換,只是看法不同。若看板不支援列表的某項狀態,也要明確交代如何轉換,而不是默默把條件清空。

產品如果希望使用者分享「看板檢視」或重新整理後維持原模式,可以把檢視寫入 URL 或偏好設定。這是產品決策,不是 Segmented Control 自帶的能力;至少要避免畫面顯示看板,網址與重新整理結果卻永遠回到列表。

Segmented Control 適合少量、名稱短而且互斥的模式,不適合全站導覽。選項變多、名稱變長,或開始出現上下層關係時,這排控制很快就會變成被壓扁的 Navbar。 Material Design 3:Segmented button

改寫 Prompt:不要只告訴 AI「把內容藏起來」

為 LumenDesk 工作區設定頁設計內容切換方式。請依內容關係選元件,不要把所有內容都做成 Tabs。

1. Tabs:一般設定、成員與權限、通知是三個同層級面板。選取狀態與可見面板同步。三個面板已預先載入,因此採自動啟用:Tab 進入目前項目,左右方向鍵、Home、End 移動焦點時也同步切換面板;若日後改成遠端載入,改採 Enter 或 Space 手動啟用,並提供 Loading、Error 與重試。切換面板時保留尚未送出的輸入,不可因面板隱藏而重設資料。這不是填表流程。

2. Accordion:邀請限制、雙重驗證、資料匯出設定是可獨立閱讀的長段落。每段使用符合頁面層級的 Heading,Heading 裡放帶有 aria-expanded 與 aria-controls 的 Button。本案例允許同時展開多段,方便比對規則;收合不得清空輸入。不要把必要欄位或錯誤訊息藏起來,送出失敗時要能展開並定位到問題段落。

3. Disclosure:在資料保留設定旁放「顯示資料保留說明」。展開後只顯示一段保留期限文字,留在原位置;優先使用 details/summary。完成任務不可缺少的規則直接顯示,不要藏在 Disclosure 裡。

4. Segmented Control:以列表、看板、行事曆切換相同專案資料的局部檢視。使用有名稱的單選 Radio Group,一次只選一種模式;方向鍵移動時同步更新目前模式文字與附近資料預覽。切換時保留搜尋、篩選與可相容的選取狀態;若需要分享或重新整理後保留模式,將目前檢視寫入 URL 或偏好設定。不要拿它當全站導覽。

360px:所有操作保留完整文字;Tabs 可在自己的列內捲動,但整頁不能水平溢出;Accordion 與 Disclosure 維持單欄閱讀。

交付前,我不只輪流點一遍,而是沿著四種承諾操作:

  1. 在一般設定填入尚未儲存的值,再用左右方向鍵、Home、End 切換 Tabs,確認焦點、選取、面板與資料都沒有各走各的。
  2. 同時展開兩段 Accordion,收合後再打開,確認內容能一起閱讀,輸入與錯誤狀態也還在。
  3. 展開再收合 Disclosure,確認主要設定沒有跟著消失,而且必要規則不必展開才看得到。
  4. 從列表切到看板、再切到行事曆,確認模式文字、資料預覽、搜尋與篩選一起保留。

畫面變短不等於內容變清楚。這四條路走得通,精簡才有意義;否則只是把內容藏起來,讓使用者自己尋寶。

內容關係整理完,三點選單又把資料值和命令排在一起

工作區設定現在各自有位置:平行面板使用 Tabs,能同時比較的長段落交給 Accordion,一小段補充由 Disclosure 原地展開,列表、看板與行事曆則用 Segmented Control 切換同一批資料。

我回到專案列表,最後一欄只放了一顆三點按鈕。展開後依序出現「進行中、編輯、刪除」。

專案列表的錯誤第一版:任務狀態、編輯與刪除全部被放進同一顆三點按鈕

圖 8:「進行中」會保存資料,「編輯」和「刪除」則會立刻執行命令;第一版卻讓三個項目共用同一種外觀。

三個項目排得很整齊,問題也藏得很整齊。使用者按下 Enter 前,根本看不出這次是在替任務選狀態,還是在對資料下命令。

明天就從這顆三點按鈕繼續,把「保存一個值」與「執行一件事」分開。

延伸閱讀

資料查閱:2026-08-07。

讀完了!你覺得這篇如何?

你的回饋會決定下一篇要寫什麼。

還有疑問

Learning path

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

這篇是系列中的第 15 / 30 篇。可以順著列表補完整脈絡,也可以直接跳到需要的段落。

  1. 01 Day 1|AI 不是不會做,是你只說「做得好看一點」
  2. 02 Day 2|這些東西到底叫什麼?Component、Pattern、Layout 與 Template
  3. 03 Day 3|一份 AI 看得懂的 UI Spec,至少要交代這 8 件事
  4. 04 Day 4|按鈕不只是藍色方塊:Button、Link 與操作元件
  5. 05 Day 5|輸入文字也有分工:Text Field、Textarea、Password 與 Search
  6. 06 Day 6|五種選擇控制怎麼分?Checkbox、Radio、Switch、Toggle Button 與 Segmented Control
  7. 07 Day 7|別再把所有下拉都叫 Dropdown:從 Select 到 Multi-select 的選型指南
  8. 08 Day 8|數值要輸入、拖曳還是評分?六種數值控制的選型
  9. 09 Day 9|輸入日期、選時間還是看整月?五種日期時間元件怎麼選
  10. 10 Day 10|檔案不是選完就好:上傳流程的完整狀態
  11. 11 Day 11|表單錯了,怎麼帶人修回來?從 Label 到 Validation Summary 的修正路徑
  12. 12 Day 12|進階輸入不是越多越完整:OTP、Tag Input、Color Picker 與兩種 Editor
  13. 13 Day 13|手機版不是把 Sidebar 縮小:Header、Navbar、Sidebar 與 Bottom Navigation 怎麼分工
  14. 14 Day 14|使用者走到哪裡了?Breadcrumb、Pagination、Stepper、Progress 與頁內導覽
  15. 15 Day 15|同一區域怎麼切換內容?Tabs、Accordion、Disclosure 與 Segmented Control 目前閱讀
  16. 16 Day 16|選一個值,還是執行命令?Select、Menu、Overflow Menu 與 Command Palette
  17. 17 Day 17|資料有層級時,別只用縮排:Tree View、Nested List、Treegrid 與 Expandable Row
  18. 18 Day 18|彈窗要不要鎖住背景?Modal、Non-modal、Alert Dialog 與危險確認
  19. 19 Day 19|點資料表一列後,不一定要跳 Modal:Drawer、Sheet 與 Bottom Sheet
  20. 20 Day 20|滑過去出現的,不一定是 Tooltip:Tooltip、Popover 與 Hover Card
  21. 21 Day 21|重要訊息到底該放在哪裡?Alert、Banner 與 Callout
  22. 22 Day 22|訊息可以自己消失嗎?Toast、Snackbar 與 Notification
  23. 23 Day 23|Loading 不能只放一顆圈圈:五種等待狀態怎麼選
  24. 24 Day 24|畫面空白,不代表沒有資料:Empty、Error、Offline、Permission 與 Success State
  25. 25 Day 25|Card 不是比較漂亮的 List:內容容器怎麼選才讀得懂
  26. 26 Day 26|小型標記怎麼分工?Badge、Tag、Chip、Filter Chip、Status 與 Avatar
  27. 27 Day 27|Table 不是 Data Table:功能越多,不代表資料越好用
  28. 28 Day 28|圖片要展示、選擇、輪播還是放大?七種媒體元件怎麼分工
  29. 29 Day 29|同一句「幫我做後台」,28 天後我不再先看畫面
  30. 30 Day 30|AI 交出畫面不等於完成:30 天後,我改用任務驗收 UI

Further reading

Day 30|AI 交出畫面不等於完成:30 天後,我改用任務驗收 UI 封面圖 2026-09-30 Day 30|AI 交出畫面不等於完成:30 天後,我改用任務驗收 UI Day 29|同一句「幫我做後台」,28 天後我不再先看畫面 封面圖 2026-09-29 Day 29|同一句「幫我做後台」,28 天後我不再先看畫面 Day 28|圖片要展示、選擇、輪播還是放大?七種媒體元件怎麼分工 封面圖 2026-09-28 Day 28|圖片要展示、選擇、輪播還是放大?七種媒體元件怎麼分工

留言討論

用 GitHub 帳號留言,留言會同步到這個 Blog 的 GitHub Discussions。

閱讀導覽

約 10 分鐘

本文目錄

本篇所在系列 · 第 15 / 30 篇

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

  1. Day 1|AI 不是不會做,是你只說「做得好看一點」
  2. Day 2|這些東西到底叫什麼?Component、Pattern、Layout 與 Template
  3. Day 3|一份 AI 看得懂的 UI Spec,至少要交代這 8 件事
  4. Day 4|按鈕不只是藍色方塊:Button、Link 與操作元件
  5. Day 5|輸入文字也有分工:Text Field、Textarea、Password 與 Search
  6. Day 6|五種選擇控制怎麼分?Checkbox、Radio、Switch、Toggle Button 與 Segmented Control
  7. Day 7|別再把所有下拉都叫 Dropdown:從 Select 到 Multi-select 的選型指南
  8. Day 8|數值要輸入、拖曳還是評分?六種數值控制的選型
  9. Day 9|輸入日期、選時間還是看整月?五種日期時間元件怎麼選
  10. Day 10|檔案不是選完就好:上傳流程的完整狀態
  11. Day 11|表單錯了,怎麼帶人修回來?從 Label 到 Validation Summary 的修正路徑
  12. Day 12|進階輸入不是越多越完整:OTP、Tag Input、Color Picker 與兩種 Editor
  13. Day 13|手機版不是把 Sidebar 縮小:Header、Navbar、Sidebar 與 Bottom Navigation 怎麼分工
  14. Day 14|使用者走到哪裡了?Breadcrumb、Pagination、Stepper、Progress 與頁內導覽
  15. Day 15|同一區域怎麼切換內容?Tabs、Accordion、Disclosure 與 Segmented Control
  16. Day 16|選一個值,還是執行命令?Select、Menu、Overflow Menu 與 Command Palette
  17. Day 17|資料有層級時,別只用縮排:Tree View、Nested List、Treegrid 與 Expandable Row
  18. Day 18|彈窗要不要鎖住背景?Modal、Non-modal、Alert Dialog 與危險確認
  19. Day 19|點資料表一列後,不一定要跳 Modal:Drawer、Sheet 與 Bottom Sheet
  20. Day 20|滑過去出現的,不一定是 Tooltip:Tooltip、Popover 與 Hover Card
  21. Day 21|重要訊息到底該放在哪裡?Alert、Banner 與 Callout
  22. Day 22|訊息可以自己消失嗎?Toast、Snackbar 與 Notification
  23. Day 23|Loading 不能只放一顆圈圈:五種等待狀態怎麼選
  24. Day 24|畫面空白,不代表沒有資料:Empty、Error、Offline、Permission 與 Success State
  25. Day 25|Card 不是比較漂亮的 List:內容容器怎麼選才讀得懂
  26. Day 26|小型標記怎麼分工?Badge、Tag、Chip、Filter Chip、Status 與 Avatar
  27. Day 27|Table 不是 Data Table:功能越多,不代表資料越好用
  28. Day 28|圖片要展示、選擇、輪播還是放大?七種媒體元件怎麼分工
  29. Day 29|同一句「幫我做後台」,28 天後我不再先看畫面
  30. Day 30|AI 交出畫面不等於完成:30 天後,我改用任務驗收 UI
看完整系列 30 篇