Skip to content

Countdown 倒计时

高性能倒计时组件,支持目标时间/持续时间模式、暂停/恢复、预警状态、翻牌动画、服务器时间校准等高级功能。采用 requestAnimationFrame 实现精准计时。

基础用法

设置 value 为目标时间戳或 Date 对象,组件会自动计算剩余时间并倒计时。

01:59:59
基础用法

持续时间模式

传入毫秒数(小于 978307200000,即 2001-01-01)时,视为持续时间模式。

01:00
05分00秒
持续时间模式

自定义格式与文本

通过 format 属性自定义显示格式。支持 DDHHmmssSSS 占位符。同时支持 titlesuffix

01天01:01:01
01:01.500
剩余计时:
01:00:00
(预计)
自定义格式

翻牌样式

设置 flip-animation 启用翻牌样式,结合 labels 为每个时间单位添加标签。

01
:
01
:
01
翻牌样式

控制倒计时

通过 ref 获取组件实例,手动控制倒计时的生命周期。

00:01:00
控制倒计时

预警状态

通过 warning-threshold 设置预警阈值。当倒计时进入该范围时,会添加 is-warning 类以便于样式自定义。

00:00:15
预警状态

完全自定义

利用默认插槽完全接管渲染。插槽作用域暴露了完整的 current 格式化对象及状态标识。

01:00:00
完全自定义

综合场景:限时抢购

结合翻牌动画、标签和预警状态,打造极具紧迫感的电商场景。

限时抢购
00
:
59
:
59
限时抢购

服务器时间校准

应对客户端时钟由于手动调节或系统延迟导致的偏差。

01:00:00
服务器时间校准

实战:弹窗同步案例

在复杂的 SPA 应用中,同一计时任务可能在页面多个位置出现(如商品详情页及弹出的购买面板)。组件通过内部的时间对齐机制,确保弹窗频繁开启/关闭时,时间显示始终与页面保持绝对一致。

页面倒计时:
00:09:59
弹窗同步

实战:电商秒杀列表

高性能 requestAnimationFrame 驱动,即使在瀑布流列表、海量秒杀券等高频刷新场景下,仍能保持极低的 CPU 占用和流畅的 UI 交互,且各计时器逻辑独立、互不干扰。

智能手表 Pro¥1,299
距结束
00:59:59
降噪耳机 Max¥1,899
距结束
01:59:59
机械键盘 G9¥599
距结束
00:29:59
秒杀列表

在 Nuxt 中使用

Countdown 组件完全支持 Nuxt 3/4 的 SSR 渲染。在 Nuxt 项目中使用时,组件会自动导入,无需手动注册。

01:59:59
Nuxt 中使用

SSR 注意事项

  • ✅ 组件初始渲染完全支持 SSR
  • ✅ 时间计算和格式化在服务端完成
  • ✅ Hydration 表现优异,无首屏跳动
  • ✅ 自动感应客户端挂载并启动计时
  • 💡 建议结合 server-time-offset 使用以保证多端时间绝对一致

SSR 性能

Countdown 内部使用 requestAnimationFrame 进行计时,该逻辑仅在客户端执行,不会消耗任何服务端资源。初始渲染时会根据当前服务器时间预计算剩余值,确保全链路体验的一致性。

API

Props

属性名说明类型默认值
value目标时间(Date/时间戳)或持续时间(毫秒)Date | number
format格式化模板或函数string | (ctx) => string'HH:mm:ss'
auto-start是否自动开始booleantrue
interval刷新间隔(毫秒)number1000
precision计时精度(毫秒)1000 | 100 | 101000
title标题/前缀文本string
suffix后缀文本string
use-monospace-font使用等宽字体防止数字跳变booleantrue
flip-animation启用翻牌动画模式booleanfalse
value-style倒计时数字的内联样式CSSProperties | string
separator时间单位之间的分隔符string':'
show-days显示天数 ('auto' 表示 >= 24h 时显示)boolean | 'auto''auto'
show-hours是否显示小时booleantrue
show-minutes是否显示分钟booleantrue
show-seconds是否显示秒booleantrue
show-milliseconds是否显示毫秒booleanfalse
labels时间单位的标签模板object
keep-alive-on-finish结束后是否保持在 00:00:00booleantrue
warning-threshold预警阈值(毫秒)number
timezone-offset时区偏移(分钟),用于校准多端时差number
server-time-offset服务器时间与本地时间的毫秒差number0

Events

事件名说明回调参数
change倒计时更新时触发(ctx: CountdownFormatContext) => void
finish倒计时结束时触发() => void
start开始倒计时时触发() => void
pause暂停时触发() => void
resume恢复时触发() => void
reset重置时触发() => void
warning进入预警范围时触发(ctx: CountdownFormatContext) => void
status-change状态改变时触发(status: CountdownStatus) => void

Slots

插槽名说明参数
default完全自定义渲染{ current, remaining, formatted, status, isWarning, isFinished }
prefix前缀占位符
suffix后缀占位符
value自定义数字显示部分{ text: string }
separator自定义单位分隔符
[key]-cell自定义具体单元格 (如 seconds-cell){ value: string }

Methods (通过 ref 调用)

方法名说明参数返回值
start开始计时void
pause暂停计时void
resume恢复计时void
reset重置计时void
getRemain获取当前剩余毫秒number
getStatus获取当前计时状态CountdownStatus

类型定义

typescript
type CountdownStatus = 'pending' | 'running' | 'paused' | 'finished'

interface CountdownFormatContext {
  total: number // 总剩余毫秒
  days: number
  hours: number
  minutes: number
  seconds: number
  milliseconds: number
  DD: string // 两位数天
  HH: string
  mm: string
  ss: string
  SSS: string
  SS: string // 两位数毫秒前的两位
  S: string // 一位数毫秒的第一位
}

主题变量

Countdown 组件支持通过覆盖以下 CSS 变量来自定义局部样式。所有颜色变量已与全局主题系统对接,自动支持暗黑模式:

变量名说明默认值
--yh-countdown-font-size数字字体大小24px
--yh-countdown-value-color数字颜色var(--yh-text-color-primary)
--yh-countdown-label-color标签颜色var(--yh-text-color-secondary)
--yh-countdown-separator-color分隔符颜色var(--yh-text-color-placeholder)
--yh-countdown-warning-color预警状态颜色var(--yh-color-danger)
--yh-countdown-finished-color结束状态颜色var(--yh-color-success)
--yh-countdown-bg组件根背景transparent
--yh-countdown-block-bg翻牌块背景var(--yh-fill-color-light)
--yh-countdown-block-shadow翻牌块阴影var(--yh-shadow-sm)
--yh-countdown-block-radius翻牌块圆角var(--yh-radius-md)
--yh-countdown-block-padding翻牌块内边距12px 16px
--yh-countdown-gap组件内部元素间距8px
--yh-countdown-font-family默认字体族var(--yh-font-family)
--yh-countdown-monospace-font等宽字体族 (用于防止跳变)JetBrains Mono, SF Mono...

Released under the MIT License.