Skip to content

イージング関数(tween)

7 種類のイージングの系統があり、それぞれに easeIneaseOut があります。中身は純粋な数式で、DOM も、自前の RAF のループも持ちません。自分のアニメーションフレームから現在の時刻を渡すと、そのフレームで使うべき値が返ります。

引数は Robert Penner による古典的な流儀に従います。

  • t:現在の時刻(どれだけ経ったか)
  • b:始まりの値
  • c:値の変化量(終わりの値は b + c
  • d:継続時間

どの関数も内部で t >= d のときに値を抑えるので、終わりを過ぎて呼んでも、範囲の外へ外挿せずに最終的な値を返します。

使い方

ts
import { cubic } from 'ranuts/utils';

const start = performance.now();
const tick = (now: number) => {
  const x = cubic.easeOut(now - start, 0, 300, 600); // 600ms かけて 0 → 300
  el.style.transform = `translateX(${x}px)`;
  if (now - start < 600) requestAnimationFrame(tick);
};
requestAnimationFrame(tick);

使える曲線

エクスポート曲線感じ
quad2 次(いちばん穏やかな加速。無難な既定値
cubic3 次(quad よりはっきりきびきびします
quart4 次(t⁴力強い加速
quint5 次(t⁵とても力強く、動きの印象を終わり際が支配します
sine正弦どれよりも柔らかく、イージングとしてほとんど気づかれません
expo指数ほとんど止まっていて、そこから一気に走り出します
circゆっくり始まり、終わりがとても唐突です

API

どのエクスポートも同じ形をしています。

ts
interface SpeedType {
  easeIn: EasingFn;
  easeOut: EasingFn;
}

type EasingFn = (t: number, b: number, c: number, d: number) => number;

easeIn / easeOut

パラメーター

パラメーター説明既定値
t経過した時間number必須
b始まりの値number必須
c値の変化量(終わりは b + cnumber必須
d継続時間number必須

戻り値

引数説明
value時刻 t における値number

補足

easeIn はゆっくり始まって加速し、easeOut は速く始まって減速します。利用者の操作に応える UI では、たいてい easeOut のほうが自然に見えます。まずためらってから動くのではなく、すぐ動き出して落ち着くからです。

zhangxinxu/Tween に感謝します。

MIT ライセンスのもとで公開されています。