当前位置: 首页 > news >正文

js/ts金额由大到小动画实现

// js写法
function animation(duration, from, to, onProgress) {
    const startTime = Date.now();
   
    function _run() {
        const elapsed = Date.now() - startTime; // 已过去的时间
        const progress = Math.min(elapsed / duration, 1); // 进度(0-1)
       
        // 核心优化:计算当前值(保持为数字)
        const currentValue = from + (to - from) * progress;
       
        // 触发回调,将格式化决定权交给调用者
        if (onProgress) {
            // 回调传递数字,是否格式化由调用方决定
            onProgress(currentValue.toFixed(2));
        }
       
        if (progress < 1) {
            // 继续动画
            requestAnimationFrame(_run); return;
        }
        // 动画结束,确保最终值精确
        if (onProgress) onProgress(to.toFixed(2));
    }
    _run();
}

// 调用
animation(1000, 0, 100, (value) => {
    console.log('当前值', value);
});


// 定义动画参数接口
interface AnimationOptions {
  /** 动画总时长(毫秒) */
  duration: number;
  /** 起始值 */
  from: number;
  /** 结束值 */
  to: number;
  /** 动画过程中每一帧的回调,接收当前值 */
  onProgress: (value: number) => void;
  /** 动画结束时的回调(可选) */
  onComplete?: () => void;
}

/**
 * 执行一个数值动画
 * @param options 动画配置对象
 */
function animationTS(options: AnimationOptions): void {
  const { duration, from, to, onProgress, onComplete, easing } = options;
  const startTime = Date.now();


  function _run(): void {
    const elapsed = Date.now() - startTime;
    // 计算进度(0到1),并用clamp确保不超过1
    const rawProgress = elapsed / duration;
    const progress = Math.min(rawProgress, 1);

    // 核心计算:根据缓动后的进度计算当前值
    const currentValue = from + (to - from) * progress;

    // 触发进度回调
    onProgress(currentValue);

    if (progress < 1) {
      // 继续动画
      requestAnimationFrame(_run);
    } else {
      // 动画结束,确保最终值精确等于 `to`
      onProgress(to);
      onComplete?.(); // 可选链操作符调用完成回调
    }
  }

  _run();
}

// 基本使用
animationTS({
  duration: 1500,
  from: 599.00,
  to: 59.90,
  onProgress: (value: number) => {
    // 在回调中按需格式化显示
    console.log(`当前金额: ${value.toFixed(2)}`);
    // 更新UI,例如:
    // document.getElementById('price').textContent = value.toFixed(2);
  },
  onComplete: () => {
    console.log('✅ 金额变化动画完成!');
  }
});
http://www.jsqmd.com/news/116223/

相关文章:

  • Linly-Talker姿态微调功能开放,头部动作更自然协调
  • Thinkphp和Laravel人才公寓酒店闽都客房预约报修设施管理系统_897cjl4r沙箱支付
  • Thinkphp和Laravel企业员工薪酬工资管理系统_n4s02htu可视化
  • Thinkphp和Laravel基于Vue的农产品助农商城助农商超网站的论坛_rtplg00p
  • 【机器人控制】基于李雅普诺夫差动驱动机器人领导-跟随者控制附Matlab代码
  • 【无人机控制】基于缓解自组织交通堵塞的协作自适应巡航控制算法附Matlab代码
  • Thinkphp和Laravel基于Vue的数学考研试题库管理系统设计与实现_n9s068ni
  • Thinkphp和Laravel基于Vue的大学生心理健康交流系统的设计与实现_368iyvy1
  • Java 大视界 -- Java 大数据在智能农业温室环境调控与作物生长模型构建中的应用
  • Linux内核参数高并发场景优化:net.ipv4.tcp_fin_timeout
  • 如果我能重新开始,我会如何学习机器学习
  • 【OFDM雷达】基于P4相位编码序列OFDM雷达波形设计附Matlab代码
  • Azure 告警转发到钉钉:完整实现指南
  • Xshell连接故障排雷
  • 免费电影广告陷阱的常见形式
  • Azure OpenAI 告警分析与处理指南
  • 【动力学】飞机起落架的机械动力学与分析与Matlab仿真
  • 【PostgreSQL】常用SQL
  • MobaXterm高效运维实战
  • MobaXterm高效运维实战
  • stm32 USART-中断回显实验 QA
  • 基于python的口腔诊所门诊管理系统的设计与实现_e47798hi
  • 【PostgreSQL】日常总结
  • 如何利用 `Performance.measure` 自动化收集每个 Fiber 节点的 `actualDuration` 并生成性能报告
  • 【图像去噪】基于量子自适应变换图像去噪(含SNR PSNR)附Matlab代码
  • NTLM Relay
  • AI工具实战测评技术
  • 【路径规划】基于混合人工蜂群ABC和粒子群优化PSO算法用于机器人路径规划附matlab代码
  • RedisConnectionMonitor.java
  • 代码重构艺术