/* * @file: /src/ui/function.ts * @description: 缓动函数之类的,与框架无关,只做计算 * @author: tsl (randy1924@163.com) * @date: 2026-03-19 11:50:59 * @lastModified: 2026-03-19 15:51:48 * @lastModifiedBy: tsl (randy1924@163.com) */ import { easeOutSine } from "js-easing-functions"; /** * 缓慢滚动到结束值(使用缓动函数) * @param start 滚动开始值,px * @param end 滚动结束值,px * @param duration 完成动画所需的时间,ms * @param cb 回调函数,参数为当前值,px */ export async function slowlyScroll( start: number, end: number, duration: number, cb?: (value: number) => void, ): Promise { return new Promise((resolve) => { const startTime = Date.now(); const distance = end - start; const intervalId = setInterval(() => { const currentTime = Date.now(); const elapsed = currentTime - startTime; // 使用 easeOutSine 缓动函数 // 参数:已过去时间、初始值、改变量、总持续时间 const currentValue = easeOutSine(elapsed, start, distance, duration); cb?.(currentValue); if (elapsed >= duration) { // 清除定时器 clearInterval(intervalId); // 确保最后一次调用使用准确的结束值 cb?.(end); resolve(); } }, 16); // 约60fps }); }