
当多个css动画并行运行且持续时间不一致时,若某动画(如背景色变化)提前结束而元素自身未声明默认背景色,会导致视觉上“div消失”——实际是背景透明化所致。
当多个css动画并行运行且持续时间不一致时,若某动画(如背景色变化)提前结束而元素自身未声明默认背景色,会导致视觉上“div消失”——实际是背景透明化所致。
在您提供的代码中,div 同时应用了三个动画:move-away(10s)、color-change(5s)和 big-to-small(7s)。其中 color-change 动画仅持续 5 秒,且未设置 animation-fill-mode;当它完成第 1 轮(或最后一轮)后,元素会回退到原始样式状态——而原始 div 并未定义 background-color,因此浏览器渲染为透明背景,叠加在默认白色页面上即呈现“消失”错觉(实为不可见)。
✅ 根本原因定位
- color-change 动画结束后,div 的 background-color 恢复为 transparent(初始值);
- 其他动画(如位移、缩放)仍在运行,但用户只注意到“颜色没了”,误判为元素消失;
- 浏览器 DevTools 中可清晰观察到:div 的 background-color 计算值在动画结束后变为 rgba(0, 0, 0, 0) 或 transparent。
✅ 推荐修复方案
方案一:设置 animation-fill-mode: forwards
确保 color-change 动画结束后保留最终关键帧样式(即 #000000):
div {
/* 其他属性保持不变 */
animation-duration: 10s, 5s, 7s;
animation-name: move-away, color-change, big-to-small;
/* ? 新增:为 color-change 指定 fill-mode */
animation-fill-mode: none, forwards, none;
}方案二:显式声明默认背景色(更健壮)
在 div 基础样式中设定兜底背景,避免任何动画间隙暴露透明态:
div {
width: 100px;
height: 100px;
padding: 5px;
background-color: #DCAB6B; /* 与 color-change 的 from 值一致 */
/* 其余 animation 属性... */
}方案三:统一动画节奏或延长关键动画
若需循环效果,可将 color-change 设为无限循环,并与其他动画协调:
立即学习“前端免费学习笔记(深入)”;
div {
animation-duration: 10s, infinite, 7s;
animation-iteration-count: 7, infinite, 6;
animation-fill-mode: none, forwards, none;
}⚠️ 注意:infinite 与 animation-direction: alternate 组合时,会形成平滑往复变色;但需确保 animation-duration 合理(如设为 3s 更易观察效果)。
? 验证与调试建议
- 始终在 CSS 规则开头为动画元素定义基础样式(尤其是 background-color、opacity、transform 等影响可见性的属性);
- 使用 Chrome DevTools 的 Animations 面板 实时拖动时间轴,观察各动画生命周期及属性计算值;
- 避免依赖单一动画控制核心视觉属性(如仅靠 color-change 控制背景),应分层设计:基础样式保底 + 动画增强。
通过以上任一方式,即可彻底解决“第二次播放时 div 消失”的问题,让多动画协同表现稳定、可控且符合预期。

















