uni-app启动页动画需绕开默认机制,用App.vue接管首屏渲染:关闭自动隐藏、onLaunch后手动hideSplashScreen、v-if+transition实现过渡;进度条应基于关键异步节点而非setTimeout模拟。
直接用 launch_page 配置静态图,根本加不了动画;真要动效,得绕开默认启动页机制,自己接管首屏渲染。核心是:把「原生启动页」当成纯占位图,等 App.vue 加载完、onLaunch 执行后,再用 Vue 组件实现过渡动画。
常见错误是试图在 pages.json 里配 animation 字段——这字段压根不存在,uni-app 不支持配置启动页 CSS 动画。
manifest.json 的 h5 或 mp-weixin 平台配置中设 "splashscreen": {"autoclose": false}
App.vue 的 onLaunch 里调用 uni.hideSplashScreen(),但别急着调,先让自定义动画组件 mount 完index.vue)用 v-if 控制显隐,配合 transition 做入场动效,避免白屏/黑屏闪一下uni-app 没有内置资源加载进度回调,所谓「进度」只能靠模拟或分阶段标记。微信小程序平台能拿到部分资源加载状态,H5 则基本靠预估时间或监听关键节点(比如网络请求返回、字体加载完成)。
容易踩的坑是硬塞一个 setTimeout 递增进度条——用户网速快时卡在 90%,慢时早跳走了,体验反而更差。
uni.getSystemInfo、uni.checkSession、首页接口 uni.request 成功后,手动更新进度值document.fonts.ready,解决「文字闪动」问题;小程序端可用 uni.preloadWebview 提前加载后续页,把耗时摊开launch_page 只在 pages.json 的 h5 和 mp-weixin 下生效,App 端走的是原生 splash 配置(manifest.json 的 splashscreen),完全不认这个字段。
最常被忽略的是尺寸适配:微信要求启动图必须是 750×1334(iPhone X 类机型),而 H5 端你给个 100×100 的图,它会强行拉伸糊掉,还不报错。
static 目录下,路径写成 /static/splash.png,不能用相对路径或变量launch_page 实际是用 CSS background-image 实现的,所以不支持 webp 格式(部分安卓浏览器不认)nativePlugins 文档分别处理,别指望一套图打天下不是 API 没生效,而是 uni.hideSplashScreen() 只关原生层,Vue 实例还没 ready,DOM 还没挂载,导致首屏组件渲染瞬间出现空白或错位——看起来像「闪」。
本质是生命周期没对齐。尤其在使用 uni-app 的 subNVue 或自定义 tabbar 时,这个问题更明显。
hideSplashScreen 在 App.vue 的 mounted 钩子之后调用,而不是只依赖 onLaunch
#ifdef MP-WEIXIN),检查是否漏了 H5 或 APP 分支,导致某平台没调用mounted 里加个 nextTick + setTimeout(0) 双保险,等 Vue 渲染队列清空后再关启动页