
通过设置初始透明度为 0 并在动画起始帧设为不透明,配合 `transform: scale()` 缩放变化与 `animation-fill-mode: forwards` 保持最终状态,可让红方块从不可见、放大态自然缩放入场,避免初始突兀显示。
要实现一个红方块“从无到有、由大变小”地流畅流入容器(即视觉上从远处快速缩放进入视野并停驻),关键在于分离可见性控制与形变动画——不能依赖 display: none(它无法参与 CSS 动画过渡),而应使用 opacity 配合 transform 实现平滑入场。
以下是推荐的实现方案:
✅ 核心思路:
- 初始状态设为 opacity: 0(完全透明,但占据布局空间,确保动画流畅);
- 动画第 0% 帧设为 opacity: 1 + transform: scale(10)(瞬间显现并处于极大缩放态);
- 中间帧维持不透明,专注缩放过渡;
- 结束帧可设为 scale(1) + opacity: 1(停留于目标尺寸),或按需淡出(如原示例中 100% 设为 opacity: 0,但通常入场动画应以「可见」结束)。
? 修正后的完整代码:
立即学习“前端免费学习笔记(深入)”;
.container .box {
width: 200px;
height: 200px;
background-color: red;
margin: 0 auto;
opacity: 0; /* 初始完全透明,但保留渲染占位 */
/* 推荐添加 transform-origin: center 保证缩放中心准确 */
transform-origin: center;
}
.container .box {
animation-name: flowIn;
animation-duration: 1s;
animation-timing-function: ease-out; /* 入场建议用 ease-out,更自然 */
animation-delay: 1s;
animation-iteration-count: 1;
animation-fill-mode: forwards; /* 关键:保持最后一帧样式 */
}
@keyframes flowIn {
0% {
opacity: 1;
transform: scale(10);
}
100% {
opacity: 1;
transform: scale(1);
}
}? 注意事项:
- 移除所有 -webkit- 前缀(现代浏览器已原生支持 @keyframes 和 animation,仅在需兼容 iOS
- display: none 不可用于动画关键帧——它不触发重绘过渡,会导致动画跳变或失效;
- 若需“真正隐藏初始占位”,可用 visibility: hidden + opacity: 0 组合,但需注意 visibility 本身不可动画,因此仍应以 opacity 为主控属性;
- 如需增强动效真实感,可叠加轻微 transform: translateZ(0) 触发硬件加速,或添加 will-change: transform, opacity(生产环境慎用,仅对高频动画元素启用)。
总结:流畅的“流入”动画 = 初始不可见(opacity: 0)+ 动画首帧显形放大(opacity: 1, scale(>1))+ 渐进缩放至目标(scale(1))+ fill-mode: forwards 锁定终态。这是 CSS 动画中控制入场节奏最可控、最兼容的实践模式。










