uni-app无原生启动动画api,需关闭manifest.json中splashscreen.autoclose、在app.vue的onshow或首屏mounted中延时调用uni.hidesplashscreen,并用v-if+transition实现首屏入场动效。

uni-app 没有真正的「启动动画」API,所谓自定义启动动画,本质是绕过原生启动页自动关闭机制,在 App.vue 首屏手动接管渲染 + 过渡动效。直接在 pages.json 里配 animation 字段或指望 uni.navigateTo 参数生效,必然失败。
关闭原生启动页自动隐藏
否则你的 Vue 动画组件还没 mount 完,启动图就被系统清掉了,只剩白屏或闪一下。
- 在
manifest.json的对应平台配置下(如h5或mp-weixin),设"splashscreen": {"autoclose": false} - Android 端还需加
"androidTranslucent": true,否则底部导航栏透明适配会导致画面跳动 - iOS 端若用 Storyboard 启动图,
autoclose: false同样必须开启,否则uni.hideSplashScreen()调用无效
在 App.vue 中手动控制 splash 显示/隐藏时机
onLaunch 里不能立刻调 uni.hideSplashScreen(),得等首屏组件挂载完成、过渡动画 ready 后再触发,否则动画没开始就黑了。
- 用
onShow或nextTick+setTimeout(0)确保 DOM 已渲染 - 推荐写法:
onLaunch() { // 不要在这里 hide }, onShow() { this.$nextTick(() => { setTimeout(() => { uni.hideSplashScreen() }, 100) }) } - 如果首屏是
index.vue,可在它mounted里调uni.hideSplashScreen(),但需确保该页面是首个被加载的路由
用 v-if + transition 实现首屏入场动效
别用 v-show 或 CSS opacity 控制,v-if 才能配合 <transition></transition> 触发 enter 阶段;且必须保证该组件是 App.vue 的直接子元素,否则 transition 不会捕获到节点插入。
- 结构示例:
<template><view><transition name="fade-in"><index-page v-if="showIndex"></index-page></transition></view></template>
- CSS 动画需包含
enter-active-class和enter-to-class对应样式,例如:.fade-in-enter-active { transition: opacity .3s; }、.fade-in-enter-to { opacity: 1; } - 避免在
transition外层套scroll-view或swiper,它们会干扰节点插入检测
真机打包才生效,调试器里基本看不到效果
HBuilderX 的运行调试模式会禁用大部分原生动画逻辑,包括 splash 层的生命周期钩子和 WebView 动画帧调度。你在模拟器里看到“没动画”“闪一下”,不代表线上有问题——必须真机安装 APK 或 iOS 包验证。
另外,pages.json 中的 animationType 只影响页面跳转,跟启动动画完全无关;而所谓「.9.png 启动图」只是拉伸适配,不是动画。所有动效都得靠你手写的 Vue 组件 + CSS transition 或 uni.createAnimation 来驱动。











