组件/动态加载器

动态加载器

137 个源定义加载场景,支持独立播放、本地化和可见性控制。

自 0.6.3BETA

当前组件文档正在开发中

该页面正在持续迁移,示例与 API 可能会继续调整。

概述

TxMotionLoader 保留 Amicro 的 134 个命名加载实现,再加入 3 个 CSS 加载器。每个变体都有对应源码的几何结构、运动轨迹、相位和节奏。下表保留原始 ID 和导出名。组件用于进度未知的等待状态,不会报告业务完成。

根节点是礼貌播报的状态区域,带有稳定的无障碍名称。动画画面不进入无障碍树。只有 playing=true、组件已挂载且可见、页面可见、用户未要求减少动态效果时才播放。任意条件关闭后,组件取消原生动画,保留可读静态画面。恢复时重新开始对应源码的节奏。

用法

全部命名场景

筛选完整目录,逐项或批量控制播放,并调整尺寸、速度和本地化状态文字。滚动目录包含全部 137 项,离开可见区域的项目不会播放动画。

示例加载中...

受控播放

playing 表示播放请求,可见性和减少动态效果设置仍优先。修改源 ID 会切换几何结构。旧场景先释放资源,新场景再开始播放。

<script setup lang="ts">
import { ref } from 'vue'
import { TxMotionLoader } from '@talex-touch/tuffex'

const playing = ref(true)
</script>

<template>
  <TxMotionLoader
    variant="wave-physics-loader"
    :playing="playing"
    :labels="{ loading: '加载中', paused: '已暂停' }"
  />
  <button type="button" @click="playing = !playing">切换播放状态</button>
</template>

最佳实践

  • 首次加载的内容占位优先使用 TxSkeleton 或 TxRowSkeleton。短时间、进度未知的等待状态可以选择适合当前界面的动态加载器。
  • 让 playing 跟随真实等待状态。暂停动画不代表请求完成,因此状态区域仍标记为忙碌。
  • 按当前语言提供 label 和 labels。文本变体使用这些文字,包括逐字波浪和弹起场景。
  • 进度可计算时使用 TxProgressBar。加载器不会模拟百分比,也不会在定时器到期后伪报成功。
  • 保持适中的速度。离屏、隐藏页面、KeepAlive 和减少动态效果的暂停由组件统一处理。

API 参考

属性

属性类型默认值说明
variantMotionLoaderVariant'classic-spinner'下方 137 项目录中的原始源 ID。
playingbooleantrue请求播放。设为 false 会取消全部原生轨道,保留可读静态画面。
size'xs' | 'sm' | 'md' | 'lg''md'源几何缩放倍率分别为 0.65、0.85、1 和 1.25。长宽比和相位距离仍来自源码。
speednumber1正数播放倍率。非有限值或非正数按 1 处理。
labelstringlabels.loading无障碍状态名称和可见状态文字,独立于动画画面中的词语。
labelsMotionLoaderLabels见下表文本场景和暂停状态使用的本地化词语。
showLabelbooleantrue显示状态文字。设为 false 仅在视觉上裁切,仍保留在无障碍树中。

文字配置

字段默认值使用位置
loading'Loading'状态文字、AppleTextReveal、Typing、TextMorph 和 SpringTextPop。SpringTextPop 保留源码追加的三个点。
thinking'Thinking'TextBlink、TextDots、TextShimmer 和 TextShimmerWave。
waiting'Wait'TextMorph 的第二个文字层。
unlock'Slide to unlock'AppleUnlock 的两个扫光层。
terminal'loading...'TerminalLoader 的命令文字。光标和提示符保留源几何结构。
paused'Paused'playing=false 时的状态文字。

事件

无组件专属事件。宿主控制真实等待状态和 playing 属性。

插槽

无插槽。文本场景从 labels 读取内容,不以通用画面替代缺失内容。

导出

  • TxMotionLoader 和可安装的 MotionLoader 组件。
  • MOTION_LOADER_VARIANTS:枚举全部 137 个源 ID 的只读元组。MotionLoaderVariant 从这个元组推导。
  • MOTION_LOADER_SOURCES:每项包含 id、原始导出名 name 和固定上游路径 source 的类型化记录。
  • MotionLoaderProps、MotionLoaderLabels、MotionLoaderSize、MotionLoaderSource 和 TxMotionLoaderInstance。

来源映射

来源固定在 Amicro 提交 43c29ce9cdd16459e3eab4992381b8d35b38776a,遵循 MIT 许可,Copyright (c) 2026 SYED SUBHAN UDDIN。下表记录源码的运动值和逐节点相位,不按名称推测动画。原生 spin 工具类保留一秒线性旋转。源码未指定缓动时使用原有的 ease-out 默认值。

