可以,但必须严格对齐参数数量和顺序,否则整条animation声明会被浏览器静默忽略;每个逗号分隔的动画片段须完整包含8个位置(名称、时长、缓动、延迟、循环次数、方向、填充模式、播放状态),缺一或错位即全乱,且transform等单值属性不自动合并,需统一写入同一@keyframes。

可以,但必须严格对齐参数数量和顺序,否则整条 animation 声明会被浏览器静默忽略。
animation 简写中逗号分隔的语法结构
多个动画不是“堆叠”,而是按列解析:每个逗号分隔的片段,必须完整包含 animation-name、animation-duration、animation-timing-function、animation-delay、animation-iteration-count、animation-direction、animation-fill-mode、animation-play-state 这 8 个位置。缺一不可,错一位就全乱。
- 错误写法:
animation: slideIn 0.6s, fadeIn 0.6s ease-in, spin 1.5s linear 0.3s;→ 第三项少了iteration-count和fill-mode,浏览器把0.3s当作iteration-count,后续值全部错位 - 正确写法:
animation: slideIn 0.6s ease-out 0s 1 forwards, fadeIn 0.6s ease-in 0s 1 forwards, spin 1.5s linear 0.3s infinite both; - 没写的项(比如
animation-direction)不会继承,一律回退为normal
多个动画修改 transform 时只生效一个?
因为 transform 是单值属性,浏览器只取最后执行的那个动画输出的完整值,不会自动合并 translateX() 和 rotate()。这不是 bug,是 CSS 层叠规则本身决定的。
- 想同时平移 + 旋转 → 必须写进同一个
@keyframes,例如:transform: translateX(100px) rotate(45deg); - 如果非要拆成多个动画,且都动
transform,得用animation-composition: add或accumulate,但仅对transform和filter有效,opacity、color等不参与该机制 -
animation-composition单独写无效,必须配合多动画声明才起效;Safari 对accumulate支持不稳定
调试时看不到多个动画在 DevTools 中运行?
Chrome 的 “Animations” 面板默认只显示第一个动画,容易误判其余动画未触发。
立即学习“前端免费学习笔记(深入)”;
- 真要验证是否生效:打开 Elements 面板 → 找到元素 → 展开 computed 样式 → 查看
animation-name计算值,确认是否列出全部名称 - 临时加
!important或逐个注释掉某组动画,肉眼观察变化 - 别依赖
animation-delay错开时间来判断“是否并行”——延迟只是启动时机不同,不代表动画没注册或没运行
真正难的不是写几组逗号,而是确保每组参数数量一致、顺序严丝合缝,且避免多个动画争夺同一属性。一旦涉及 transform,优先合并进一个 @keyframes,比折腾 animation-composition 更可靠、兼容性更好。


















