缓动函数 Easing Functions

13 篇文章 0 订阅

缓动函数 Easing Functions

缓动函数 自定义参数随时间变化的速率。

常见效果

Linear:无缓动效果;
Quadratic:二次方的缓动(t^2);
Sinusoidal:正弦曲线的缓动(sin(t));
Exponential:指数曲线的缓动(2^t);
Circular:圆形曲线的缓动(sqrt(1-t^2));
Cubic:三次方的缓动(t^3);
Quartic:四次方的缓动(t^4);
Quintic:五次方的缓动(t^5);
Elastic:指数衰减的正弦曲线缓动;
Back:超过范围的三次方缓动((s+1)t^3 - st^2);
Bounce:指数衰减的反弹缓动。

缓动方式

每个效果都分三个缓动方式(方法),分别是:
easeIn:从0开始加速的缓动;
easeOut:减速到0的缓动;
easeInOut:前半段从0开始加速,后半段减速到0的缓动。

具体如图所示:

函数参数说明

每个函数包含 t、b、c 和 d 四个参数

  • t = Time - 表示动画开始以来经过的时间。通常从0开始,通过游戏循环或update函数来缓慢增加。
  • b = Beginning value - 动画的起点,默认从0开始。
  • c = Change in value - 从起点到终点的差值。
  • d = Duration - 完成动画所需的时间。

使用示例

t = 0 - 动画从0s开始
b = 200 - 对象 x 坐标的起始位置为200
c = 300 - 对象必须向右移动 300,到500 结束
d = 1 - 对象用 1 秒时间来完成从 200 到 500 的移动

Linear 线性

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

Quadratic 二次渐变

Quadratic easing in

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

Quadratic easing out

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

Quadratic easing in and out

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;
}

Sinusoidal 正弦渐变

Sinusoidal easing in

function easeInSine (t, b, c, d) {
    return -c * Math.cos(t / d * (Math.PI / 2)) + c + b;
}

Sinusoidal easing out

function easeOutSine (t, b, c, d) {
    return c * Math.sin(t / d * (Math.PI / 2)) + b;
}

Sinusoidal easing in and out

function easeInOutSine (t, b, c, d) {
    return -c / 2 * (Math.cos(Math.PI * t / d) - 1) + b;
}

Exponential 指数渐变

Exponential easing in

function easeInExpo (t, b, c, d) {
    return (t == 0) ? b : c * Math.pow(2, 10 * (t / d - 1)) + b;
}

Exponential easing out

function easeOutExpo (t, b, c, d) {
    return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;
}

Exponential easing in and out

function easeInOutExpo (t, b, c, d) {
    if (t == 0) return b;
    if (t == d) return b + c;
    if ((t /= d / 2) < 1) return c / 2 * Math.pow(2, 10 * (t - 1)) + b;
    return c / 2 * (-Math.pow(2, -10 * --t) + 2) + b;
}

Circular 圆形曲线

Circular easing in

function easeInCirc (t, b, c, d) {
    return -c * (Math.sqrt(1 - (t /= d) * t) - 1) + b;
}

Circular easing out

function easeOutCirc (t, b, c, d) {
    return c * Math.sqrt(1 - (t = t / d - 1) * t) + b;
}

Circular easing in and out

function easeInOutCirc (t, b, c, d) {
    if ((t /= d / 2) < 1) return -c / 2 * (Math.sqrt(1 - t * t) - 1) + b;
    return c / 2 * (Math.sqrt(1 - (t -= 2) * t) + 1) + b;
}

Cubic 三次方


Cubic easing in

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

Cubic easing out

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

Cubic easing in and out

function easeInOutCubic (t, b, c, d) {
    if ((t /= d / 2) < 1) return c / 2 * t * t * t + b;
    return c / 2 * ((t -= 2) * t * t + 2) + b;
}

Quartic 四次方

Quartic easing in

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

Quartic easing out

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

Quartic easing in and out

function easeInOutQuart (t, b, c, d) {
    if ((t /= d / 2) < 1) return c / 2 * t * t * t * t + b;
    return -c / 2 * ((t -= 2) * t * t * t - 2) + b;
}

Quintic 五次方

Quintic easing in

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

Quintic easing out

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

Quintic easing in and out

function easeInOutQuint (t, b, c, d) {
    if ((t /= d / 2) < 1) return c / 2 * t * t * t * t * t + b;
    return c / 2 * ((t -= 2) * t * t * t * t + 2) + b;
}

Elastic 指数衰减正弦曲线


Elastic easing in

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

Elastic easing out

function easeOutElastic (t, b, c, d) {
    var s = 1.70158;
    var p = 0;
    var a = c;
    if (t == 0) return b;
    if ((t /= d) == 1) return b + c;
    if (!p) p = d * .3;
    if (a < Math.abs(c)) {
        a = c;
        var s = p / 4;
    }
    else var 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;
}

