Toggle Switch: phản hồi tức thì bằng chuyển động

Toggle là một trong những micro interaction phổ biến nhất — và cũng là nơi animation dễ bị làm sai nhất. Một toggle “đúng” không chỉ đổi màu; nó mô phỏng chuyển động vật lý của một công tắc thật.

app.example.com/settings

Notifications

Control how and when you get notified.

Push notifications Receive alerts on your device
Email digest Daily summary at 8:00 AM
Sound Play sound for new messages
Badge count Show unread count on app icon
Show previews Preview message content in alert

Click vào toggle để bật / tắt

Hai thứ tạo nên cảm giác vật lý

Thumb spring: cubic-bezier(0.34, 1.56, 0.64, 1) — control point > 1 tạo overshoot nhẹ, giống thumb thật bị búng qua điểm đích rồi nảy lại. Không cần keyframe thêm.

Background transition: đổi màu đồng thời với thumb nhưng dùng ease thay vì spring — nền là diện tích lớn, không cần physical feel, chỉ cần rõ ràng và mượt.

Tại sao thumb nhỏ hơn track

Track cao 26px, thumb 20px — chênh 6px (3px mỗi bên). Padding này làm thumb trông “nằm trong” track thay vì “dính vào” track. Khoảng trắng nhỏ tạo depth perception mà không cần shadow thêm.

Trạng thái focus

Toggle là control keyboard-accessible: role="switch" + aria-checked. Focus ring dùng box-shadow thay vì outline để kiểm soát màu và radius. Chỉ dùng :focus-visible — không hiện ring khi dùng chuột.

Khi nào dùng toggle vs checkbox

ToggleCheckbox
Tác dụng ngay lập tức (không cần Submit)Cần Submit để áp dụng
On/off rõ ràngCó thể cần indeterminate state
Mobile-first, touch target cần rộngForm truyền thống