变体 ID原始导出固定源文件源轨迹与节奏
accordion-loaderAccordionLoaderregistry/ui/loading/accordion-loader.tsxscaleX=1,0.2,1 · 1.5s/easeInOut
scaleX=1,0.2,1 · 1.5s/easeInOut, 相位 0.15s
scaleX=1,0.2,1 · 1.5s/easeInOut, 相位 0.3s
scaleX=1,0.2,1 · 1.5s/easeInOut, 相位 0.45s
app-icon-loadAppIconLoadregistry/ui/loading/app-icon-load.tsxstrokeDashoffset=125,0 · 2s/easeInOut
apple-breatheAppleBreatheregistry/ui/loading/apple-breathe.tsxscale=1,1.75,1; x=0,11,0; y=0,0,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,5.5,0; y=0,9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-5.5,0; y=0,9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-11,0; y=0,0,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,-5.5,0; y=0,-9.526279,0 · 3.6s/easeInOut
scale=1,1.75,1; x=0,5.5,0; y=0,-9.526279,0 · 3.6s/easeInOut
apple-equalizerAppleEqualizerregistry/ui/loading/apple-equalizer.tsxheight="20%","100%","20%" · 0.8s/circInOut, 相位 0.06s
height="20%","100%","20%" · 0.8s/circInOut, 相位 0.41s
height="20%","100%","20%" · 0.8s/circInOut, 相位 0.19s
height="20%","100%","20%" · 0.8s/circInOut, 相位 0.32s
apple-icon-morphAppleIconMorphregistry/ui/loading/apple-icon-morph.tsxborderRadius="20%","50%","50%","20%"; rotate=0,90,180,270 · 2s/easeInOut
apple-pulse-dotsApplePulseDotsregistry/ui/loading/apple-pulse-dots.tsxscale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut
scale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut, 相位 0.15s
scale=0.5,1,0.5; opacity=0.3,1,0.3 · 1.2s/easeInOut, 相位 0.3s
anim-apple-spinnerAppleRadialSpinnersrc/components/css-animations/whimsical/AppleLoaders.tsxopacity=1,0.15 · 0.8s/linear, 相位 -0.8s
opacity=1,0.15 · 0.8s/linear, 相位 -0.7s
opacity=1,0.15 · 0.8s/linear, 相位 -0.6s
opacity=1,0.15 · 0.8s/linear, 相位 -0.5s
opacity=1,0.15 · 0.8s/linear, 相位 -0.4s
opacity=1,0.15 · 0.8s/linear, 相位 -0.3s
opacity=1,0.15 · 0.8s/linear, 相位 -0.2s
opacity=1,0.15 · 0.8s/linear, 相位 -0.1s
apple-scale-pulseAppleScalePulseregistry/ui/loading/apple-scale-pulse.tsxscale=0,1; opacity=1,0 · 1.5s/easeOut
scale=0,1; opacity=1,0 · 1.5s/easeOut, 相位 0.5s
apple-sound-waveAppleSoundWaveregistry/ui/loading/apple-sound-wave.tsxheight=4,8,4 · 1s/easeInOut
height=4,16,4 · 1s/easeInOut, 相位 0.1s
height=4,24,4 · 1s/easeInOut, 相位 0.2s
height=4,16,4 · 1s/easeInOut, 相位 0.3s
height=4,8,4 · 1s/easeInOut, 相位 0.4s
apple-text-revealAppleTextRevealregistry/ui/loading/apple-text-reveal.tsxy="100%","0%","-100%" · 2s/easeInOut
apple-unlockAppleUnlockregistry/ui/loading/apple-unlock.tsxbackgroundPosition="200% 0","-200% 0" · 2.2s/linear
arc-tracerArcTracerregistry/ui/loading/arc-tracer.tsxstrokeDashoffset=125,0,-125 · 2s/easeInOut
bar-cascadeBarCascaderegistry/ui/loading/bar-cascade.tsxheight="8px","24px","8px" · 1s/easeInOut
height="8px","24px","8px" · 1s/easeInOut, 相位 0.1s
height="8px","24px","8px" · 1s/easeInOut, 相位 0.2s
height="8px","24px","8px" · 1s/easeInOut, 相位 0.3s
height="8px","24px","8px" · 1s/easeInOut, 相位 0.4s
bar-sweepBarSweepregistry/ui/loading/bar-sweep.tsxx=0,24,0 · 1.5s/easeInOut
bobbing-dotsBobbingDotsregistry/ui/loading/bobbing-dots.tsxy=0,-10,0 · 1.2s/easeInOut
y=0,-10,0 · 1.2s/easeInOut, 相位 0.15s
y=0,-10,0 · 1.2s/easeInOut, 相位 0.3s
bounce-dotsBounceDotsregistry/ui/loading/bounce-dots.tsxy=0,-8,0 · 0.6s/easeInOut
y=0,-8,0 · 0.6s/easeInOut, 相位 0.1s
y=0,-8,0 · 0.6s/easeInOut, 相位 0.2s
bouncing-barsBouncingBarsregistry/ui/loading/bouncing-bars.tsxscaleY=0.3,1,0.3 · 1s/easeInOut
scaleY=0.3,1,0.3 · 1s/easeInOut, 相位 0.2s
scaleY=0.3,1,0.3 · 1s/easeInOut, 相位 0.4s
bouncing-dotsBouncingDotsregistry/ui/loading/bouncing-dots.tsxy=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut
y=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut, 相位 0.1s
y=0,-20,0; scaleY=0.8,1.1,0.8 · 0.8s/easeInOut, 相位 0.2s
bouncing-linesBouncingLinesregistry/ui/loading/bouncing-lines.tsxscaleX=0.3,1,0.3 · 1s/easeInOut
scaleX=0.3,1,0.3 · 1s/easeInOut, 相位 0.2s
scaleX=0.3,1,0.3 · 1s/easeInOut, 相位 0.4s
bouncing-squareBouncingSquareregistry/ui/loading/bouncing-square.tsxy=0,-24,0; scaleY=0.8,1.1,0.8; scaleX=1.2,0.9,1.2 · 0.6s/easeInOut
breathe-ringBreatheRingregistry/ui/loading/breathe-ring.tsxscale=0.8,1.1,0.8; borderWidth=6,2,6 · 3s/easeInOut
breathing-glowBreathingGlowregistry/ui/loading/breathing-glow.tsxscale=1,1.5,1; opacity=0.5,0.8,0.5 · 2s/easeInOut
breathing-squareBreathingSquareregistry/ui/loading/breathing-square.tsxscale=1,1.2,1; borderRadius="0%","50%","0%"; rotate=0,90,180 · 2s/easeInOut
circular-barsCircularBarsregistry/ui/loading/circular-bars.tsxscaleY=0.5,1.5,0.5 · 1.2s/easeInOut
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.15s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.3s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.45s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.6s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.75s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 0.9s
scaleY=0.5,1.5,0.5 · 1.2s/easeInOut, 相位 1.05s
classic-spinnerClassicSpinnerregistry/ui/loading/classic-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, 相位 0.083s
opacity=1,0.2 · 1s/linear, 相位 0.167s
opacity=1,0.2 · 1s/linear, 相位 0.25s
opacity=1,0.2 · 1s/linear, 相位 0.333s
opacity=1,0.2 · 1s/linear, 相位 0.417s
opacity=1,0.2 · 1s/linear, 相位 0.5s
opacity=1,0.2 · 1s/linear, 相位 0.583s
opacity=1,0.2 · 1s/linear, 相位 0.667s
opacity=1,0.2 · 1s/linear, 相位 0.75s
opacity=1,0.2 · 1s/linear, 相位 0.833s
opacity=1,0.2 · 1s/linear, 相位 0.917s
clock-spinnerClockSpinnerregistry/ui/loading/clock-spinner.tsxrotate=360 · 2s/linear
rotate=360 · 12s/linear
comet-spinnerCometSpinnerregistry/ui/loading/comet-spinner.tsxrotate=360 · 1s/linear
concentric-pulseConcentricPulseregistry/ui/loading/concentric-pulse.tsxwidth=48; height=48; opacity=0 · 2s/easeOut, 相位 0.6s
width=48; height=48; opacity=0 · 2s/easeOut, 相位 1.2s
width=48; height=48; opacity=0 · 2s/easeOut, 相位 1.8s
concentric-ringConcentricRingregistry/ui/loading/concentric-ring.tsxrotate=360 · 2s/linear
rotate=-360 · 1.5s/linear
rotate=360 · 1s/linear
concentric-squaresConcentricSquaresregistry/ui/loading/concentric-squares.tsxrotate=0,90,90; scale=1,1,0.8,1 · 2s/easeInOut
rotate=0,-90,-90; scale=1,1,1.2,1 · 2s/easeInOut
conveyor-loopConveyorLoopregistry/ui/loading/conveyor-loop.tsxx=0,-32 · 1s/linear
cross-spinnerCrossSpinnerregistry/ui/loading/cross-spinner.tsxrotate=0,90,180,270,360 · 2s/easeInOut
cube-flip-springCubeFlipSpringregistry/ui/loading/cube-flip-spring.tsxrotateX=0,180,180; rotateY=0,0,180 · 2s/spring, bounce=0.2
dash-ringDashRingregistry/ui/loading/dash-ring.tsxrotate=360 · 4s/linear
dashed-spiralDashedSpiralregistry/ui/loading/dashed-spiral.tsxrotate=360; scale=1,1.1,1 · 4s/linear
diamond-gridDiamondGridregistry/ui/loading/diamond-grid.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.6s
diamond-rotate-springDiamondRotateSpringregistry/ui/loading/diamond-rotate-spring.tsxrotate=45,135,225,315 · 2s/spring, bounce=0.4
dot-spinnerDotSpinnerregistry/ui/loading/dot-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, 相位 0.125s
opacity=1,0.2 · 1s/linear, 相位 0.25s
opacity=1,0.2 · 1s/linear, 相位 0.375s
opacity=1,0.2 · 1s/linear, 相位 0.5s
opacity=1,0.2 · 1s/linear, 相位 0.625s
opacity=1,0.2 · 1s/linear, 相位 0.75s
opacity=1,0.2 · 1s/linear, 相位 0.875s
dots-ringDotsRingregistry/ui/loading/dots-ring.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.15s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.3s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.45s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.6s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.75s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.9s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 1.05s
double-ringDoubleRingregistry/ui/loading/double-ring.tsxrotate=360 · 1.5s/linear
rotate=-360 · 1s/linear
drop-dotDropDotregistry/ui/loading/drop-dot.tsxy=0,24,0; scaleY=1,1.2,1; scaleX=1,0.8,1 · 1s/circIn
dual-arcDualArcregistry/ui/loading/dual-arc.tsxrotate=360; scale=1,0.82,1 · (rotate 1.2s/linear, scale 1.2s/easeInOut)
dynamic-islandDynamicIslandregistry/ui/loading/dynamic-island.tsxwidth=80,110,80 · 2.2s/easeInOut
opacity=0.4,1,0.4 · 1.1s/easeInOut
height=3,8,3 · 0.8s/easeInOut
height=3,8,3 · 0.8s/easeInOut, 相位 0.15s
height=3,8,3 · 0.8s/easeInOut, 相位 0.3s
elastic-barsElasticBarsregistry/ui/loading/elastic-bars.tsxheight=8,36,8 · 1.1s/easeInOut
height=8,36,8 · 1.1s/easeInOut, 相位 0.15s
height=8,36,8 · 1.1s/easeInOut, 相位 0.3s
elastic-squareElasticSquareregistry/ui/loading/elastic-square.tsxy=0,-20,0; scaleY=0.7,1.2,0.7; scaleX=1.3,0.8,1.3 · 0.8s/easeInOut
expanding-crossExpandingCrossregistry/ui/loading/expanding-cross.tsxscaleX=0.2,1,0.2 · 1.5s/easeInOut
scaleY=0.2,1,0.2 · 1.5s/easeInOut, 相位 0.75s
face-id-scanFaceIDScanregistry/ui/loading/face-id-scan.tsxtop="-100%","100%","-100%" · 2.5s/linear
fade-arcFadeArcregistry/ui/loading/fade-arc.tsxrotate=0→360 · 1s/linear
fade-dotsFadeDotsregistry/ui/loading/fade-dots.tsxopacity=0,1,0 · 1.5s/linear
opacity=0,1,0 · 1.5s/linear, 相位 0.2s
opacity=0,1,0 · 1.5s/linear, 相位 0.4s
opacity=0,1,0 · 1.5s/linear, 相位 0.6s
flip-squareFlipSquareregistry/ui/loading/flip-square.tsxrotateX=0,180,180,0; rotateY=0,0,180,180 · 2s/easeInOut
floating-diamondsFloatingDiamondsregistry/ui/loading/floating-diamonds.tsxy=0,-10,0 · 1s/easeInOut
y=0,-10,0 · 1s/easeInOut, 相位 0.2s
y=0,-10,0 · 1s/easeInOut, 相位 0.4s
fluid-barsFluidBarsregistry/ui/loading/fluid-bars.tsxrotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, 相位 0.1s
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, 相位 0.2s
rotate=-15,15,-15; scaleY=0.8,1,0.8 · 1.5s/easeInOut, 相位 0.3s
fluid-diamondFluidDiamondregistry/ui/loading/fluid-diamond.tsxscaleX=1,1.5,1; scaleY=1,0.5,1 · 1.5s/easeInOut
fluid-dot-orbitFluidDotOrbitregistry/ui/loading/fluid-dot-orbit.tsxrotate=360 · 2s/linear
fluid-skeletonFluidSkeletonregistry/ui/loading/fluid-skeleton.tsxx="-100%","200%" · 1.5s/linear
gearsGearsregistry/ui/loading/gears.tsxrotate=360 · 4s/linear
rotate=-360 · 3s/linear
glassmorphic-cardGlassmorphicCardregistry/ui/loading/glassmorphic-card.tsxx=-20,20,-20; y=-10,10,-10 · 3s/easeInOut
rotate=0→360 · 1s/linear
gradient-arcGradientArcregistry/ui/loading/gradient-arc.tsxrotate=360 · 1.2s/linear
grid-dotsGridDotsregistry/ui/loading/grid-dots.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.6s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.8s
haptic-ringHapticRingregistry/ui/loading/haptic-ring.tsxrotate=0,90,180,270,360 · 2s/spring, bounce=0.4
heartbeatHeartbeatregistry/ui/loading/heartbeat.tsxstrokeDashoffset=100,-100 · 2s/linear
hexagon-spinnerHexagonSpinnerregistry/ui/loading/hexagon-spinner.tsxstrokeDashoffset=120,-120 · 2s/linear
hourglassHourglassregistry/ui/loading/hourglass.tsxrotate=0,180,180,360,360 · 3s/easeInOut
infinity-pathInfinityPathregistry/ui/loading/infinity-path.tsxstrokeDashoffset=100,-100 · 2s/linear
intersecting-ringsIntersectingRingsregistry/ui/loading/intersecting-rings.tsxrotateX=360; rotateY=180 · 2.2s/linear
rotateX=180; rotateY=360 · 2.2s/linear
ios-spinnerIOSSpinnerregistry/ui/loading/ios-spinner.tsxopacity=1,0.2 · 1s/linear
opacity=1,0.2 · 1s/linear, 相位 0.083s
opacity=1,0.2 · 1s/linear, 相位 0.167s
opacity=1,0.2 · 1s/linear, 相位 0.25s
opacity=1,0.2 · 1s/linear, 相位 0.333s
opacity=1,0.2 · 1s/linear, 相位 0.417s
opacity=1,0.2 · 1s/linear, 相位 0.5s
opacity=1,0.2 · 1s/linear, 相位 0.583s
opacity=1,0.2 · 1s/linear, 相位 0.667s
opacity=1,0.2 · 1s/linear, 相位 0.75s
opacity=1,0.2 · 1s/linear, 相位 0.833s
opacity=1,0.2 · 1s/linear, 相位 0.917s
line-spinnerLineSpinnerregistry/ui/loading/line-spinner.tsxrotate=360 · 1.2s/linear
liquid-dotsLiquidDotsregistry/ui/loading/liquid-dots.tsxx=-16,16,-16 · 2s/easeInOut
x=16,-16,16 · 2s/easeInOut
mac-terminalMacTerminalregistry/ui/loading/mac-terminal.tsxopacity=1,0,1 · 1s/linear
magnetic-dotsMagneticDotsregistry/ui/loading/magnetic-dots.tsxx=0,8,0 · 1.5s/easeInOut
x=0,-8,0 · 1.5s/easeInOut
anim-matrix-loaderMatrixGridLoadersrc/components/css-animations/whimsical/MatrixGridLoader.tsxopacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, 相位 0.2s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, 相位 0.4s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, 相位 0.8s
opacity=0.25,0.55,0.8,1; backgroundColor="var(--tx-color-primary-dark-2)","var(--tx-color-primary)","var(--tx-color-primary-light-3)","var(--tx-color-primary-light-5)" · 0.8s/easeInOut, 相位 0.6s
minimal-triangleMinimalTriangleregistry/ui/loading/minimal-triangle.tsxstrokeDashoffset=120,0,-120 · 2s/easeInOut
morph-dot-ringMorphDotRingregistry/ui/loading/morph-dot-ring.tsxrotate=180; gap="4px","0px","4px" · 2s/easeInOut
morph-loaderMorphLoaderregistry/ui/loading/morph-loader.tsxborderRadius="25%","50%","50%","25%","25%"; rotate=0,90,180,270,360; scale=1,0.8,1.1,0.8,1 · 2.2s/easeInOut
morphing-barsMorphingBarsregistry/ui/loading/morphing-bars.tsxgap="4px","0px","4px" · 2s/easeInOut
height=32,16,32 · 2s/easeInOut
morphing-infinityMorphingInfinityregistry/ui/loading/morphing-infinity.tsxx=0,24,0; scale=1,0.5,1 · 2s/easeInOut
x=24,0,24; scale=0.5,1,0.5 · 2s/easeInOut
morphing-ringMorphingRingregistry/ui/loading/morphing-ring.tsxrotate=180; borderRadius="10%","50%","10%" · 2s/easeInOut
morphing-shapeMorphingShaperegistry/ui/loading/morphing-shape.tsxborderRadius="10%","50%","10%"; rotate=0,90,180; scale=1,0.8,1 · 2s/easeInOut
newtons-cradleNewtonsCradleregistry/ui/loading/newtons-cradle.tsxrotate=25,0,0,0,0,25 · 1.5s/easeInOut
rotate=0,0,0,-25,0,0 · 1.5s/easeInOut
offset-ringsOffsetRingsregistry/ui/loading/offset-rings.tsxrotate=0,180,360 · 2s/easeInOut
rotate=0,-180,-360 · 2s/easeInOut, 相位 0.2s
orbiting-circlesOrbitingCirclesregistry/ui/loading/orbiting-circles.tsxrotate=360 · 2s/linear
rotate=-360 · 2s/linear
orbiting-dotOrbitingDotregistry/ui/loading/orbiting-dot.tsxrotate=360 · 2s/linear
origami-shapeOrigamiShaperegistry/ui/loading/origami-shape.tsxrotateY=0,180,0 · 2s/easeInOut
pendulumPendulumregistry/ui/loading/pendulum.tsxrotate=-45,45,-45 · 1.5s/easeInOut
pulsating-dotsPulsatingDotsregistry/ui/loading/pulsating-dots.tsxscale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut
scale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut, 相位 0.2s
scale=1,1.5,1; opacity=0.5,1,0.5 · 1.2s/easeInOut, 相位 0.4s
pulsePulseregistry/ui/loading/pulse.tsxscale=2.8; opacity=0 · 1.8s/easeOut
scale=2.8; opacity=0 · 1.8s/easeOut, 相位 0.6s
pulse-dotPulseDotregistry/ui/loading/pulse-dot.tsxscale=0,1; opacity=0.8,0 · 1.5s/easeOut
pulse-dotsPulseDotsregistry/ui/loading/pulse-dots.tsxopacity=0.2,1,0.2 · 1.4s
opacity=0.2,1,0.2 · 1.4s, 相位 0.2s
opacity=0.2,1,0.2 · 1.4s, 相位 0.4s
anim-pulse-dotsPulseOrbitDotssrc/components/css-animations/whimsical/AppleLoaders.tsxscale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut
scale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut, 相位 0.2s
scale=0.6,1.15,0.6; opacity=0.3,1,0.3 · 1.2s/easeInOut, 相位 0.4s
pulse-squarePulseSquareregistry/ui/loading/pulse-square.tsxscale=1,1.2,1; opacity=1,0.3,1; borderRadius="20%","50%","20%" · 1.5s/easeInOut
pumping-heartPumpingHeartregistry/ui/loading/pumping-heart.tsxscale=1,1.25,1,1.25,1 · 1.5s/easeInOut
radar-sweepRadarSweepregistry/ui/loading/radar-sweep.tsxrotate=360 · 1.8s/linear
ring-sweepRingSweepregistry/ui/loading/ring-sweep.tsxrotate=360 · 1s/linear
ripple-effectRippleEffectregistry/ui/loading/ripple-effect.tsxscale=1.6; opacity=0 · 2.2s/easeOut
scale=1.6; opacity=0 · 2.2s/easeOut, 相位 0.7s
scale=1.6; opacity=0 · 2.2s/easeOut, 相位 1.4s
rotating-crossRotatingCrossregistry/ui/loading/rotating-cross.tsxrotate=180 · 0.8s/easeInOut
rotating-triangleRotatingTriangleregistry/ui/loading/rotating-triangle.tsxrotate=360 · 2s/linear
shape-shift-gridShapeShiftGridregistry/ui/loading/shape-shift-grid.tsxborderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, 相位 0.1s
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, 相位 0.2s
borderRadius="10%","50%","10%"; scale=1,0.8,1 · 1.5s/easeInOut, 相位 0.3s
shimmer-lineShimmerLineregistry/ui/loading/shimmer-line.tsxx="-100%","300%" · 1.5s/easeInOut
siri-waveSiriWaveregistry/ui/loading/siri-wave.tsxheight=4,24,4 · 1.2s/easeInOut
height=4,24,4 · 1.2s/easeInOut, 相位 0.1s
height=4,24,4 · 1.2s/easeInOut, 相位 0.2s
height=4,24,4 · 1.2s/easeInOut, 相位 0.3s
height=4,24,4 · 1.2s/easeInOut, 相位 0.4s
skeletonSkeletonregistry/ui/loading/skeleton.tsxx="150%" · 1.6s/easeInOut
skeleton-loaderSkeletonLoaderregistry/ui/loading/skeleton-loader.tsxopacity=0.5,1,0.5 · 1.5s/easeInOut
opacity=0.5,1,0.5 · 1.5s/easeInOut, 相位 0.2s
opacity=0.5,1,0.5 · 1.5s/easeInOut, 相位 0.4s
opacity=0.5,1,0.5 · 1.5s/easeInOut, 相位 0.6s
sliding-barsSlidingBarsregistry/ui/loading/sliding-bars.tsxy=0,24,0 · 1.5s/easeInOut
y=0,-24,0 · 1.5s/easeInOut
smooth-dot-shiftSmoothDotShiftregistry/ui/loading/smooth-dot-shift.tsxx=0,18,36,18,0 · 2s/easeInOut
smooth-ringSmoothRingregistry/ui/loading/smooth-ring.tsxrotate=0→360 · 1s/linear
smooth-rounded-squareSmoothRoundedSquareregistry/ui/loading/smooth-rounded-square.tsxborderRadius="10%","50%","10%" · 2s/easeInOut
spinning-squaresSpinningSquaresregistry/ui/loading/spinning-squares.tsxx=0,24,24,0,0; y=0,0,24,24,0 · 2s/easeInOut
x=0,-24,-24,0,0; y=0,0,-24,-24,0 · 2s/easeInOut
spiral-spinnerSpiralSpinnerregistry/ui/loading/spiral-spinner.tsxrotate=360; scale=1,0.8,1 · 1.5s/easeInOut
spring-barsSpringBarsregistry/ui/loading/spring-bars.tsxscaleX=0.2,1,0.2 · 1.4s/easeInOut
scaleX=0.2,1,0.2 · 1.4s/easeInOut, 相位 0.15s
scaleX=0.2,1,0.2 · 1.4s/easeInOut, 相位 0.3s
spring-dot-matrixSpringDotMatrixregistry/ui/loading/spring-dot-matrix.tsxscale=1,0.4,1 · 1.5s/easeInOut
scale=1,0.4,1 · 1.5s/easeInOut, 相位 0.15s
scale=1,0.4,1 · 1.5s/easeInOut, 相位 0.3s
scale=1,0.4,1 · 1.5s/easeInOut, 相位 0.45s
scale=1,0.4,1 · 1.5s/easeInOut, 相位 0.6s
spring-hexagonSpringHexagonregistry/ui/loading/spring-hexagon.tsxscale=1,1.15,1; rotate=0,60,60 · 2s/spring, bounce=0.3
spring-ring-expandSpringRingExpandregistry/ui/loading/spring-ring-expand.tsxscale=1.25; opacity=0 · 1.6s/easeOut
scale=1.25; opacity=0 · 1.6s/easeOut, 相位 0.8s
spring-text-popSpringTextPopregistry/ui/loading/spring-text-pop.tsxy=0,-6,0 · 1.2s/easeInOut
y=0,-6,0 · 1.2s/easeInOut, 相位 0.08s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.16s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.24s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.32s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.4s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.48s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.56s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.64s
y=0,-6,0 · 1.2s/easeInOut, 相位 0.72s
square-accordionSquareAccordionregistry/ui/loading/square-accordion.tsxheight=12,32,12 · 1.5s/easeInOut
height=12,32,12 · 1.5s/easeInOut, 相位 0.2s
height=12,32,12 · 1.5s/easeInOut, 相位 0.4s
square-gridSquareGridregistry/ui/loading/square-grid.tsxscale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.2s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.4s
scale=1,0.5,1; opacity=1,0.3,1 · 1.5s/easeInOut, 相位 0.6s
square-snakeSquareSnakeregistry/ui/loading/square-snake.tsxopacity=0.1,1,0.1 · 1.5s/easeInOut
opacity=0.1,1,0.1 · 1.5s/easeInOut, 相位 0.15s
opacity=0.1,1,0.1 · 1.5s/easeInOut, 相位 0.3s
opacity=0.1,1,0.1 · 1.5s/easeInOut, 相位 0.45s
opacity=0.1,1,0.1 · 1.5s/easeInOut, 相位 0.6s
square-spinnerSquareSpinnerregistry/ui/loading/square-spinner.tsxrotate=90 · 0.6s/easeInOut
stacked-bar-pulseStackedBarPulseregistry/ui/loading/stacked-bar-pulse.tsxopacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut
opacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut, 相位 0.2s
opacity=0.2,1,0.2; width="50%","100%","50%" · 1.5s/easeInOut, 相位 0.4s
swapping-dotsSwappingDotsregistry/ui/loading/swapping-dots.tsxx=0,32,0 · 1.5s/easeInOut
x=0,-32,0 · 1.5s/easeInOut
swirling-spinnerSwirlingSpinnerregistry/ui/loading/swirling-spinner.tsxrotate=360 · 1.3s/linear
rotate=-360 · 0.9s/linear
symmetric-waveSymmetricWaveregistry/ui/loading/symmetric-wave.tsxheight=8,24,8 · 1.2s/easeInOut
height=8,24,8 · 1.2s/easeInOut, 相位 0.1s
height=8,24,8 · 1.2s/easeInOut, 相位 0.2s
height=8,24,8 · 1.2s/easeInOut, 相位 0.3s
height=8,24,8 · 1.2s/easeInOut, 相位 0.4s
terminal-loaderTerminalLoaderregistry/ui/loading/terminal-loader.tsxopacity=1,0,1 · 0.8s/linear
text-blinkTextBlinkregistry/ui/loading/text-blink.tsxopacity=1,0.2,1 · 1.5s/easeInOut
text-dotsTextDotsregistry/ui/loading/text-dots.tsxopacity=0,1,1,0 · 2s
opacity=0,0,1,0 · 2s
text-morphTextMorphregistry/ui/loading/text-morph.tsxopacity=1,0,0,1; y=0,-16,16,0 · 3s/easeInOut
opacity=0,1,1,0; y=16,0,0,-16 · 3s/easeInOut
text-shimmerTextShimmerregistry/ui/loading/text-shimmer.tsxWebkitMaskPosition="100% 0%","-100% 0%" · 1.5s/linear
text-shimmer-waveTextShimmerWaveregistry/ui/loading/text-shimmer-wave.tsxopacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.1s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.2s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.3s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.4s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.5s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.6s
opacity=0.3,1,0.3; y=0,-2,0 · 1.5s/easeInOut, 相位 0.7s
trailing-dotsTrailingDotsregistry/ui/loading/trailing-dots.tsxrotate=360 · 1.5s/easeInOut
rotate=360 · 1.5s/easeInOut, 相位 0.1s
rotate=360 · 1.5s/easeInOut, 相位 0.2s
rotate=360 · 1.5s/easeInOut, 相位 0.3s
rotate=360 · 1.5s/easeInOut, 相位 0.4s
triple-dot-spinnerTripleDotSpinnerregistry/ui/loading/triple-dot-spinner.tsxrotate=360 · 2s/linear
twin-orbitTwinOrbitregistry/ui/loading/twin-orbit.tsxrotate=360 · 1.5s/linear
rotate=-360 · 1.5s/linear
typingTypingregistry/ui/loading/typing.tsxopacity=1,0,1 · 0.8s/linear
typing-indicatorTypingIndicatorregistry/ui/loading/typing-indicator.tsxy=0,-4,0 · 0.6s/easeInOut
y=0,-4,0 · 0.6s/easeInOut, 相位 0.15s
y=0,-4,0 · 0.6s/easeInOut, 相位 0.3s
wandering-cubeWanderingCuberegistry/ui/loading/wandering-cube.tsxx=0,24,24,0,0; y=0,0,24,24,0; rotate=0,-90,-180,-270,-360 · 2.5s/easeInOut
watch-spinnerWatchSpinnerregistry/ui/loading/watch-spinner.tsxrotate=360 · 1s/easeInOut
rotate=360 · 1.5s/easeInOut
rotate=360 · 2s/easeInOut
wave-dotsWaveDotsregistry/ui/loading/wave-dots.tsxy=4,-4,4 · 1s/easeInOut
y=4,-4,4 · 1s/easeInOut, 相位 0.15s
y=4,-4,4 · 1s/easeInOut, 相位 0.3s
y=4,-4,4 · 1s/easeInOut, 相位 0.45s
y=4,-4,4 · 1s/easeInOut, 相位 0.6s
wave-physics-loaderWavePhysicsLoaderregistry/ui/loading/wave-physics-loader.tsx15 根柱条与小球;201 个相位;4 次弹跳;4s
waveform-loaderWaveformLoaderregistry/ui/loading/waveform-loader.tsxheight=4,24,4 · 1s/easeInOut
height=4,24,4 · 1s/easeInOut, 相位 0.421s
height=4,24,4 · 1s/easeInOut, 相位 0.455s
height=4,24,4 · 1s/easeInOut, 相位 0.071s
height=4,24,4 · 1s/easeInOut, 相位 -0.378s
height=4,24,4 · 1s/easeInOut, 相位 -0.479s
height=4,24,4 · 1s/easeInOut, 相位 -0.14s
height=4,24,4 · 1s/easeInOut, 相位 0.328s
zig-zag-pulseZigZagPulseregistry/ui/loading/zig-zag-pulse.tsxopacity=0.2,1,0.2 · 1.2s/easeInOut
opacity=0.2,1,0.2 · 1.2s/easeInOut, 相位 0.1s
opacity=0.2,1,0.2 · 1.2s/easeInOut, 相位 0.2s
opacity=0.2,1,0.2 · 1.2s/easeInOut, 相位 0.3s
opacity=0.2,1,0.2 · 1.2s/easeInOut, 相位 0.4s
opacity=0.2,1,0.2 · 1.2s/easeInOut, 相位 0.5s