Elastic easing in and out

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

Back

Back easing in

function easeInBack (t, b, c, d) {
    if (s == undefined) s = 1.70158;
    return c * (t /= d) * t * ((s + 1) * t - s) + b;
}

Back easing out

function easeOutBack (t, b, c, d) {
    if (s == undefined) s = 1.70158;
    return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;
}

Back easing in and out

function easeInOutBack (t, b, c, d) {
    if (s == undefined) s = 1.70158;
    if ((t /= d / 2) < 1) return c / 2 * (t * t * (((s *= (1.525)) + 1) * t - s)) + b;
    return c / 2 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2) + b;
}

Bounce

Bounce easing in

function easeInBounce(t, b, c, d) {
   return c - easeOutBounce(d - t, 0, c, d) + b;
}

Bounce easing out

function easeOutBounce(t, b, c, d) {
    if ((t/=d) < (1/2.75)) {
      return c*(7.5625*t*t) + b;
    } else if (t < (2/2.75)) {
      return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
    } else if (t < (2.5/2.75)) {
      return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
    } else {
      return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
    }
  }

Bounce easing in and out

function easeInOutBounce(t, b, c, d) {
    if (t < d/2) return easeInBounce (t*2, 0, c, d) * .5 + b;
    return easeOutBounce (t*2-d, 0, c, d) * .5 + c*.5 + b;
  }

参考资料

Easing Functions Cheat Sheet

EASING FUNCTIONS FOR JAVASCRIPT

  • 11
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: animate是jQuery提供的一个动画函数,可以实现元素的缓动效果。下面是animate函数的基本用法: ```javascript $(selector).animate({params},speed,callback); ``` 其中,selector是要进行动画的元素选择器;params是动画参数,可以设置元素的CSS属性、样式和值,也可以设置动画的持续时间、缓动效果、延迟等;speed是动画的速度,可以是毫秒数或者是字符串slow、normal、fast;callback是动画完成后执行的回调函数。 下面是一个简单的使用animate函数的例子: ```javascript $(document).ready(function(){ $("button").click(function(){ $("div").animate({left: '250px'}, 1000); }); }); ``` 该例子表示当用户点击按钮时,div元素会向右移动250像素的距离,动画持续时间为1秒。 除了基本用法外,我们还可以通过自定义封装函数来更方便地使用animate函数。比如下面这个例子: ```javascript function move(obj, target, duration) { clearInterval(obj.timer); var current = parseInt($(obj).css("left")); var speed = (target - current) / (duration / 10); obj.timer = setInterval(function () { current += speed; $(obj).css("left", current + "px"); if (current >= target) { clearInterval(obj.timer); } }, 10); } $(document).ready(function(){ $("button").click(function(){ move($("div").get(0), 250, 1000); }); }); ``` 该例子定义了一个move函数,实现了与前面例子相同的功能。我们可以通过调用move函数来实现动画效果,而不用写过多的代码。其中,obj参数表示要进行动画的元素,target参数表示目标位置,duration参数表示动画持续时间。 总的来说,animate函数是一个非常方便的工具,可以帮助我们快速实现各种缓动动画效果。如果需要更加复杂的动画效果,我们也可以通过自定义封装函数来满足需求。 ### 回答2: animate缓动动画函数是一种常用于网页开发中的技术,可以实现元素的平滑过渡效果。封装和使用该函数主要包括以下几个步骤。 首先,在JavaScript中创建一个名为"animate"的函数,该函数接收四个参数:目标元素(element)、目标属性(properties)、动画持续时间(duration)和缓动函数(easing)。这些参数用于确定动画的目标、时长和缓动方式。 接下来,在animate函数中根据不同浏览器的兼容性,获取目标元素的初始属性值,并将其存储在变量中。 然后,通过计算每帧的属性值和对应的时间间隔,将属性值应用到目标元素上。这个计算过程可以使用缓动函数来实现元素平滑过渡的效果。常见的缓动函数有线性缓动、弹性缓动、加速缓动等,根据需求选择合适的函数。 最后,执行动画效果,通过设置定时器来改变元素的属性值,直到达到目标属性或动画持续时间结束。在每一帧更新元素属性值时,要使用这些属性值来更新元素的样式。 使用animate函数时,可以在HTML的JavaScript代码中调用该函数,传入需要执行动画的元素和相应的参数。例如:animate(document.getElementById("box"), {"left": "500px", "top": "300px"}, 1000, "easeInOut")。 总结起来,animate缓动动画函数的封装和使用包括创建函数、获取初始属性值、计算每帧属性值和对应时间、执行动画效果等步骤。它可以通过传入不同的参数来实现各种各样的动画效果,提升网页的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值