当前位置:首页 > JavaScript

js实现缓动

2026-01-30 23:05:44JavaScript

缓动动画的实现原理

缓动动画(Easing Animation)通过改变动画的速率变化,让运动效果更加自然。常见缓动类型包括线性、二次、三次、弹性等,每种类型都能产生不同的视觉效果。

线性缓动实现

线性缓动是最简单的形式,动画速度恒定:

function linearEase(t, b, c, d) {
  return c * t / d + b;
}

参数说明:

  • t:当前时间
  • b:初始值
  • c:变化量(目标值-初始值)
  • d:持续时间

二次缓动实现

二次缓动(Quadratic Easing)分为加速和减速两种:

// 加速缓动
function easeInQuad(t, b, c, d) {
  return c * (t /= d) * t + b;
}

// 减速缓动
function easeOutQuad(t, b, c, d) {
  return -c * (t /= d) * (t - 2) + b;
}

// 先加速后减速
function easeInOutQuad(t, b, c, d) {
  if ((t /= d / 2) < 1) return c / 2 * t * t + b;
  return -c / 2 * ((--t) * (t - 2) - 1) + b;
}

三次缓动实现

三次缓动(Cubic Easing)效果比二次更明显:

function easeInCubic(t, b, c, d) {
  return c * (t /= d) * t * t + b;
}

function easeOutCubic(t, b, c, d) {
  return c * ((t = t / d - 1) * t * t + 1) + b;
}

弹性缓动实现

弹性缓动(Elastic Easing)模拟弹簧效果:

function easeOutElastic(t, b, c, d) {
  let s = 1.70158;
  let p = 0;
  let a = c;
  if (t == 0) return b;
  if ((t /= d) == 1) return b + c;
  if (!p) p = d * 0.3;
  if (a < Math.abs(c)) {
    a = c;
    s = p / 4;
  } else {
    s = p / (2 * Math.PI) * Math.asin(c / a);
  }
  return a * Math.pow(2, -10 * t) * Math.sin((t * d - s) * (2 * Math.PI) / p) + c + b;
}

动画循环实现

使用requestAnimationFrame实现动画循环:

function animate({ duration, easing, draw }) {
  let start = performance.now();

  requestAnimationFrame(function animateFrame(time) {
    let timeFraction = (time - start) / duration;
    if (timeFraction > 1) timeFraction = 1;

    let progress = easing(timeFraction);
    draw(progress);

    if (timeFraction < 1) {
      requestAnimationFrame(animateFrame);
    }
  });
}

// 使用示例
animate({
  duration: 1000,
  easing: easeOutQuad,
  draw: (progress) => {
    element.style.left = progress * 500 + 'px';
  }
});

缓动函数可视化工具

可以通过可视化工具直观比较不同缓动效果:

性能优化建议

避免在动画中频繁触发重排(reflow):

  • 使用transform替代top/left动画
  • 将will-change属性应用于动画元素
  • 减少动画元素的数量
  • 对复杂动画考虑使用CSS硬件加速

现代API替代方案

CSS动画原生支持缓动:

.element {
  transition: transform 0.5s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}

Web Animations API也提供缓动控制:

element.animate([
  { transform: 'translateX(0)' },
  { transform: 'translateX(300px)' }
], {
  duration: 1000,
  easing: 'cubic-bezier(0.42, 0, 0.58, 1)'
});

js实现缓动

标签: js
分享给朋友:

相关文章

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let…

js实现动画

js实现动画

使用 CSS 动画与 JavaScript 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现验证码

js实现验证码

使用Canvas生成图形验证码 在HTML中创建一个Canvas元素用于绘制验证码。通过JavaScript随机生成数字或字母组合,并添加干扰线、噪点等干扰元素增强安全性。 <canvas i…

js实现继承

js实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Paren…

js实现文件下载

js实现文件下载

使用 a 标签下载文件 通过动态创建 a 标签并设置 download 属性实现文件下载。适用于已知文件 URL 或 Blob 数据的情况。 function downloadFile(url, f…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…