菜单选择动画
菜单选择动画
单选按钮切换时的掉落动画效果,流畅的过渡动画体验。
▼ 点击切换查看动画
单选按钮切换时的掉落动画效果,流畅的过渡动画体验。
这是一个极具创意的单选按钮动画效果——当用户在菜单中选择不同选项时,已选中的圆点会有一个"掉落"的动画效果,仿佛在菜单中滚动一样。动画使用了 Web Animations API 实现平滑的过渡。
核心特性
- 掉落动画:选中项切换时有弹跳掉落效果
- 平滑过渡:使用 cubic-bezier 缓动函数
- 深色模式:自动适配系统主题
- Web Animations API:原生 JavaScript 动画接口
完整代码
以下是完整的单文件代码,你可以直接保存为 .html 文件运行:
HTML
<form>
<label>
<input type="radio" name="os" data-option="0" value="windows" checked>
Windows
</label>
<label>
<input type="radio" name="os" data-option="1" value="mac">
Mac
</label>
<label>
<input type="radio" name="os" data-option="2" value="linux">
Linux
</label>
</form>CSS
@import url('https://fonts.googleapis.com/css2?family=DM+Sans&display=swap');
* {
border: 0;
box-sizing: border-box;
margin: 0;
padding: 0;
}
:root {
--hue: 223;
--bg: hsl(var(--hue),90%,80%);
--fg: hsl(var(--hue),90%,10%);
--radio-off: hsl(var(--hue),90%,90%);
--radio-on: hsl(var(--hue),90%,50%);
--radio-down: hsl(var(--hue),90%,70%);
--trans-dur: 0.3s;
}
body {
background-color: var(--bg);
display: flex;
height: 100vh;
}
form {
background-color: hsl(0,0%,100%);
border-radius: 0.75em;
margin: auto;
padding: 0.75em;
min-width: 15em;
}
label {
display: flex;
align-items: center;
padding: 0.75em 0.75em 0.75em 3em;
position: relative;
}
input[type="radio"] {
position: absolute;
bottom: 0.75em;
left: 0.75em;
width: 1.5em;
height: 1.5em;
-webkit-appearance: none;
appearance: none;
}
input[type="radio"]:checked {
background-color: var(--radio-on);
}
/* 深色模式 */
@media (prefers-color-scheme: dark) {
:root {
--bg: hsl(var(--hue),90%,10%);
--radio-off: hsl(var(--hue),90%,40%);
--radio-on: hsl(var(--hue),90%,90%);
}
form {
background-color: hsl(var(--hue),90%,20%);
}
}JavaScript
class DroppingRadioButtons {
optionID = 0;
optionAAnim = null;
optionBAnim = null;
constructor(el) {
this.el = document.querySelector(el);
this.el.addEventListener("change",this.updateOption.bind(this));
}
updateOption(e) {
const nextOption = +e.target.getAttribute("data-option");
if (this.optionID !== null) {
this.animateOption(this.optionID, nextOption);
}
this.optionID = nextOption;
}
animateOption(optionA, optionB) {
// 动画实现代码...
}
}
window.addEventListener("DOMContentLoaded",() => {
const c = new DroppingRadioButtons("form");
});技术要点
| 技术点 | 说明 |
|---|---|
| Web Animations API | 原生 JavaScript 动画接口 |
| cubic-bezier | 自定义缓动函数实现弹跳效果 |
| CSS 变量 | 统一管理颜色主题 |
| prefers-color-scheme | 检测系统深色/浅色模式 |
| data-* 属性 | 存储选项索引 |
使用说明
- 将完整代码保存为
.html文件 - 用浏览器打开
- 点击不同选项,观察圆点的掉落动画效果
- 如使用深色模式,系统会自动适配
评论