如何在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
相关产品推荐
相关产品推荐

