當底層狀態本質上是二元值、需要在頁面切換間保持,並且能受益於原生表單語意(例如 Space 鍵啟動、聚焦和提交)時,CSS 切換開關就是正確的控制元件。要產生一個正確的切換開關,最佳方法是從原生 HTML 核取方塊著手,使用 CSS appearance: none 隱藏其預設繪製效果,然後只在外層的真實輸入元素上重建視覺軌道和圓鈕。這樣一來,鍵盤操作、螢幕閱讀器播報和表單連結都保持完整,不必再用 ARIA 在裝飾性的 div 上重新打造它們。一個專門的產生器若能公開其尺寸計算公式、接受有界整數範圍,並輸出同步的 CSS 和 HTML,讓你能在寫程式碼前預覽幾何形狀,這正是大多數手寫開關最後出現負邊距或圓鈕脫離軌道問題的最關鍵原因。本篇文章接下來將逐步說明如何比較常見做法、為什麼原生核取方塊產生器符合正確標準清單,以及產生經過驗證的無障礙切換開關的具體步驟。

比較產生 CSS 切換開關的常見做法
四種實務做法幾乎涵蓋所有網頁專案:在真實核取方塊上手寫 CSS、以 ARIA 建立裝飾性 div、引入框架元件,或使用瀏覽器端工具產生同步的 CSS 和 HTML。每一種都在控制權、無障礙負擔和最終結果的可審查性之間取捨。
在原生核取方塊上手寫 CSS 是最輕量的做法。你保留表單輸入,撰寫一小段 CSS,並繼承 checked 狀態、Space 鍵啟動、聚焦和提交。缺點是幾何形狀由你負責:如果選擇的內距把圓鈕整個包住,或寬度小於高度,圓鈕就會落在軌道之外。
搭配 ARIA 的自訂 div 看起來靈活,但把所有無障礙責任都轉嫁到你團隊身上。你必須撰寫 role="switch"、aria-checked、聚焦管理、標籤關聯和螢幕閱讀器行為。漏掉一個屬性,控制元件就會在輔助技術中默默失效。這條路只有在二元狀態必須存在於表單之外時才合理,而這種情況很少見。
框架元件(Material、Radix、Headless UI、Element Plus)提供預設視覺、測試和主題機制。你用可審查性換取速度:底層幾何和聚焦樣式藏在你沒有撰寫的依賴套件內部。自訂尺寸可能需要覆寫 CSS 變數,而未受控的狀態可能會在元件內部掩蓋原生核取方塊的行為。
像 CSS Toggle Switch Generator 這類瀏覽器端產生器介於手寫和元件函式庫之間。它在原生核取方塊上重建外觀、在輸出中公開尺寸計算公式,並且完全在本機執行,因此沒有任何設定或程式碼會離開你的瀏覽器。
為什麼原生核取方塊產生器符合正確做法
決定「正確做法」的標準是可以預期的:真實的表單語意、可審查的幾何、有界輸入,以及可以逐像素閱讀的輸出。原生核取方塊已經提供 checked 狀態、Space 鍵啟動、聚焦和表單提交。在 div 上重建這些功能需要撰寫多行 ARIA 程式碼,並持續跨螢幕閱讀器測試,這些心力不如花在產品層面。
公開計算公式的產生器讓審查者掌握主導權。你可以閱讀 CSS 並確認圓鈕直徑等於軌道高度減去兩倍內距,且 checked 狀態的移動距離等於軌道寬度減去軌道高度。當設計系統審查會議問「這些數字從哪來?」,而答案是你能打開的單一原始檔案時,這種透明度至關重要。
有界輸入能防止靜默錯誤。在輸出前拒絕無效組合的產生器,可以避免你發出圓鈕脫離軌道的開關。CSS Toggle Switch Generator 特別強制執行三項規則:寬度必須至少比高度多八個像素、內距必須在軌道內留下正值的圓鈕,以及三種顏色都必須是有效的六位數十六進制值。
使用 CSS Toggle Switch Generator 打造開關
不論你是在設計設定畫面、通知面板或功能旗標,產生器的工作流程都相同。按照以下步驟操作,就能不寫任何 JavaScript 而產生無障礙、同步的 CSS 和 HTML。
- 設定軌道寬度、軌道高度、內部內距、過過轉場持續時間,以及關閉、開啟和圓鈕顏色,同時切換即時預覽以確認兩種狀態下的幾何形狀都正確。
- 使用兩個複製按鈕分別複製 CSS 和 HTML。把像 "Enable feature" 這類範例標籤文字替換為簡潔、貼近實際的設定名稱,例如 "Email notifications" 或 "Dark mode",以使用者語言描述二元狀態。
- 在將要使用該開關的產品中,驗證狀態措辭、鍵盤操作、聚焦對比、縮放行為、強制色彩模式呈現、減少動效行為和狀態持續性。
範例刻意保留 input type="checkbox" 是有原因的:切換開關代表一種二元的表單狀態,而原生輸入免費提供 checked 狀態、Space 鍵啟動、聚焦和表單提交。CSS 使用 appearance: none 移除預設核取方塊繪製效果,同時保留底層輸入功能。輸入元素被嵌套在可見的標籤文字內,使整個標籤區域都可點擊,且控制元件具有可存取名稱。除非二元狀態確實必須存在於表單之外(這種情況很少見),否則不要改用搭配 ARIA 的 div。
輸入範圍與其背後的幾何原理
三個範圍和三個幾何公式決定了輸出。寬度接受 36 到 120 的整數像素值。高度接受 20 到 64 的整數像素值。寬度必須至少比高度多 8 個像素,使開啟與關閉位置在視覺上保持明顯區隔。內距接受 2 到 8 個像素,且必須在軌道內留下正值的圓鈕。持續時間接受 0 到 2000 的整數毫秒值。三種顏色都需要完整的六位數十六進制輸入。
幾何原理僅有兩個公式。圓鈕大小等於軌道高度減去兩倍內距。移動距離等於軌道寬度減去軌道高度。實際範例:當軌道寬度為 60 px、軌道高度為 32 px、內距為 4 px 時,圓鈕大小為 32 減 2 乘以 4,等於 24 px。移動距離為 60 減 32,等於 28 px。端到端的驗算為內距(4)加上圓鈕(24)加上移動距離(28)加上內距(4),等於 60 px,與軌道寬度一致。
由於公式很簡單,產生的 CSS 直接在像素宣告中呈現數值,而不是將其藏在元件依賴內。這讓審查變得簡單:打開輸出、查看數字、驗證關係。
上線前的整合檢查
三項整合檢查決定產生的開關能否在實際產品中存活。第一項是框架整合。在 React 或 Vue 中,必要時把 class 改為 className,但保持原生輸入和標籤的關係不變。受控狀態整合如果 checked 與 change 處理函式不匹配,可能會破壞原生互動,因此要測試 Tab 鍵能否到達開關、Space 鍵能否切換,以及可見位置是否符合底層 checked 值。
第二項檢查是減少動效。在產生器中將持續時間設為零可消除可見的插值效果,並確認狀態仍會翻轉。當基於使用者偏好應停用動畫時,請在目的樣式表中加入減少動效的媒體覆寫,將 transition-duration 設為 0。如需更深入地了解如何移除過過,請參閱移除所產生的 CSS 切換開關中的過過。
第三項檢查是狀態持續性與錯誤處理。產生的程式碼不會儲存設定、不執行網路操作,也不回報失敗的更新。任何需要寫入伺服器的狀態變更都必須在此 CSS 之外處理待處理和失敗狀態,因為視覺上的開關不應承諾一個未實際保存的變更。如需清楚了解界線在哪裡,請參閱所產生的 CSS 切換開關程式碼是否會儲存設定?。
最後,請根據實際頁面背景驗證聚焦外框。focus-visible 外框保留在原生輸入上、使用所選的開啟顏色,並從軌道偏移出來而非被移除。在產生器預覽中看起來明顯的顏色,在其他主題上可能會消失,因此請直接檢查目的頁面。
一覽式做法比較
| 做法 | 表單語意 | 開箱即用的鍵盤支援 | 幾何可審查性 | 狀態持續層 |
|---|---|---|---|---|
| 在原生核取方塊上手寫 CSS | 原生 | 實作正確時為是 | 僅當你公開計算公式時 | 自行打造 |
| 搭配 ARIA 切換開關的自訂 div | 自行處理 | 需要 ARIA 和聚焦管理 | 不適用 | 自行打造 |
| 框架元件函式庫 | 依元件而異 | 依元件而異 | 藏在依賴內部 | 依元件而異 |
| 瀏覽器端 CSS 產生器 | 保留原生核取方塊 | 是 | 輸出中可見計算公式 | 自行打造 |
正確的選擇通常對應到能保留原生表單語意、需要最少新無障礙程式碼,並且仍可審查幾何的那一列。對大多數網頁專案來說,最後一列是最短路徑。如需更深入的標準背景,MDN 文件化了 CSS appearance,而 CSS Basic User Interface Level 4 定義了產生器所依賴的 外觀切換行為。
當切換開關是錯誤的控制元件時
切換開關不適合用於一次性動作、多選選項,或不需要以設定形式保存的狀態。Submit、Confirm、Run 等操作應該使用按鈕。音量大小、字級、方案等級則應使用選項按鈕群組或滑桿。如果切換狀態的後果具有破壞性或難以復原,那麼確認步驟或復原機制會比切換開關更為準確。先依底層語意選擇控制元件,再考慮視覺呈現方式。