网站导航

设计令牌

动态效果

动画简写、持续时间值和缓动曲线。

本页内容

类

类声明
animate-<animation>animation: var(--animate-<animation>);
animation-<duration>animation-duration: var(--duration-<duration>);
transition-<duration>transition-duration: var(--duration-<duration>);
animation-delay-<duration>animation-delay: var(--duration-<duration>);
transition-delay-<duration>transition-delay: var(--duration-<duration>);
animation-<easing>animation-timing-function: var(--easing-<easing>);
transition-<easing>transition-timing-function: var(--easing-<easing>);

animation- 和 transition- 前缀都同时读取 duration 和 easing 命名空间。自定义键必须在两个命名空间之间保持不同,否则相同的键会产生歧义。animate- 读取的则是完整动画简写。

值

十个动画令牌包含关键帧名称,并会无限重复。七个持续时间提供时间长度,九条缓动曲线将时间进度映射为值进度。视觉比较只播放一次,初始状态为暂停,并遵循减少动态效果偏好。

动画

类值
animate-fadefade 1s infinite
animate-flashflash 1s infinite
animate-floatfloat 3s ease-in-out infinite
animate-heartheart 1s infinite
animate-jumpjump 1s infinite
animate-pingping 1s infinite
animate-pulsepulse 1s infinite
animate-rotaterotate 1s linear infinite
animate-shakeshake 1s infinite
animate-zoomzoom 1s infinite
比较全部动画
这里的每个预设动画只播放一次,初始状态为暂停。“播放”“暂停”和“重播”控制原生时间线。偏好减少动态效果时,内容保持静止;上方表格仍保留完整的预设简写值。

持续时间

类值
transition-fastest75ms
transition-faster.1s
transition-fast.15s
transition-normal.2s
transition-slow.3s
transition-slower.5s
transition-slowest.8s
比较全部持续时间
所有标记都沿着相同路径以线性时间函数移动,只有持续时间不同。初始状态为暂停,可一起播放或重播。偏好减少动态效果时,标记保持静止。

缓动

类值
transition-smoothcubic-bezier(.4, 0, .2, 1)
transition-softcubic-bezier(.33, 1, .68, 1)
transition-crispcubic-bezier(.16, 1, .3, 1)
transition-snapcubic-bezier(.2, 0, 0, 1)
transition-acceleratecubic-bezier(.4, 0, 1, 1)
transition-deceleratecubic-bezier(0, 0, .2, 1)
transition-overshootcubic-bezier(.34, 1.56, .64, 1)
transition-rewindcubic-bezier(.36, 0, .66, -.56)
transition-springcubic-bezier(.68, -.6, .32, 1.6)
比较全部缓动曲线
所有标记都在一秒内走过相同路径,只有时间函数不同。超出终点或回退的曲线可能让标记越过路径端点。偏好减少动态效果时,标记保持静止。

覆盖动画的一个部分

animate-pulse 设置完整的 animation 简写,包括 1s 的持续时间。条件相同时,animation-slow 排在简写之后,将持续时间替换为 300ms。关键帧名称与迭代次数保持不变;调整 class 属性中的顺序也不会改变结果。

持续时间类改变时间设置,但保留相同关键帧

两者使用相同的 pulse 关键帧。长条测量的是一次迭代的持续时间,不是动画进度或渲染速度。预设会重复播放,这个比较则单独呈现一次迭代。

文字说明
  1. animate-pulse 简写提供 pulse 1s infinite,每次迭代的持续时间为一秒。
  2. 条件相同时,animation-slow 排在 animate-pulse 之后,只将持续时间替换为 var(--duration-slow),也就是 300ms。pulse 关键帧与无限迭代次数保持不变。
  3. 两条水平长条都从零开始,在同一条毫秒轴上呈现 1000:300 的长度比例。它们测量的是声明的单次迭代持续时间,不是性能,也不是形状移动的距离。
  4. 预设的 pulse 令牌会无限重复。需要只播放一次时,请添加原生迭代次数或定义自定义令牌;调整类名顺序不会改变生成规则顺序。

使用持续时间或缓动族调整其中一个部分,或用它们的变量组成自定义动画令牌。(animation-duration:450ms) 这类显式原生声明可以提供字面值覆盖。两条长条以相同时间尺度呈现一次迭代,并非比较渲染性能。

动画令牌会保留其值所引用的关键帧。单独的持续时间或缓动类不会指定动画名称。过渡也需要属性值发生变化;transition-fast 提供的是持续时间,不是 hover 状态或属性列表。

延迟改变的是效果开始时间,不会延长持续时间。缓动改变持续时间内的进度。控制点超出垂直 0–1 范围的曲线可能产生超出端点或回退的效果;不过动画属性本身仍可能限制实际渲染的值。

请为非必要的动态效果加上 @motion-safe 条件。要让预设动画只播放一次,请在相同条件下添加 (animation-iteration-count:1)。为组件组合入场动画的方法,见主题指南;捕获页面状态之间的过渡,则由视图过渡指南说明。

用法

允许动态效果时,为链接 hover 后的背景变化添加缓动。链接会返回值对照表。

<a href="#values" class="… (transition-property:background-color) transition-fast@motion-safe transition-smooth@motion-safe bg-surface-inset:hover">View motion values</a>
生成的 CSS
@layer theme {  :root,  :host {    --color-zinc-5: oklch(96.5% .0011 265);    --color-zinc-100: oklch(15% .0016 265)  }  :root,  :host {    --color-surface-inset: light-dark(var(--color-zinc-5), var(--color-zinc-100))  }  :root,  :host {    --duration-fast: .15s;    --easing-smooth: cubic-bezier(.4, 0, .2, 1)  }}@layer utilities {  .\(transition-property\:background-color\) {    transition-property: background-color  }  .bg-surface-inset\:hover:hover {    background-color: var(--color-surface-inset)  }  @media (prefers-reduced-motion: no-preference) {    .transition-fast\@motion-safe {      transition-duration: var(--duration-fast)    }  }  @media (prefers-reduced-motion: no-preference) {    .transition-smooth\@motion-safe {      transition-timing-function: var(--easing-smooth)    }  }}

自定义

用持续时间和缓动令牌组成动画,并在原生 CSS 中声明关键帧:--animate-reveal 会创建 animate-reveal。

@theme {  --animate-reveal:    reveal var(--duration-slow) var(--easing-crisp) both;}@keyframes reveal {  from { opacity: 0; translate: 0 .5rem; }}
生成的 CSS
@keyframes reveal {  from {    opacity: 0;    translate: 0 .5rem;  }}@layer theme {  :root,  :host {    --duration-slow: .3s;    --easing-crisp: cubic-bezier(.16, 1, .3, 1)  }  :root,  :host {    --animate-reveal: reveal var(--duration-slow) var(--easing-crisp) both  }}@layer utilities {  @media (prefers-reduced-motion: no-preference) {    .animate-reveal\@motion-safe {      animation: var(--animate-reveal)    }  }}