弹性开关动画(3 款 Toggle Switch CSS 动效)
3 款自研弹性开关:iOS 绿色回弹、日夜图标交叉切换、迷你尺寸,纯 CSS 实现(隐藏 checkbox + label),回弹缓动过冲真实自然,复制即用。
效果演示(真实可交互)
开关是设置面板最常见的控件,弹性能让它「活」起来:圆钮滑动时带一点过冲回弹,松手后稳稳停在终点,手感接近原生 iOS。演示区 3 款分别适合系统设置、日夜模式切换、紧凑工具栏,均为真实可点击的 checkbox,键盘 Tab 聚焦也有高亮反馈。
完整代码
HTML(隐藏原生 checkbox,label 包轨道与圆钮):
<label class="switch">
<input type="checkbox">
<span class="track"><span class="knob"></span></span>
<span class="text">弹性开关</span>
</label>
CSS(核心三件套:轨道、圆钮、回弹缓动):
.switch { display: inline-flex; align-items: center; gap: 10px; cursor: pointer; user-select: none; }
.switch input { position: absolute; opacity: 0; pointer-events: none; }
.track { position: relative; width: 52px; height: 30px; border-radius: 999px;
background: #dde3f2; transition: background .35s ease; }
.knob { position: absolute; top: 3px; left: 3px; width: 24px; height: 24px;
border-radius: 50%; background: #fff; box-shadow: 0 2px 6px rgba(20,30,70,.25);
/* 关键:cubic-bezier 的 overshoot 产生「弹一下」的过冲 */
transition: transform .35s cubic-bezier(.34, 1.56, .64, 1); }
.switch input:checked + .track { background: #34c759; }
.switch input:checked + .track .knob { transform: translateX(22px); }
无需一行 JS:label 点击原生切换 checkbox,CSS 用相邻兄弟选择器 input:checked + .track 驱动状态。图标开关(日/月交叉旋转)与迷你开关的差异仅在轨道尺寸与圆钮内容,完整写法见演示区 .tg-* 系列。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 回弹力度 | cubic-bezier(.34,1.56,.64,1) | 1.56 为过冲系数,越大弹得越明显 |
| 滑动时长 | transition: transform .35s | 200-400ms 手感最佳 |
| 轨道配色 | input:checked + .track 的 background | 开态颜色,常用绿/主题色 |
| 圆钮行程 | translateX(22px) | 需等于轨道宽度 - 圆钮宽度 - 两侧留白 |
| 尺寸 | .track / .knob 宽高 | 按比例缩放,行程同步换算 |
兼容性与性能
- 纯 CSS 实现,无 JS;隐藏 checkbox 保留原生语义,屏幕阅读器可直接朗读状态
- 动画只走 transform 与 background-color(合成器属性),60fps 流畅
:focus-visible提供键盘焦点轮廓,无障碍友好- 兼容 Chrome / Firefox / Safari / Edge 最新版,无需任何前缀
常见问题
Q: 能商用吗? 可以。本组件为粤喵自研,免费商用无需署名。
Q: 圆钮滑不到位、有缝隙? 行程 translateX 必须精确等于「轨道宽 - 圆钮宽 - 左右内边距」。比如轨道 52、圆钮 24、内边距 3,行程就是 52 - 24 - 6 = 22px。
Q: 想用 JS 控制开关状态? 直接操作隐藏 checkbox:input.checked = true 会同步触发 CSS 动画;如需监听变化用 change 事件,无需操作圆钮本身。
Q: 打开后想要文字跟着变? 用 input:checked ~ .text 选择器给文字换色或换文案即可,注意 HTML 里文字要和 input 是兄弟关系。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布:2026-09-01 · 最近更新:2026-09-01
- 修改日志:2026-09-01 首次发布;2026-09-13 补充许可证与来源标注、复制按钮说明与法务页入口
- 纠错:联系页面 / min@cactus.asia,2 个工作日内核实处理
常见问题
这个组件可以商用吗?
可以。本组件为粤喵自研原创,可免费用于个人和商业项目,无需署名。
浏览器兼容性如何?
支持所有现代浏览器(Chrome / Firefox / Safari / Edge 最新版本)。旧版 IE 不支持 CSS 动画相关特性。
怎么修改动画参数?
直接调整 CSS 中的 animation-duration(时长)、animation-timing-function(缓动曲线)等属性即可,代码中有注释说明。