单选框动画(圆点弹性放大 + 波纹扩散选中动效)
单选框动画组件:选中时圆点弹性放大、外圈波纹扩散,另附分段选择器变体,原生 radio 实现保证表单语义,纯 CSS 自研零依赖。
效果演示(真实可交互)
演示区上方是三个经典单选项:点击任意一项,圆点从中心弹性放大弹出,同时选中项外圈扩散出一圈波纹并淡出,未选中项的圆点自动收起。下方是一个分段选择器变体(日间 / 夜间 / 自动),选中项填充渐变背景并微微弹跳,适合做设置面板或筛选器的视觉升级。
切换选项:圆点弹性放大,选中项外圈波纹扩散;下方为分段选择器变体
完整代码
HTML(原生 radio 加双层圆点结构):
<label class="rdo">
<input type="radio" name="demo" />
<span class="rdo-mark"><span class="rdo-dot"></span></span>
单选项文字
</label>
CSS(圆点弹性放大 + 伪元素波纹扩散):
.rdo input { position: absolute; opacity: 0; }
.rdo-dot {
width: 10px; height: 10px; border-radius: 50%;
background: linear-gradient(135deg, #6c8cff, #8a5cff);
transform: scale(0); /* 默认隐藏 */
}
.rdo input:checked + .rdo-mark .rdo-dot {
animation: rdo-pop .35s cubic-bezier(.34, 1.56, .64, 1) forwards; /* 过冲回弹 */
}
.rdo input:checked + .rdo-mark::after {
content: ""; position: absolute; inset: -3px; border-radius: 50%;
border: 2px solid rgba(108, 140, 255, .5);
animation: rdo-ping .5s ease-out; /* 外圈波纹 */
}
@keyframes rdo-pop { from { transform: scale(0); } to { transform: scale(1); } }
@keyframes rdo-ping { from { transform: scale(.7); opacity: 1; } to { transform: scale(1.5); opacity: 0; } }
两层动画分别落在不同元素上:圆点用 cubic-bezier(.34, 1.56, .64, 1)——Y 值超过 1 产生过冲,圆点会先弹过目标大小再回正,手感活泼;波纹用 ::after 伪元素画一圈描边圆,从 0.7 倍放大到 1.5 倍并淡出,模拟「选中冲击波」。name 相同保证同一组 radio 互斥,选中态全部由 CSS :checked 驱动,无需一行 JS。
参数说明
| 参数 | 位置 | 说明 |
|---|---|---|
| 弹跳过冲 | rdo-pop 的 cubic-bezier | 第四项 1.5-1.7,越大弹得越猛 |
| 波纹半径 | rdo-ping 的 scale(1.5) | 1.3-1.8,控制扩散范围 |
| 波纹颜色 | ::after 的 border 颜色 | 跟随主题色半透明即可 |
| 圆点大小 | .rdo-dot 的宽高 | 约为外圈半径的一半最协调 |
| 分组互斥 | input 的 name 属性 | 同名即互斥,必填 |
兼容性与性能
- 纯 CSS 实现,无 JavaScript;:checked 选择器与 transform 动画兼容 Chrome 26+ / Safari 7+ / Firefox 20+ / Edge
- 动画只涉及 transform 与 opacity,合成器处理;伪元素不增加 DOM 节点,多个选项组同页性能无忧
- 保留原生 radio 语义,表单提交、键盘方向键切换、屏幕阅读器播报全部可用
- 分段选择器变体复用同一套 checked 逻辑,改样式即可适配不同场景
常见问题
Q: 点击选项时圆点没弹出来? 检查 .rdo-dot 是否设置了 transform: scale(0) 初始态,以及 checked 选择器层级是否正确(input 与 .rdo-mark 必须相邻)。
Q: 波纹扩散一次后就不再出现? ::after 的动画只在 checked 状态变化时触发。同一组内切换选项时,新选中项的波纹会正常播放;反复点击已选中项不会重播,这是预期行为。
Q: 想让分段选择器的选中项加滑动动画? 可以组合滑动指示条:为分段容器加 position: relative,用 JS 测量选中项位置并驱动一个绝对定位的指示层,与标签指示器组件(tab-indicator-animation)是同一套思路。
Q: 能商用吗? 可以。本组件为粤喵自研原创实现,免费商用无需署名。
许可与来源
- 许可证:自研原创 —— 粤喵自研原创,可免费用于个人与商业项目,无需署名。查看来源公示与许可清单
- 来源:粤喵团队原创自研(从效果思路到代码实现均为独立完成,未直接复制第三方代码)
- 首次发布: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(缓动曲线)等属性即可,代码中有注释说明。