uni-app如何实现应用暗黑模式 uni-app跟随系统主题切换

秋枫小哥_7533

秋枫小哥_7533

2026-06-10

539人浏览

原创

uni-app无法靠window.matchmedia自动响应深色模式切换,因小程序webview不支持该api,返回空对象或报错;ios和h5虽可用但android端不可靠,真正可用的是uni.matchmedia,仅限h5及部分新版小程序基础库。

uni-app如何实现应用暗黑模式 uni-app跟随系统主题切换

uni-app 无法靠 window.matchMedia 或系统 API 自动、实时响应深色模式切换,必须手动检测 + 主动同步 + 强制重绘,否则页面会卡在旧主题里不动。

为什么 window.matchMedia('(prefers-color-scheme: dark)') 在小程序里不工作

微信/支付宝等小程序 WebView 不支持标准媒体查询 API,window.matchMedia 要么返回空对象,要么直接报 undefined is not a function。iOS 和 H5 端虽能用,但 Android App 端(尤其低版本)也常 fallback 到不可靠状态。别把它当跨平台主力方案。

  • 真正在小程序里可用的只有 uni.matchMedia('(prefers-color-scheme: dark)'),但它仅在 H5 和部分新版小程序基础库中有效,微信基础库
  • Android 真机上 uni.getSystemInfoSync().theme 是启动快照,系统切暗后它不会更新,哪怕用户开了“日落到日出”自动切换
  • 如果你只监听 onLaunch 读一次 theme,那 App 在后台被唤醒后仍显示旧主题——必须在 onShow 中重新读取

如何让 pages.json 里的 @navBgColor 真正生效

@xxx 变量只在编译期或页面首次加载时注入,运行时改 uni.setStorageSync('theme', 'dark') 完全不影响已渲染的导航栏和 tabBar。这不是 bug,是设计限制。

uni-app
uni-app

uni-app 是基于 Vue 的跨端开发框架,适合开发 H5、App、小程序、鸿蒙和多端业务应用。

下载
  • 必须配合 uni.reLaunch() 或 uni.redirectTo() 强制刷新当前页,才能让 pages.json 重新读取 theme.json 中对应值
  • theme.json 必须放在项目根目录,且 manifest.json 中各平台节点(如 mp-weixin、app-plus)都要显式写 "darkmode": true 和 "themeLocation": "theme.json",漏一个平台就失效
  • tabBar.borderStyle 在微信小程序里只认 "black" / "white" 字符串,theme.json 里写 "#000000" 会被截断成 "black",别指望它能传 hex 值

怎么避免页面闪屏(白/黑屏跳变)

App.vue 渲染早于 onLaunch 执行,如果主题 class 晚绑定,首屏就会先按默认色渲染再闪一下。关键不是“加 class”,而是“什么时候加”。

  • 主题存储必须用 uni.setStorageSync('theme_mode', 'dark'),不能只存 Vuex 或内存变量;key 名统一用 'theme_mode',大小写敏感
  • App.vue 的 onLaunch 和 onShow 都要调用 uni.getStorageSync('theme_mode'),并立即设置 data.themeClass,确保根 <view></view> 第一帧就带对的 class
  • 所有 CSS 必须写成 .theme-dark .header、.theme-light .button 这种嵌套形式,禁用 :root CSS 变量做主干切换——小程序不支持 runtime 更新 :root 变量
  • H5 端可额外加 document.documentElement.setAttribute('data-theme', theme) 做兼容,但只是锦上添花,不能替代 class 方案

手动切换主题时,为什么导航栏颜色没变

因为 pages.json 的全局样式是静态注入的,你改了本地存储,但页面 DOM 已经渲染完成,导航栏组件不会自动 re-init。

  • 最轻量解法:在切换按钮里执行 uni.setStorageSync('theme_mode', 'dark') 后,立刻 uni.$emit('themeChange', 'dark'),让当前页 watch 这个事件并调用 this.$forceUpdate()(仅对非 pages.json 控制的区域有效)
  • 彻底解法:用 uni.reLaunch({ url: getCurrentPages()[0].route }) 重载当前页,强制 pages.json 重新解析 theme.json
  • 注意:不要用 uni.navigateTo 再开一页,会导致路由栈混乱;uni.redirectTo 会丢掉参数,reLaunch 是唯一兼顾参数保留和强制刷新的选择

真正麻烦的不是“怎么切”,而是“切完谁来通知导航栏、tabBar、页面组件、图标颜色、API 请求头(比如某些接口要传 theme=dark)一起动”。每个环节都得手动对齐,没有银弹。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

uni-app

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2483

5

前端如何实现即时通讯
前端如何实现即时通讯

实现即时通讯的方法有WebSocket、Long Polling、Server-Sent Events、WebRTC等等。详细介绍:1、WebSocket,它可以在客户端和服务器之间建立持久连接,实现实时的双向通信,前端可以使用 WebSocket API来创建WebSocket连接,并通过发送和接收消息来实现即时通讯;2、Long Polling,是一种模拟实时通信的技术等等。

2023.10.09

5383

6

前端和后端的区别
前端和后端的区别

前端关注的是用户界面的设计和交互,而后端则注重数据处理和逻辑控制。想了解更多前端后端的相关内容,可以阅读本专题下面的文章。

2024.03.19

6410

13

php和前端的关联介绍
php和前端的关联介绍

php既可以作为前端语言,也可以作为后端语言。想了解更多php和前端的相关内容,可以阅读本专题下面的文章。

2024.03.22

6018

10

前端外包工作内容有哪些
前端外包工作内容有哪些

前端外包工作内容包括:1. 网站和应用程序开发;2. 用户界面和交互设计;3. 用户体验优化;4. 设计和视觉开发;5. 跨浏览器兼容性;6. 性能优化;7. 维护和更新;8. 项目管理和沟通。想了解更多前端的相关内容,可以阅读本专题下面的文章。

2024.05.22

863

5

css3教程
css3教程

php中文网为大家提供css3教程合集,CSS3的语法是建立在CSS原先版本基础上的,它允许使用者在标签中指定特定的HTML元素而不必使用多余的class、ID或JavaScript。php中文网还为大家带来css3的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.14

1900

10

有哪些css3渐变属性
有哪些css3渐变属性

css3中渐变属性有linear-gradient、radial-gradient、conic-gradient、repeating-linear-gradient、repeating-radial-gradient等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.01

2806

5

Revel框架模板渲染与表单验证
Revel框架模板渲染与表单验证

本专题围绕Revel框架视图层开发,介绍模板语法、变量输出、布局复用、表单提交、参数绑定与验证规则,帮助开发者完成安全规范的页面交互。

2026.10.16

0

15

Revel框架MVC路由与控制器
Revel框架MVC路由与控制器

本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。

2026.10.16

0

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
uni-app从入门到实战教程
uni-app从入门到实战教程

共0课时 | 0人学习

uni-app x harmony开发指南
uni-app x harmony开发指南

共0课时 | 0人学习

uni-app鸿蒙运行和发行
uni-app鸿蒙运行和发行

共0课时 | 0人学习