nvue中必须使用uni.requireNativePlugin('animation')而非uni.createAnimation,因其仅支持原生组件、参数需带单位、无内置动画队列、须手动拆帧调度且transformOrigin必须显式设置。

nvue 中必须用 uni.requireNativePlugin('animation') 而非 uni.createAnimation
在 nvue 页面里,uni.createAnimation 依然不可用——它只适配小程序 runtime,而 nvue 是原生渲染层,走的是完全不同的动画通道。真正能驱动硬件加速、支持逐帧控制、具备完整贝塞尔曲线和回调能力的,只有原生插件 animation。
常见错误是直接复制小程序代码,调用 uni.createAnimation(),结果返回 undefined 或静默失败;或者误以为 nvue 支持 Vue 的 <transition>,实际会直接忽略动画逻辑。
- 必须在 nvue 页面中通过
const animation = uni.requireNativePlugin('animation')显式加载 - 仅支持绑定到
<view>、<image>、<text>等原生组件,不能作用于自定义组件或<slot> - 所有动画参数(如
transform、opacity)必须写成字符串,且值需带单位('rotate(45deg)',不能写rotate(45)) -
timingFunction只接受'linear'、'ease'、'ease-in'、'ease-out'、'ease-in-out',不支持 CSS 自定义贝塞尔函数
复杂序列得手动拆帧:用 requestAnimationFrame 驱动多段 animation.transition()
nvue 的 animation 插件本身不提供“动画队列”或“链式 delay”,一次 transition() 调用只执行单段。要实现“弹跳→缩放→变色→位移”的复合节奏,必须靠 JS 手动调度。
典型陷阱是把所有动画塞进一个 transition() 里,比如试图用 transform: 'scale(1.2) rotate(10deg) translateX(20px)' 一次性完成——这会导致各属性时间曲线耦合,无法独立控制起止时机,且中途无法中断或调整。
立即学习“前端免费学习笔记(深入)”;
分析 Vue 3 Composition API 使用情况——审计响应式模式、可组合函数设计、ref 与 reactive 的选择、计算属性、watcher 使用及组件……
- 把整个动画拆成 N 个阶段,每个阶段调用一次
animation.transition() - 用
requestAnimationFrame控制帧节奏,避免 setTimeout 时间漂移 - 每个阶段结束回调里启动下一阶段,确保严格时序(例如第一段 300ms 后触发第二段)
- 务必在每次 transition 前检查节点是否还存在(
this.$refs.target可能已销毁),否则报错中断后续动画
transformOrigin 和坐标系必须显式设置,否则旋转/缩放中心偏移
nvue 中 transform 默认以左上角为原点,不像 Web 默认是 center。如果没设 transformOrigin,rotate() 会绕左上角转,scale() 会向右下拉伸,视觉上严重错位。
尤其在做图标旋转、按钮点击反馈等场景,用户会明显感觉“动得不对”。这不是 bug,是 nvue 渲染层未做默认居中对齐。
- 所有含
rotate、scale、skew的动画,必须同步传入transformOrigin: 'center center' -
transformOrigin的值是字符串,格式为'x y',支持'left top'、'50% 50%'、'center center'(推荐最后一种) - 若元素宽高动态变化(如文字长度不固定),
transformOrigin: 'center center'仍可靠;但'50% 50%'在某些旧版 nvue 上可能计算异常
App 端性能敏感点:避免 layout 触发,慎用 height / width 动画
nvue 虽为原生渲染,但改变 height、width、top、left 等布局属性仍会触发重排(relayout),在低端 Android 设备上极易掉帧。官方文档也明确提示:“App端默认关闭组件动画,因为 height 动画开销大”。
很多开发者想用 height 动画实现折叠展开,结果在红米、vivo 等机型上卡成幻灯片——不是代码写错,是底层机制限制。
- 优先用
transform: translateY()+opacity模拟显示/隐藏,而非v-show切换height - 绝对定位元素慎用
top/left动画,改用transform: translate(x, y) - 大量列表项逐个动画时,避免同时触发上百个
transition(),应节流或分组(如每帧最多处理 5 个) - 动画结束后及时清理引用(如清除
animationTimer、置空this.$refs.xxx),防止内存泄漏影响后续帧率
'deg' 单位,动画就失效;漏一次 origin,旋转就跑偏;没做节点存在性判断,动画链就断在半路。

















