Number Animation
通过计数、滚动或保持数位位置的方式呈现数值变化。
适用场景
- 当界面需要以下行为时使用 Number Animation:通过计数、滚动或保持数位位置的方式呈现数值变化。
安装
选择安装方式,用法示例将同步更新导入路径。
$ bunx --bun shadcn-vue@2.8.2 add https://orvui.efu.me/r/number.json https://orvui.efu.me/r/digit-swap.json https://orvui.efu.me/r/number-ticker.json https://orvui.efu.me/r/animated-number.json
首次使用时,将安装的 src/components/orvui/styles.css 导入项目样式入口。
示例
Digit Swap
digit-swap.vue保持数位位置固定,让变化数字按指定方向和错开时序滚动。
Card number•••• •••• •••• 0806
packages/vue/src/motion/number/examples/digit-swap.vue
<script setup lang="ts">
import { computed, ref } from "vue";
import { DigitSwap } from "@/components/orvui/motion/number";
const visible = ref(false);
const number = computed(() => visible.value ? "4242 4242 4242 0806" : "•••• •••• •••• 0806");
function toggle() { visible.value = !visible.value; }
</script>
<template>
<div class="flex w-80 flex-col gap-5">
<div class="flex flex-col gap-2"><span class="text-xs font-medium text-muted-foreground">Card number</span>
<DigitSwap :value="number" :animation-key="visible ? 'revealed' : 'masked'" :direction="visible ? 'up' : 'down'" :suffix-length="4"
:glyph-class-name="visible ? 'text-foreground' : 'text-muted-foreground'" suffix-class-name="text-foreground" class="font-mono text-lg tracking-[0.08em] tabular-nums" />
</div>
<button type="button" :aria-label="visible ? 'Animate masked number' : 'Animate card number'" :aria-pressed="visible" @click="toggle"
class="h-10 self-start rounded-lg border border-border px-3 text-sm font-medium text-foreground outline-none transition-colors hover:bg-muted focus-visible:ring-2 focus-visible:ring-ring">Animate</button>
</div>
</template>
packages/vue/src/motion/number/src/DigitSwap.vue
Number Ticker
ticker.vue让各数字列滚动到新值,并依次到达。
Active users
48,273live · updates every 2.5s
packages/vue/src/motion/number/examples/ticker.vue
<script setup lang="ts">
import { onBeforeUnmount, onMounted, ref } from "vue";
import { NumberTicker } from "@/components/orvui/motion/number";
const users = ref(48273);
let interval: ReturnType<typeof setInterval> | undefined;
function increment() { users.value += Math.floor(50 * Math.random()); }
onMounted(() => { interval = setInterval(increment, 2500); });
onBeforeUnmount(() => { clearInterval(interval); });
const formatCount = (count: number) => count.toLocaleString();
</script>
<template>
<div class="flex flex-col items-center gap-3"><p class="text-xs text-muted-foreground">Active users</p>
<NumberTicker :value="users" prefix="" class="text-4xl font-semibold tracking-tight text-foreground tabular-nums" :format="formatCount" />
<p class="text-xs text-muted-foreground">live · updates every 2.5s</p>
</div>
</template>
packages/vue/src/motion/number/src/NumberTicker.vue
Animated Number
animated.vue元素进入视口后,逐步计数到指定数值。
Monthly recurring revenue
$0
+12.4% vs last month
packages/vue/src/motion/number/examples/animated.vue
<script setup lang="ts">
import { AnimatedNumber } from "@/components/orvui/motion/number";
const formatRevenue = (amount: number) => `$${Math.round(amount).toLocaleString()}`;
</script>
<template>
<div class="flex flex-col items-center gap-3">
<p class="text-xs text-muted-foreground">Monthly recurring revenue</p>
<div class="text-4xl font-semibold tracking-tight text-foreground tabular-nums"><AnimatedNumber :value="129480" :format="formatRevenue" /></div>
<p class="text-xs text-(--color-success)">+12.4% vs last month</p>
</div>
</template>
packages/vue/src/motion/number/src/AnimatedNumber.vue
状态与事件
此示例组合没有声明成对的受控属性与 update 事件。使用已列出的属性、原生事件和插槽组合内容;不要为它添加未公开的 v-model。
API 参考
Digit Swap
valuestring | number—animationKey?string | numberprops.replayKeyreplayKey?string | numberCompatibility alias for animationKey.
—direction?"up" | "down""up"duration?number0.18stagger?number0.006suffixLength?number0className?string—glyphClassName?string—suffixClassName?string—suffix?string—Number Ticker
valuenumber—pad?number—decimals?numberprops.decimalPlacesdecimalPlaces?numberCompatibility alias for decimals.
—duration?number0.9stagger?number0.04startOnView?booleantrueprefix?string—suffix?string—blur?booleanfalseclassName?string—digitClassName?string—locale?booleanfalseformat?(value: number) => string—Animated Number
valuenumber—duration?number1.2format?(n: number) => string—className?string—startOnView?booleantrue无障碍
为交互控件提供明确的无障碍名称。保留文档中的键盘路径、可见焦点与减少动态效果状态;自定义插槽应继续保留所替代部件的语义。
常见问题
- 如何配置 Number Animation?
- 通过 value、duration、format、className、startOnView 配置 Number Animation;API 表列出其类型与默认值。
- 如何连接到应用状态?
- 通过文档中的组合方式提供内容,应用副作用由调用方管理。
- 可以在服务端渲染吗?
- 可以在 Vue SSR 应用中正常渲染。服务端与客户端的初始 props 应保持一致;浏览器测量与交互资源在挂载后启动。
更新于
来源与许可 ↗MIT · 0.1.1