当前位置:首页 > 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也提供缓动控制:

js实现缓动

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

标签: js
分享给朋友:

相关文章

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js防抖和节流实现

js防抖和节流实现

防抖(Debounce)的实现 防抖的核心思想是在事件被触发后,延迟执行回调函数。如果在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口大小调整等场景。 function debounce…

js实现拷贝

js实现拷贝

实现文本拷贝 使用 document.execCommand 方法(已废弃但兼容性较好): function copyText(text) { const textarea = document…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…