You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Svelte环形进度条组件中实现百分比变化的tweened动画?

实现CircularProgressBar的百分比动画效果

你不需要专门的onPropValueChange()方法,Svelte的响应式声明($:)就能完美监听属性变化,结合svelte/motion的tweened就能实现平滑动画。

修改你的CircularProgressBar.svelte组件如下:

<script>
    import { onMount } from "svelte";
    import { tweened } from 'svelte/motion';
    import { quadOut } from 'svelte/easing'; // 可选,替换成你喜欢的缓动函数

    /**
     * @type string
     */
    export let percentage;

    // 初始化带动画的百分比变量,配置动画参数
    const animatedPercentage = tweened(Number(percentage), {
        duration: 500, // 动画时长(毫秒)
        easing: quadOut // 缓动曲线,控制动画节奏
    });

    // 监听percentage属性变化,自动触发动画更新
    $: if (percentage !== undefined) {
        animatedPercentage.set(Number(percentage));
    }

    // ...other props...

    onMount(() => {
        console.log("I was created!");
    });
</script>

<!-- 模板中使用$animatedPercentage替代原percentage渲染进度 -->
<!-- 以下是环形进度条的示例实现,可根据你的实际结构调整 -->
<svg class="circular-progress">
    <!-- 背景圆环 -->
    <circle cx="50" cy="50" r="45" fill="none" stroke="#eee" stroke-width="8"/>
    <!-- 动态进度圆环:用$animatedPercentage计算 stroke-dasharray 实现进度变化 -->
    <circle 
        cx="50" cy="50" r="45" 
        fill="none" stroke="#2563eb" stroke-width="8"
        stroke-dasharray={`${$animatedPercentage * 2.83} 283`}
        transform="rotate(-90 50 50)"
        stroke-linecap="round"
    />
    <!-- 显示当前百分比文本 -->
    <text x="50" y="55" text-anchor="middle" font-size="16">{Math.round($animatedPercentage)}%</text>
</svg>

<style>
.circular-progress {
    width: 100px;
    height: 100px;
}
/* some gradients */
</style>

关键说明:

  • tweened会创建一个带动画的响应式store,自动处理从旧值到新值的平滑过渡
  • $:响应式声明会在percentage属性更新时自动执行,调用set()启动动画
  • 由于你的percentage是string类型,每次更新时转成Number保证动画正常工作
  • 组件外部的使用方式完全不变,依然通过percentage={pump.percentage}传递值

内容的提问来源于stack exchange,提问作者R1D3R175

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:47:12