组件/Transition 动效

Transition 动效

用于内容切换、列表与推入翻页的过渡封装

已验证自 0.3.4

用法

内容切换

单个带 key 的子节点,key 变化即切换;preset 选择过渡,smooth-size 同时平滑容器尺寸。

示例加载中...

列表增删

group 改用 TransitionGroup,每项都需要稳定 key。

示例加载中...

推入翻页

层级导航用 TxTransitionPush:进入子页传 direction="forward",返回传 "back",子元素的 key 变化即翻页。

示例加载中...

最佳实践

  • 带 key 的面板切换用 mode="out-in",旧内容先离场、新内容再进入。
  • 平级的标签切换不是推入,继续用淡入淡出;TxTransitionPush 只用于层级导航。
  • 内容高度变化时用 smooth-size;列表和重复行用 fade、slide-fade 或 rebound。
  • 列表 key 用稳定的业务 id,可排序列表不要用临时下标。
  • 高频动效保持短时长;rebound 只用于允许轻微回弹的小面积反馈。

API 参考

TxTransition

属性

属性名类型默认值说明
preset'fade' | 'slide-fade' | 'rebound' | 'smooth-size''fade'过渡预设;smooth-size 仅在 group=false 时委托 TxTransitionSmoothSize。
groupbooleanfalse用 TransitionGroup 渲染带 key 的列表。
tagstring'div'group=true 时的根标签。
appearbooleantrue首次渲染时执行进入动效。
mode'in-out' | 'out-in''out-in'单子节点的 Transition 模式;group 下不生效。
durationnumber180时长(ms),写入 --tx-transition-duration。
easingstring'cubic-bezier(0.2, 0, 0, 1)'缓动函数,写入 --tx-transition-easing;rebound 进入时用自带的弹性曲线。

插槽

插槽名Props说明
default-单个带 key 的子节点;group=true 时为多个带稳定 key 的子节点。

TxTransitionSmoothSize

属性

属性名类型默认值说明
appearbooleantrue首次渲染时执行进入动效。
mode'in-out' | 'out-in''out-in'内部带 key 子节点的 Transition 模式。
durationnumber220尺寸过渡与内容动效共用的时长。
easingstring'cubic-bezier(0.2, 0, 0, 1)'尺寸与内容动效共用的缓动函数。
widthbooleanfalse动画宽度变化。
heightbooleantrue动画高度变化。
motion'fade' | 'slide-fade' | 'rebound''fade'尺寸变化期间内部内容的动效。

TxTransitionPush

属性

属性名类型默认值说明
direction'forward' | 'back''forward'forward 新页从行内结束方向推入,back 相反;RTL 下自动镜像。
durationnumber220推入与高度过渡的时长(ms);0 直接替换。
easingstring'cubic-bezier(0.23, 1, 0.32, 1)'推入、淡化与高度过渡共用;由 Web Animations 读取,不能写 CSS 变量。
heightbooleantrue切换时容器高度从旧页过渡到新页,结束后回到 auto。
appearbooleanfalse首次挂载时第一页也按 direction 推入。

事件

事件名参数说明
before-enter(el: Element)新页插入之前触发。
after-enter(el: Element)新页推入完成后触发;被下一次切换打断的进入不触发。
after-leave(el: Element)旧页移出 DOM 后触发,包括中途被同 key 的新页替换。

插槽

插槽名Props说明
default-恰好一个带 key 的子元素,key 变化即翻页。

语义化组件

组件预设
TxTransitionFadefade
TxTransitionSlideFadeslide-fade
TxTransitionReboundrebound
TxTransitionSmoothSize尺寸感知封装,可配置内部 motion
TxTransitionPush层级翻页的独立实现,不走 preset

概述

  • class 与 style 合并到外层 .tx-transition;其余 attrs(含 Vue 过渡监听器)转发给 Transition / TransitionGroup,smooth-size 下转发给 TxAutoSizer。
  • smooth-size 是单子节点模式:用 TxAutoSizer 包住内容,默认只动画高度,测量期间隐藏溢出;group=true 时按 fade 处理。
  • TxTransitionPush 的新旧两页同时运动:旧页原位固定为 position: absolute 并加上 inert,新页留在文档流里决定高度;旧页里的焦点随之丢失,换页时由使用方交给新页。
  • 推入期间容器是 overflow: clip(不是 hidden),静止时不裁剪,页内焦点环不会被切掉。
  • 切换被打断时从当前绘制的位置继续;推入中途回到同一个 key 时,回来的页从旧页停下的位置滑回。
  • 减少动态效果时各预设收敛到近乎瞬时,并去掉位移与缩放;TxTransitionPush 改为 120ms 的原位淡入淡出,高度直接落定。

技术实现

  • TxTransitionPush 用 <Transition :css="false"> 的 JS 钩子驱动 Web Animations:页面动 translate,不占用自身的 transform;容器动 height;被打断的页按 getComputedTiming().progress 续跑。
  • 源码:packages/tuffex/packages/components/src/transition/。
查看源码
packages/tuffex/packages/components/src/transition/index.ts