优先用transition处理简单状态切换,如hover、toggle;需多步变化、循环或复杂时序时用animation。二者可共存,但需注意性能、兼容性及无障碍支持。
复杂动画逻辑用 @keyframes + animation,简单状态切换(比如悬停、点击)优先用 transition。
适合两个状态之间的平滑变化:比如按钮 hover 时颜色变深、菜单展开收起、开关 toggle 等。它监听属性变化,自动补间,写法轻量。
:hover、:focus),不需 JS 控制流程button { background: #ccc; transition: background 0.2s ease; } button:hover { background: #333; }
需要多步变化、精确时序、循环播放、或非状态驱动的视觉效果时,用 @keyframes 配合 animation 更合适。
0%、25%、50%…100%),控制每个阶段的样式infinite)、方向(alternate)、填充模式(forwards)、暂停/运行等行为过渡更轻量、性能更好(尤其在 GPU 加速属性上),也更容易维护。如果只是「A 状态 → B 状态」且由用户交互直接触发,transition 是更自然的选择。
无论选哪个,都要考虑用户偏好。可通过 prefers-reduced-motion 减少或关闭动效。
@media (prefers-reduced-motion: reduce) { * { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } }