本文方法已经过时,官方最新方法:
https://uniapp.dcloud.net.cn/tutorial/darkmode.html
https://ask.dcloud.net.cn/article/36995
简介:
uniapp 暗黑模式适配主要包括三部分,一部分是应用中的页面,另一部分是特定功能弹出系统原生界面(如alert提示框)和安全区域外背景颜色,下面会详细说明分别如何适配。
方法一:官方方法,只能适配 ios
这个方法是官方给的,但暂时只能适配 ios,地址:https://ask.dcloud.net.cn/article/36995
官方给的方法主要是靠 plus.navigator.getUIStyle获取当前系统外观模式,uniapp相关的系统组件库会自动使用暗黑模式。
页面上需要使用类似如下的CSS,实现:
@media (prefers-color-scheme: dark){
.content {
background-color: #1B1C1E;
color: white;
}
}
方法二:
在每个页面的 onshow() 以后,使用 uni.setNavigationBarColor() 和 uni.setTabBarStyle() 设置顶部和底部导航条的配色。
// 暗黑模式处理函数
export function darkModeInit(){
const store = mainStore();
var isDarkMode = store.isDarkMode;
// 日间模式颜色
var navigationBarOption = { frontColor: '#000000', backgroundColor: '#ffffff' };
var tabBarStyleOption = { color: '#71768c', selectedColor: '#1b65ba', backgroundColor: '#FFFFFF' };
// 夜间模式颜色
if(isDarkMode == true){
navigationBarOption = { frontColor:'#ffffff', backgroundColor: '#000000' };
tabBarStyleOption = { color: '#7e858f', selectedColor: '#b5c0d5', backgroundColor: '#333333' };
}
uni.setNavigationBarColor({
frontColor: navigationBarOption.frontColor,
backgroundColor: navigationBarOption.backgroundColor,
animation: {
duration: 0,
timingFunc: 'easeIn'
},
success(e){
// console.log("设置顶部导航背景色成功",e);
},
fail(e) {
// console.log('设置顶部导航失败: ', e.errMsg);
}
});
uni.setTabBarStyle({
color: tabBarStyleOption.color,
selectedColor: tabBarStyleOption.selectedColor,
backgroundColor: tabBarStyleOption.backgroundColor,
borderStyle: 'black',
success(e){
// console.log("设置底部标签页背景色成功",e);
},
fail(e) {
// console.log('设置底部标签页失败: ', e.errMsg);
}
});
}
然后就是修改页面背景色,在 Web 页面,一般定义 CSS 变量 :root { --bg-color: #fff;} 和 :root.dark { --bg-color: #000;} ,然后切换 .dark 类实现夜间模式切换。参考:https://javascript.net.cn/articles/820
遇到的问题
:root 这个 CSS 伪类匹配文档树的根元素。对于 HTML 来说,:root 表示 <html> 元素,除了优先级更高之外,与 html 选择器相同。但是,小程序中无法直接操作 body 的 class 列表。
这种方法暂时遇到一个问题,在 uniapp 中,page 相当于 body 节点,例如:
/* 设置页面背景颜色,使用 scoped 会导致失效 */
page {
background-color: #ccc;
}
如果使用媒体查询,只能适配 IOS:
@media (prefers-color-scheme: dark) {
body { background: #333; color: #eee; }
}
考虑过通过 JS 修改 page { background: var(--bg-color); } 中的颜色变量:
document.documentElement.style.setProperty('--bg-color', color);
暂未找到 uniapp 中的修改方法:https://uniapp.dcloud.io/api/ui/nodes-info.html
解决方法
暂时用了一种不优雅的方案,放弃切换 :root 的 .dark 类,而是在每个 vue 页面,最外层的 view 里使用
<view class="container" :class="{'dark-mode':store.isDarkMode}"></view>
备注:
可以使用 uni.setBackgroundColor(OBJECT) 动态设置窗口的背景色。但是只支持微信小程序等部分小程序,不支持 APP 和 H5 等。
参考:
https://uniapp.dcloud.io/api/ui/bgcolor.html
https://uniapp.dcloud.io/tutorial/syntax-css.html#内联样式
https://developer.mozilla.org/zh-CN/docs/Web/CSS/:root
https://www.jianshu.com/p/8e4a7f124e49
https://www.ruletree.club/archives/2610/
https://blog.csdn.net/jijunqing321/article/details/117435173
修改时间 2024-03-05