CSS动画效果

CSS 动画的实现主要依赖于两大核心体系:Transition(过渡)Animation(关键帧动画)

简单来说,Transition 适合处理简单的"状态切换"(比如鼠标悬停时颜色平滑变化),而 Animation 则能实现复杂的、多步骤的自动动画(比如加载时的旋转图标、弹跳的小球)。

下面为你详细拆解它们的实现方式:

1. 基础过渡:Transition(过渡)

Transition 只能定义开始结束 两个状态,当元素的属性发生变化时(比如通过 :hover 触发),浏览器会自动补全中间的过渡过程。

它通常需要配合 4 个子属性使用:

  • transition-property :要过渡的 CSS 属性(如 width, background-color,或 all 表示所有属性)。
  • transition-duration :过渡持续的时间(如 0.5s)。
  • transition-timing-function :过渡的速度曲线(如 ease, linear)。
  • transition-delay:延迟多久后开始过渡。

实现示例(鼠标悬停盒子变宽):

css 复制代码
.box {
  width: 100px;
  height: 100px;
  background-color: red;
  /* 当宽度发生变化时,在0.5秒内平滑过渡 */
  transition: width 0.5s ease;
}

.box:hover {
  width: 300px; /* 鼠标放上去,宽度平滑变为300px */
}

2. 核心动画:@keyframes + Animation(关键帧动画)

这是 CSS 动画最强大的部分。它由两部分组成:

  1. @keyframes:相当于动画的"剧本",定义动画从 0% 到 100% 各个阶段的状态。
  2. animation 属性:将"剧本"应用到元素上,并控制播放时长、次数、方向等。

实现步骤:

第一步:定义关键帧(剧本) 使用 from (0%) 和 to (100%),或者具体的百分比来定义中间状态。

css 复制代码
@keyframes moveAndChange {
  0% {
    transform: translateX(0);
    background-color: red;
  }
  50% {
    transform: translateX(200px);
    background-color: blue;
  }
  100% {
    transform: translateX(0);
    background-color: red;
  }
}

第二步:将动画绑定到元素 animation 是一个简写属性,它包含了控制动画的 8 个核心子属性:

属性名 作用 常见取值
animation-name 绑定的关键帧名称 对应 @keyframes 后的名字
animation-duration 动画完成一次所需时间 1s, 500ms
animation-timing-function 速度曲线(节奏感) ease(默认), linear(匀速), ease-in-out
animation-delay 延迟多久开始 0.5s
animation-iteration-count 播放次数 1(默认), infinite(无限循环)
animation-direction 播放方向 normal(正向), alternate(来回交替)
animation-fill-mode 动画结束后的状态 forwards(保持最后一帧), backwards
animation-play-state 播放/暂停 running(默认), paused(暂停)

应用示例:

css 复制代码
.box {
  width: 100px;
  height: 100px;
  /* 简写格式:名称 时长 速度曲线 延迟 次数 方向 填充模式 */
  animation: moveAndChange 2s ease-in-out infinite alternate;
}

3. 性能优化与最佳实践

在实现 CSS 动画时,为了保证页面流畅不卡顿,有几点需要特别注意:

  1. 优先使用 transformopacity : 改变元素的 width, height, margin, top/left 等属性会触发浏览器的重排(Reflow/Layout) ,非常消耗性能。而 transform(位移、旋转、缩放)和 opacity(透明度)通常只会触发合成(Compositing),可以交给 GPU 硬件加速,性能极高。
  2. 善用 will-change : 如果你预知某个元素马上要开始动画,可以给它加上 will-change: transform;。这会提前告诉浏览器:"这个元素要变了,请提前为它创建独立的渲染层",从而让动画更丝滑。
  3. 避免过度复杂的动画: 动画的目的是提升用户体验,过多的动画反而会分散用户注意力。
相关推荐
我不是外星人1 小时前
有了 Harness Engineering ,真的还需要研发工程师吗?
前端·后端·ai编程
IT_陈寒4 小时前
JavaScript的闭包把我坑惨了,说好的内存会自动回收呢?
前端·人工智能·后端
Jackson__5 小时前
分享一个横向滚动案例,带悬停暂停,通用性很强
前端
MariaH5 小时前
git rebase的使用
前端
_柳青杨5 小时前
深入理解 JavaScript 事件循环
前端·javascript
阡陌Jony5 小时前
关于前端性能优化的一些问题:
前端
用户600071819106 小时前
【翻译】简化 TSRX
前端
IT乐手7 小时前
佛德角逼平西班牙,国足还有啥借口?
前端
JustHappy8 小时前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
星栈8 小时前
Dioxus 的响应式系统:`Signal`、`Memo`、`Effect` 和异步状态到底该怎么分工
前端·前端框架