技术实现

源声明渲染为原生 HTML 和 SVG,不依赖 React、Framer Motion 或 Tailwind 运行时。Web Animations 保留独立属性轨道、明确的关键帧停点和错峰延迟。标记为 spring 的场景使用 TuffEx 共享 resolveTransition 编译器。文字值变化使用 TxTextMorph。Skeleton、SkeletonLoader 和 FluidSkeleton 组合现有 TxSkeleton 的几何结构,不创建第二个失去控制的骨架屏循环。

WavePhysicsLoader 保留 15 根柱条、201 个采样相位、每次横穿的 4 次抛物线弹跳、余弦影响半径、落点压入和小球挤压伸展。四秒往返轨迹不替换为通用波浪。292px 源场景先应用 0.38 的展示倍率,再应用公共尺寸倍率。

TextDots 保留三个源停点列表:[0, 0.2, 0.8, 1]、[0, 0.4, 0.8, 1] 和 [0, 0.6, 0.8, 1]。MatrixGridLoader 保留 [0, 0.5, 0.75, 1] 和 0.2、0.4、0.8、0.6 秒的四个延迟。AppleEqualizer 固定源码随机延迟的采样值为 0.06、0.41、0.19、0.32 秒,使服务端渲染保持确定性,不在水合时生成新的随机节奏。颜色使用主题令牌。SVG 黏连滤镜的 ID 使用 Vue 水合稳定的 useId()。

共享 useMotionActivity 负责可见性、减少动态效果和 KeepAlive 生命周期。每个场景持有自己的原生动画,在暂停、切换源和卸载时取消。不支持 Web Animations 的浏览器保留相同的静态画面。