一、什么是CSS Animation?

CSS Animation是CSS3中引入的一种技术,允许我们创建复杂的、关键帧驱动的动画效果,无需依赖JavaScript就能实现流畅的动态效果。它提供了比transition更强大、更灵活的动画控制能力。

二、核心组件

CSS Animation主要由两个核心部分组成:

  1. @keyframes 规则 - 定义动画的关键帧和过渡效果。

  1. animation-* 系列属性 - 控制动画的播放方式。

2.1 @keyframes 规则详解

@keyframes 规则定义了动画在不同阶段的样式。格式如下:

@keyframes 动画名称 {
  0% {
    /* 初始状态样式 */
  }
  50% {
    /* 中间状态样式 */
  }
  100% {
    /* 结束状态样式 */
  }
}

也可以使用关键字:

@keyframes 动画名称 {
  from {
    /* 初始状态 */
  }
  to {
    /* 结束状态 */
  }
}
2.2 Animation 属性详解
2.2.1. animation-name

指定要应用的@keyframes动画名称。

.element {
  animation-name: fadeIn;
}
2.2.2. animation-duration

指定动画完成一个周期所需的时间(秒或毫秒)。

.element {
  animation-duration: 2s;
}
2.2.3. animation-timing-function

定义动画的速度曲线,控制动画如何在各个阶段加速或减速。

常用值:

  • ease(默认)- 慢开始,然后加速,最后减速。

  • linear - 匀速运动。

  • ease-in - 慢开始。

  • ease-out - 慢结束。

  • ease-in-out - 慢开始和慢结束。

  • cubic-bezier(n,n,n,n) - 自定义贝塞尔曲线。

.element {
  animation-timing-function: ease-in-out;
}
2.2.4. animation-delay

指定动画开始前的延迟时间。

.element {
  animation-delay: 1s;
}
2.2.5. animation-iteration-count

定义动画播放的次数。

.element {
  animation-iteration-count: 3; /* 播放3次 */
  /* 或者 */
  animation-iteration-count: infinite; /* 无限循环 */
}
2.2.6. animation-direction

定义动画是否应该反向播放或交替方向播放。

常用值:

  • normal(默认)- 正向播放。

  • reverse - 反向播放。

  • alternate - 正向然后反向,交替进行。

  • alternate-reverse - 反向然后正向,交替进行。

.element {
  animation-direction: alternate;
}
2.2.7. animation-fill-mode

定义动画在播放前后如何应用样式。

常用值:

  • none(默认)- 动画结束后回到原始状态。

  • forwards - 保持结束状态的样式。

  • backwards - 应用第一个关键帧的样式。

  • both - 同时应用forwards和backwards。

.element {
  animation-fill-mode: forwards;
}
2.2.8. animation-play-state

控制动画的播放状态。

常用值:

  • running(默认)- 播放中

  • paused - 暂停

.element {
  animation-play-state: paused;
}

.element:hover {
  animation-play-state: running;
}

三、动画属性简写语法

所有动画属性可以合并为一个 animation 简写属性:

.element {
  animation: 动画名称 持续时间 时间函数 延迟 迭代次数 方向 填充模式 播放状态;
}

例如:

.element {
  animation: fadeIn 2s ease-in-out 0.5s infinite alternate forwards running;
}
简写属性助记:
  • 中文助记:名称时长 方式延迟 次数方向 填充状态

    • 名称 = name(动画名称)。

    • 时长 = duration(持续时间)。

    • 方式 = timing-function(时间函数,控制动画进行方式)。

    • 延迟 = delay(延迟时间)。

    • 次数 = iteration-count(迭代次数)。

    • 方向 = direction(播放方向)。

    • 填充 = fill-mode(填充模式)。

    • 状态 = play-state(播放状态)。

  • 英文助记:Never Drink Tea During Important Dates For Peace

    • Never = name 。

    • Drink = duration 。

    • Tea = timing-functionDuring = delay 。

    • Important = iteration-count 。

    • Dates = direction 。

    • For = fill-mode 。

    • Peace = play-state 。

需要特别注意的点
  1. 时间值的顺序:当简写中出现两个时间值时,第一个总是duration,第二个总是delay。

  2. 必需的属性:name和duration是必需的,缺少其中任何一个,动画都不会运行。

  3. 可省略的属性:其他属性可以根据需要省略,会使用默认值。

animation: fadeIn 2s 1s; /* 2秒是duration,1秒是delay */

/* 基础动画 - 只设置必需的两个属性 */
.fade-in {
  animation: fadeIn 1s; /* name, duration */
}

/* 完整动画 - 设置所有属性 */
.bounce-effect {
  animation: bounce 2s ease-in-out 0.5s infinite alternate forwards running;
  /* 名称 时长  方式    延迟 次数   方向    填充   状态 */
}

/* 常用组合 */
.spinner {
  animation: spin 1s linear infinite;
  /* 名称 时长 方式 次数 */
}

四、实际示例

4.1. 淡入淡出效果
@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

.fade-in {
  animation: fadeIn 1s ease-in-out;
}
4.2. 旋转动画
@keyframes rotate {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

.rotating {
  animation: rotate 2s linear infinite;
}
4.3. 弹跳效果
@keyframes bounce {
  0%, 20%, 50%, 80%, 100% {
    transform: translateY(0);
  }
  40% {
    transform: translateY(-30px);
  }
  60% {
    transform: translateY(-15px);
  }
}

.bounce {
  animation: bounce 2s ease infinite;
}

五、性能优化技巧

5.1. 使用GPU加速:优先使用 transform、opacity 属性进行动画,因为它们可以触发GPU加速,减少重绘和回流。

5.2. 避免使用以下属性进行动画:

  • width 和 height。

  • margin 和 padding。

  • top、left、right、bottom(使transform: translate()代替)。

5.3. 使will-change提示浏览器:

.animated-element {
  will-change: transform, opacity;
}

5.4. 使用适当的动画持续时间:根据用户体验设计合理的动画时间,避免过长或过短。

六、与JavaScript交互

虽然CSS Animation可以独立工作,但结合JavaScript可以实现更复杂的交互效果:

// 选择元素
const element = document.querySelector('.animated-element');

// 播放动画
element.style.animationPlayState = 'running';

// 暂停动画
element.style.animationPlayState = 'paused';

// 监听动画事件
element.addEventListener('animationstart', function() {
  console.log('动画开始');
});

element.addEventListener('animationend', function() {
  console.log('动画结束');
});

element.addEventListener('animationiteration', function() {
  console.log('动画迭代');
});

七、浏览器兼容性

现代浏览器对CSS Animation有很好的支持,但为了兼容旧版本浏览器,可以使用供应商前缀:

@keyframes fadeIn {
  /* 标准语法 */
}

@-webkit-keyframes fadeIn {
  /* Safari 和 Chrome */
}

@-moz-keyframes fadeIn {
  /* Firefox */
}

@-o-keyframes fadeIn {
  /* Opera */
}

.element {
  animation: fadeIn 1s;
  -webkit-animation: fadeIn 1s; /* Safari 和 Chrome */
  -moz-animation: fadeIn 1s; /* Firefox */
  -o-animation: fadeIn 1s; /* Opera */
}

总结

CSS Animation是创建丰富动态界面的强大工具,通过结合 @keyframes 和 animation 属性,我们可以实现各种复杂的动画效果,提升用户体验。正确使用动画性能优化技巧,可以确保动画流畅运行,不会影响页面性能。