贝利信息

如何用javascript实现简单的动画效果?_如何通过改变CSS属性来创建动画?【教程】

日期:2026-01-22 00:00 / 作者:php中文网
requestAnimationFrame 比 setTimeout 更稳,因其对齐浏览器重绘节奏;需手动递归调用、避免帧内重耗操作、用 performance.now() 计时;动画结束须清理资源,transform 重置用 'none' 或 removeProperty,animationend 不适用于 JS 动画。

requestAnimationFrame 控制动画节奏比 setTimeout 更稳

浏览器重绘有固定帧率(通常是 60fps),硬用 setTimeout 设 16ms 定时器并不能保证准时执行,还可能因主线程阻塞丢帧。requestAnimationFrame 会把回调交给浏览器统一调度,在下一次重绘前执行,天然对齐刷新节奏。

实操建议:

let start = performance.now();
function animate(timestamp) {
  const elapsed = timestamp - start;
  const progress = Math.min(elapsed / 2000, 1); // 2秒动画
  element.style.transform = `translateX(${progress * 200}px)`;
  if (progress < 1) requestAnimationFrame(animate);
}
requestAnimationFrame(animate);

直接改 style.transformstyle.opacity 性能最好

CSS 动画中,只有 transformtranslate/scale/rotate)和 opacity 属于“只触发合成”的属性,修改它们不会触发回流(layout)和重绘(paint),只走合成线程,GPU 加速明显。

常见错误现象:

正确做法:所有位移、缩放、旋转、透明度变化,一律走 transformopacity

element.animate() API 实现声明式动画

element.animate() 是现代浏览器原生支持的 Web Animations API,比纯 JS 手动控制更简洁,也比 CSS @keyframes 更灵活——可以动态生成关键帧、随时暂停/反转/调整时间。

使用场景:

注意参数差异:

const anim = element.animate(
  [{ transform: 'scale(1)' }, { transform: 'scale(1.2)' }],
  { duration: 300, easing: 'cubic-bezier(0.25, 0.46, 0.45, 0.94)' }
);
anim.onfinish = () => console.log('done');

动画结束时记得清理状态或释放资源

手动用 requestAnimationFrame 的动画,如果没做终止判断或没清空引用,容易导致内存泄漏或意外持续执行。用

element.animate() 虽然自动管理,但若反复调用没取消前一个,也会堆积动画实例。

容易被忽略的地方: