A Vue 3 component for animation counting, wrap for countUp.js(v2.6.2) and expand some features.
npm
npm i vue-countup-v3
cdn
cdn 方式引入,暴露的全局变量为 VueCountUp<!DOCTYPE html>
<html lang="en">
<body>
<div id="app">
<count-up :end-val="2000"></count-up>
</div>
<script src="https://unpkg.com/vue@latest"></script>
<script src="https://unpkg.com/vue-countup-v3@latest/dist/vue-countup-v3.umd.js"></script>
<script>
const app = Vue.createApp({})
app.component('CountUp', VueCountUp)
app.mount('#app')
</script>
</body>
</html>
简单示例(simple usage)
<script setup lang="ts">
import CountUp from 'vue-countup-v3'
</script>
<template>
<count-up :end-val="2000"></count-up>
</template>
插槽示例(slot usage)
当 prefix / suffix 需要与数值样式区分开时,可使用插槽的方式取代 options 中的 prefix / suffix 配置。<script setup lang="ts">
import CountUp from 'vue-countup-v3'
</script>
<template>
<count-up :end-val="2000">
<template #prefix>
<span style="color: orange">prefix</span>
</template>
<template #suffix>
<span style="color: red">prefix</span>
</template>
</count-up>
</template>
完整示例(full usage)
<script setup lang="ts">
import { ref } from 'vue'
import CountUp from 'vue-countup-v3'
import type { ICountUp, CountUpOptions } from 'vue-countup-v3'
const endValueRef = ref(2022.22)
// coutup.js options
const options: CountUpOptions = {
separator: '❤️'
// ...
}
let countUp: ICountUp | undefined
const onInit = (ctx: ICountUp) => {
console.log('init', ctx)
countUp = ctx
}
const onFinished = () => {
console.log('finished')
}
</script>
<template>
<count-up
:end-val="endValueRef"
:duration="2.5"
:decimal-places="2"
:options="options"
:loop="2"
:delay="2"
@init="onInit"
@finished="onFinished"></count-up>
</template>
Vite
需在 vite.config.ts 中添加配置,将 vue-countup-v3 加入 ssr.noExternal 配置中,让 vite 不视为外部依赖,将依赖包含在 SSR 的打包中,避免出现问题。
import { defineConfig } from 'vite'
export default defineConfig({
// ...
ssr: {
noExternal: ['vue-countup-v3']
}
})
Nuxt
需在 nuxt.config.ts 中添加配置
// nuxt.config.ts
import { defineNuxtConfig } from 'nuxt3';
export default defineNuxtConfig({
build: {
transpile: ['vue-countup-v3'],
},
});
或者用 <ClientOnly>
组件包裹
<ClientOnly>
<CountUp :end-val="3000" :options="{ enableScrollSpy: true }" />
</ClientOnly>
Astro
需要在组件上加个指令 client:only
<CountUp client:load client:only end-val={2000} />
Name | Type | Default | Description | Version |
---|---|---|---|---|
endVal | Number | String | - | 结束值 | |
startVal | Number | String | 0 | 起始值 | |
duration | Number | 2.5 | 动画时长,单位:秒 | |
decimalPlaces | Number | 0 | 小数点位数 | 1.1.0 |
autoplay | Boolean | true | 是否自动计数 | |
loop | Boolean | Number | false | 循环次数,有限次数 / 无限循环 | |
delay | Number | 0 | loop 循环的间隔时间,单位:秒 | |
options | Object | - | countUp.js Options |
Name | Description |
---|---|
prefix | 前缀 |
suffix | 后缀 |
Name | Description | return |
---|---|---|
@init | CountUp 实例初始化完成触发 | CountUp 实例 |
@finished | 计数结束时触发 | - |
import type {
ICountUp,
CountUpOptions
} from 'vue-countup-v3'
interface CountUpOptions {
startVal?: number // number to start at (0) 开始数值,默认 0
decimalPlaces?: number // number of decimal places (0) 小数点 位数
duration?: number // animation duration in seconds (2) 动画时长
useGrouping?: boolean // example: 1,000 vs 1000 (true) 是否使用千分位
useIndianSeparators?: boolean; // example: 1,00,000 vs 100,000 (false)
useEasing?: boolean // ease animation (true) 是否开启动画过渡,默认动画函数为 easeOutExpo
smartEasingThreshold?: number // smooth easing for large numbers above this if useEasing (999)
smartEasingAmount?: number // amount to be eased for numbers above threshold (333)
separator?: string // grouping separator (',') 千分位分隔符
decimal?: string // decimal ('.') 小数点分隔符
// easingFn: easing function for animation (easeOutExpo) 动画函数
easingFn?: (t: number, b: number, c: number, d: number) => number
formattingFn?: (n: number) => string // this function formats result 格式化结果
prefix?: string // text prepended to result 数值前缀
suffix?: string // text appended to result 数值后缀
numerals?: string[] // numeral glyph substitution 数字符号替换 0 - 9,例如替换为 [a,b,c,d,e,f,g,h,i,j]
enableScrollSpy?: boolean // start animation when target is in view 在可视范围内才开始动画
scrollSpyDelay?: number // delay (ms) after target comes into view 目标进入可视范围内后的延迟时间(毫秒)
scrollSpyOnce?: boolean; // run only once
onCompleteCallback?: () => any; // gets called when animation completes
plugin?: CountUpPlugin; // for alternate animations
}
see more countUp.js
开始计数(Start animation)
countUp.start()
切换暂停/恢复(Toggle pause/resume)
countUp.pauseResume()
重置数值(Reset the animation)
countUp.reset()
修改结束值且继续动画(Update the end value and animate)
countUp.update(1000)
MIT