Skip to content

easing

贝塞尔曲线缓动函数工具。

导入

typescript
import {
  createEasingFn,
  easingEase,
  easingLinear,
  easingSnap,
  easingIn,
  easingOut,
  easingInOut,
  easingInQuad,
  easingInCubic,
  easingInQuart,
  easingInQuint,
  easingInSine,
  easingInExpo,
  easingInCirc,
  easingInBack,
  easingOutQuad,
  easingOutCubic,
  easingOutQuart,
  easingOutQuint,
  easingOutSine,
  easingOutExpo,
  easingOutCirc,
  easingOutBack,
  easingInOutQuart,
  easingInOutQuint,
  easingInOutSine,
  easingInOutExpo,
  easingInOutCirc,
  easingInOutBack,
} from '@cloudcome/utils-core/easing'

函数

createEasingFn

创建一个基于贝塞尔曲线的缓动函数。

typescript
function createEasingFn(x1: number, y1: number, x2: number, y2: number): (x: number) => number

参数

参数类型描述
x1number第一个控制点的 X 坐标,范围 [0, 1]
y1number第一个控制点的 Y 坐标,范围 [0, 1]
x2number第二个控制点的 X 坐标,范围 [0, 1]
y2number第二个控制点的 Y 坐标,范围 [0, 1]

返回值

(x: number) => number - 缓动函数,接受 0~1 的进度值,返回缓动后的值

示例

typescript
const myEasing = createEasingFn(0.25, 0.1, 0.25, 1)

myEasing(0)   // 0
myEasing(0.5) // ~0.8
myEasing(1)   // 1

预设缓动函数

以下预设缓动函数均为 (x: number) => number 类型,接受 0~1 的进度值。

常量描述
easingEase标准缓动 (0.25, 0.1, 0.25, 1)
easingLinear线性 (0, 0, 1, 1)
easingSnap快速到位 (0, 1, 0.5, 1)
easingIn缓入 (0.42, 0, 1, 1)
easingOut缓出 (0, 0, 0.58, 1)
easingInOut缓入缓出 (0.42, 0, 0.58, 1)
easingInQuad二次方缓入
easingInCubic三次方缓入
easingInQuart四次方缓入
easingInQuint五次方缓入
easingInSine正弦缓入
easingInExpo指数缓入
easingInCirc圆形缓入
easingInBack回退缓入
easingOutQuad二次方缓出
easingOutCubic三次方缓出
easingOutQuart四次方缓出
easingOutQuint五次方缓出
easingOutSine正弦缓出
easingOutExpo指数缓出
easingOutCirc圆形缓出
easingOutBack回退缓出
easingInOutQuart四次方缓入缓出
easingInOutQuint五次方缓入缓出
easingInOutSine正弦缓入缓出
easingInOutExpo指数缓入缓出
easingInOutCirc圆形缓入缓出
easingInOutBack回退缓入缓出

示例

typescript
import { easingEase, easingInOut } from '@cloudcome/utils-core/easing'

// 动画中使用
function animate(duration: number) {
  const start = Date.now()

  function step() {
    const elapsed = Date.now() - start
    const progress = Math.min(elapsed / duration, 1)
    const easedProgress = easingEase(progress)

    // 使用 easedProgress 更新动画状态
    element.style.opacity = String(easedProgress)

    if (progress < 1) {
      requestAnimationFrame(step)
    }
  }

  requestAnimationFrame(step)
}

基于 MIT 许可发布