跳转到内容

NumberAnimation 数值动画 ​

数字从一个值滚动到另一个值。

用法 ​

挂载即从 from 变化到 to,三个尺寸档只改变字号;不写 size 即跟随上下文的字号

000

组件结构 ​

加粗的是必需部件。

data-scope="number-animation":root

示例 ​

小数位与千位分隔 ​

precision 决定小数位,separator 决定分隔符;不提供分隔符即不分隔,使用什么符号是地区习惯

整数、不分隔:0

整数、逗号分隔:0

两位小数、空格分隔: 0.00

负数也认:0.0

缓动与时长 ​

duration 决定时长,easing 决定快慢的分配;同一段距离四档并排运行,差别一目了然

linear: 0

easeIn: 0

easeOut: 0

easeInOut: 0

跟随数据变化 ​

修改 to 即从当前数字继续变化到新终点,结束后再次修改照样重新运行;active 切换为假即停在当前值

0

设计指引 ​

何时使用 ​

  • 仪表盘上的关键指标首次出现时,用滚动强调变化。

何时不用 ​

  • 数值频繁变化时,每次都滚动会使用户读不到稳定值。
  • 精确的金额或编号,用户需要读取而不是感知趋势。

特性 ​

  • precision 小数位、separator 千位分隔。
  • easing 与 duration 决定滚动的节奏。
  • live 决定读屏播报方式,通常只播报终值。

组合 ​

最佳实践 ​

  • 时长控制在一秒以内,更长会变成等待。
  • 读屏只播报终值,不读出每一帧。

反模式 ​

  • 给实时刷新的数字加滚动动画。
  • 系统开启减弱动效时仍然滚动。

API 参考 ​

产物 ​

层值
自定义元素<xh-number-animation>
Vue 组件XhNumberAnimation
状态机numberAnimationMachine
皮肤@xihan-ui/styles/number-animation.css

Props ​

属性类型必填说明
fromnumber起点,默认 0。改写它会把显示值立即落到新起点,并从那里重新运行本轮。
tonumber终点,默认 0。改写它从当前显示值继续走向新终点,不跳回起点。
durationnumber时长毫秒,默认 1000;<=0 即一步到位。
easingNumberAnimationEasing缓动:曲线名(linear / standard / easeIn / easeOut / easeInOut …)或 CSS 缓动函数串,默认线性;认不出的写法在起跑时报错。
precisionnumber小数位,默认 0。夹进 [0, 20]。
separatorstring千位分隔符,默认不分隔。
activeboolean是否运行,默认 true。变为假即停在当前值,变为真从当前值继续走向终点。
sizeSize尺寸:sm / md / lg,只写为 root 的 data-size。
toneTone语气:brand / neutral / success / warning / danger / info,只写为 root 的 data-tone。
liveNumberAnimationLive读屏播报档位,默认 off。
onComplete(details: NumberAnimationCompleteDetails) => void到达终点时通知一次。中途被停止不通知。

事件 ​

自定义元素将载荷放在 detail;Vue 使用同名 emit。

事件载荷说明
completeNumberAnimationCompleteDetails到达终点;detail 为 { value: number }

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhNumberAnimationdefaultNumberAnimationSlotProps

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhNumberAnimationchildrenSlotChildren<NumberAnimationSlotProps>

状态 ​

公开状态写入 data-state。

部件取值
root'idle' | 'running'

以下名称仅用于内部状态机。

状态:idle · running

事件:RUN.START · RUN.STOP · RUN.SYNC · FRAME

判据:isSettled · isActive

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
phaseNumberAnimationPhase
valuenumber当前数值(未格式化)。
textstring当前数值按 precision 与 separator 格式化的文本,即根中应显示的文字。
runningboolean是否仍在运行。
getRootProps() => T['element']

无障碍 ​

键盘 ​

规格出处:W3C APG

无键盘交互(不接收焦点,或焦点行为完全由原生元素提供)。

ARIA ​

以下属性由 connect 生成。

部件属性值
rootaria-liveprops.live
rootrole'status'

样式参考 ​

皮肤 ​

@xihan-ui/styles/number-animation.css 使用 [data-scope="number-animation"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-sizeprops.size
rootdata-state'idle' | 'running'
rootdata-toneprops.tone

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-number-animation-fgrootcolordefault--xh-_tone-fgnumber-animation 的 root 部件 color 覆盖槽。
--xh-number-animation-font-sizerootfont-sizedefault--xh-_number-animation-sizenumber-animation 的 root 部件 font-size 覆盖槽。

动效 ​

皮肤里没有过渡也没有关键帧,本组件的动效不在皮肤里:值由内核逐帧算出(frameLoop · isTweenDone · tweenValueAt),皮肤里看不到这段;内核按组件所在的作用域判断减弱动效(最近的 data-motion、应用级覆盖、系统偏好),据此决定要不要动。时长与缓动由组件属性给出。

系统开启减弱动效时由内核按元素判断后自行降级,不经令牌层。

Released under The MIT License