Skip to content

CSS 动画

CSS 提供了两种创建动画的方式:过渡(transition)关键帧动画(animation)

过渡 transition

过渡用于属性变化时的平滑切换,需要触发条件(如 :hover、类名变化)。

语法

css
/* 简写 */
transition: <属性> <时长> <缓动函数> <延迟>;

/* 示例 */
.box {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}
.box.visible {
  opacity: 1;
  transform: translateY(0);
}

拆分写法

属性说明示例
transition-property要过渡的属性opacity, transform
transition-duration过渡时长0.6s / 600ms
transition-timing-function缓动函数ease, linear, ease-in-out
transition-delay延迟时间0.2s

常见缓动函数

效果
ease默认,慢→快→慢
linear匀速
ease-in慢→快
ease-out快→慢
ease-in-out慢→快→慢
cubic-bezier()自定义贝塞尔曲线

适用场景

  • 按钮 hover 效果
  • 元素显隐的淡入淡出
  • 位置/大小变化的平滑过渡

关键帧动画 animation

关键帧动画无需触发条件,页面加载即可自动播放,或通过状态控制。

语法

css
/* 简写 */
animation: <名称> <时长> <缓动> <延迟> <次数> <方向>;

/* 示例 */
.spin {
  animation: rotate 2s linear infinite;
}

定义关键帧

css
@keyframes rotate {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

/* 或使用百分比 */
@keyframes bounce {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-20px); }
}

拆分写法

属性说明示例
animation-name动画名称rotate
animation-duration动画时长2s
animation-timing-function缓动函数ease-in-out
animation-delay延迟时间0s
animation-iteration-count播放次数infinite / 3
animation-direction播放方向alternate(来回)
animation-fill-mode结束状态forwards(保持最终)
animation-play-state播放状态paused / running

适用场景

  • 无限循环(旋转、呼吸、闪烁)
  • 页面加载入场动画
  • 复杂多阶段动画

transition vs animation

对比transitionanimation
触发方式需要状态变化自动 / JS 控制
循环播放❌ 不支持✅ 支持
多阶段❌ 只有始终✅ 多个关键帧
播放控制❌ 无✅ pause/resume
适合场景交互反馈自动播放

经验法则:

  • 用户交互引起的简单变化 → transition
  • 自动播放、循环、多步动画 → animation

性能注意

只对 transformopacity 做动画,避免改变布局的属性(如 widthheighttopleft),因为前两者只触发 GPU 合成,后者会触发布局重排。

css
/* ❌ 性能差,触发重排 */
.box:hover { width: 200px; }

/* ✅ 性能好,只触发合成 */
.box:hover { transform: scale(1.2); }