CSS 切換開關產生器每次都會產生相同的輸出,因為程式碼片段中的每個數值都是由您直接控制的輸入,透過封閉式方程式計算而來。軌道寬度、軌道高度、內部間距、轉場持續時間、關閉顏色、開啟顏色,以及旋鈕顏色全都存在於您的瀏覽器中,工具會將旋鈕直徑計算為「高度減去兩倍間距」,並將滑動距離計算為「寬度減去高度」,然後將這些像素值寫入它所回傳的 CSS 中。內容不會被上傳、保存或傳送到遠端服務,因此今天的工作階段和明天的工作階段,只要輸入相同的數值,就會產生相同的 CSS。預覽、CSS 區塊和 HTML 區塊是在同一個流程中由相同的輸入所產生,這就是為什麼您在預覽中看到的內容,正好就是您貼上的內容。若要重現相同的結果,您只需要記錄這七個輸入值,因為幾何形狀、顏色和時間設定全都源自於它們。

「相同結果」對切換開關而言代表什麼
一個可重現的 CSS 切換開關必須在三個屬性上於不同執行次數之間保持一致:可見的幾何形狀、顏色處理,以及無障礙行為。幾何形狀涵蓋軌道寬度與高度、兩側的內部間距、旋鈕直徑,以及關閉與開啟位置之間的水平滑動距離。顏色處理涵蓋關閉軌道顏色、開啟軌道顏色、旋鈕顏色,以及焦點可見的外框顏色,產生器會將外框顏色與所選的開啟顏色保持一致。無障礙行為則涵蓋原生 checkbox 輸入、提供此控制項無障礙名稱的周圍 label 文字、保留在輸入上而非視覺軌道上的焦點可見外框,以及 CSS 指派給背景與變換效果的 ease 時間關鍵字。
當這三個群組一致時,兩次獨立產生的結果在瀏覽器中看起來與運作起來都會完全相同。只要其中任何一項出現偏差,使用者就會看到不同的控制項,例如較寬的開關、較深的軌道、會跳動而非滑動的旋鈕,或消失不見的外框,儘管兩份程式碼在技術上都是有效的 CSS。因此,可重現性是一個記錄輸入並信任算術的問題,而非記住輸出的問題。
鎖定幾何形狀的輸入限制
產生器強制採用嚴格的整數範圍與完整的六位數 HEX 顏色,因此程式碼片段不會漂移成負數尺寸或隱藏的值。最重要的跨輸入規則是寬度必須至少比高度多 8 像素,這能確保開啟與關閉位置在視覺上有明顯區別。如果您設定 width = 56 且 height = 50,工具會純粹基於邏輯拒絕這個組合,而不會產生超出軌道範圍的旋鈕或接近零的滑動距離。同樣的邏輯也保護了間距設定:如果旋鈕大小為零或負數,該輸入會在產生任何 CSS 之前就被拒絕。
| 輸入 | 允許範圍 | 格式 | 限制存在的原因 |
|---|---|---|---|
| 軌道寬度 | 36 至 120 | 完整像素 | 保持開關在可辨識且適合行動裝置的大小 |
| 軌道高度 | 20 至 64 | 完整像素 | 限制旋鈕大小,使其在軌道內保持可見 |
| 內部間距 | 2 至 8 | 完整像素 | 必須在軌道內保留一個正的旋鈕大小 |
| 轉場持續時間 | 0 至 2000 | 完整毫秒 | 零會停用插值;上限則讓動畫保持俐落 |
| 關閉、開啟與旋鈕顏色 | 精確六位數 HEX | #RRGGBB | 讓產生器能在不猜測的情況下拒絕無效的顏色 |
因為每個輸入都有固定的格式,且下游使用封閉式方程式,所以使用相同七個數值的兩次執行,會在相同位置產生相同的像素。這就是可重現輸出背後的完整機制。
如何每次都重現相同的開關
- 開啟 CSS 切換開關產生器,並記下七個數值:軌道寬度、軌道高度、內部間距、轉場持續時間、關閉顏色、開啟顏色,以及旋鈕顏色,全部使用上方限制表格中所列的格式。
- 將這七個數值輸入產生器,並觀察預覽,直到切換開關以您記下的顏色從關閉動畫到開啟。
- 點擊軌道或周圍的 label 來切換預覽狀態,確認未勾選與已勾選狀態在複製前看起來都正確。
- 使用 Copy CSS 將樣式表片段複製到剪貼簿,然後貼到您專案的樣式表中;label 標記則另外使用 Copy HTML 複製。
- 將 label 元素中的範例 label 文字替換為您產品實際需要的二元設定,例如電子郵件通知或深色模式。
- 將這七個數值儲存到程式碼註解、設計權杖檔案或操作手冊中,這樣下一個人或下一個衝刺週期就能重新輸入它們並產生相同的程式碼片段。
- 整合完成後,透過 Tab 鍵切換到開關、按下 Space 鍵進行切換,並將瀏覽器縮放至 200% 與 400% 來調整大小,重新測試以確認相同的控制項仍然可以運作。
為何幾何方程式能保證相同的輸出
產生器將其尺寸計算的數學邏輯直接暴露在它所回傳的 CSS 中,因此沒有任何隱藏的元件相依性會發生漂移。固定外觀的兩個方程式是:旋鈕大小等於軌道高度減去兩倍間距;滑動距離等於軌道寬度減去軌道高度。未勾選的起始位置與已勾選的變換值都是由這些數字和所選的間距所推導,因此一旦您固定三個尺寸輸入,每個像素也就跟著固定。膠囊形軌道使用的圓角半徑等於其高度的一半,而圓形旋鈕則使用其自身大小的一半作為半徑,這代表圓角兩端同樣來自這些相同的輸入。
以 width = 60、height = 32、padding = 4 為例的計算過程:
- 旋鈕大小 = 高度 − 2 × 間距 = 32 − 2 × 4 = 24 px。
- 滑動距離 = 寬度 − 高度 = 60 − 32 = 28 px。
- 未勾選的旋鈕位置從所選的間距開始,因此旋鈕從軌道左邊緣的 4 px 處開始。
- 已勾選的旋鈕位置套用 translateX(28 px),因此旋鈕結束於軌道右邊緣的 4 px 處。
- 驗算:間距 + 旋鈕 + 滑動距離 = 4 + 24 + 28 = 56 px,且寬度 − 間距 = 60 − 4 = 56 px,因此兩端共享相同的 4 px 內部間距。
將這些精確的像素貼到 CSS 檔案中,會產生一個與預覽中完全相同的開關,因為產生器和您的樣式表在相同的輸入上使用相同的算術。只要您在任何裝置上重新輸入 width 60、height 32 和 padding 4,您每次都會得到相同的 24 px 旋鈕和相同的 28 px 滑動距離。如需深入了解背後的數學原理,請參閱以精確幾何建立 CSS 切換按鈕的逐步說明。
貼上後驗證重現的結果
重現只有在貼上的開關仍符合您的無障礙標準時才有用。將程式碼片段放入產品後,請執行產生器建議用於其自身預覽的相同檢查,因為框架、重置樣式和設計系統可能會悄悄改變片段本身無法控制的行為。
| 檢查項目 | 應觀察的內容 | 確認位置 |
|---|---|---|
| 鍵盤啟動 | Tab 鍵聚焦於輸入;Space 鍵切換勾選狀態 | 在瀏覽器中手動測試 |
| 焦點對比 | 焦點外框在實際頁面背景上保持可見 | 在實際頁面上以 Tab 鍵進入開關 |
| 狀態用詞 | 開啟與關閉狀態無需僅依賴顏色即可區分 | 閱讀周圍的 label 和任何輔助文字 |
| 放大至 400% | 控制項在瀏覽器最大縮放下仍可見且可用 | 瀏覽器縮放控制項 |
| 強制色彩模式 | 軌道和旋鈕保留形狀並具有明確的開啟或關閉狀態 | Windows 高對比或 forced-colors 模擬 |
| 減少動畫 | 開關在沒有平滑插值的情況下仍能正確切換 | 將持續時間設為 0,或在目的地樣式表中新增 prefers-reduced-motion 覆寫 |
如果貼上後任何檢查失敗,問題通常出在某個框架包裝層攔截了原生 checkbox 的勾選處理程式、某個 CSS 重置移除了 focus-visible 外框,或某個父層主題的背景使焦點顏色消失。產生器不會產生 hover、disabled、invalid、loading 或 read-only 的呈現方式,因此如果設計需要,生產環境的設定畫面必須另外新增這些樣式。
當貼上的開關與預覽不同時
有幾種情況會產生與預覽不符的開關,即使程式碼片段並未變動。最常見的是像 React 或 Vue 這類框架改寫了 class 屬性、改變了 label 將點擊傳遞給 input 的方式,或新增了會覆寫原生 checked 屬性的受控狀態。當框架的 change 處理函式非同步觸發,或開發者將 input 上的 checked 換成 value 時,鍵盤啟動就會失效。請在需要時將 class 改為 className、保持語意化的 input 巢狀於 label 內,並讓原生 input 驅動 checked 狀態,而非使用平行的 prop。原生 input 仍會支援 checked 狀態、空格鍵啟動、聚焦以及表單送出,這正是讓程式碼片段成為真正的表單控制項而非裝飾用 div 的原因。
另一個原因是 CSS 重置或設計系統移除了 input 上的 appearance: none、還原了預設的核取方塊繪製,或移除了 focus-visible 的外框。MDN 的 appearance 參考文件說明了為何 appearance: none 是移除預設控制項繪製同時保留原生行為的標準做法。由於產生器依賴該屬性來隱藏原生控制項,並依賴瀏覽器的聚焦環來提供無障礙功能,任何針對它進行重置的設定都會明顯地破壞開關。請將程式碼片段包在 class 範圍內,或將其放在重置規則之後的串接位置。
第三個原因是動畫。如果產品的全域樣式表在 input 上將 transition-duration 設為非零值,即使程式碼片段中使用相同的持續時間,旋鈕的動畫速度仍會與預覽不同。請將片段中的 transition 放入自訂屬性中,或將 transition 的範圍僅限於 toggle 類別,這樣產生器的精確持續時間仍能控制滑動。由網路支援的狀態變更也應在 CSS 之外處理,因為一個視覺上承諾了變更卻未能持久儲存的開關,對使用者的誤導程度遠大於伺服器回應緩慢。
CSS 切換開關的可重複性歸結為三件事:記錄七個輸入、信任確定性的本地方程式,以及在整合後重新執行無障礙檢查。CSS 切換開關產生器使用相同的數字進行相同的運算來建立每個程式碼片段,從不上傳任何內容,並以純像素值公開其幾何資訊,因此你今天設計的開關,明天也能僅憑一份書面輸入清單重新建立。
如果你正在權衡各種選項,比較 CSS 三角形做法並選擇正確方法對此有詳細說明。