uniapp 深色模式如何实现
在uniapp中如何实现深色模式?我尝试通过CSS媒体查询和动态修改主题色来实现,但效果不理想。请问有没有更优雅的解决方案?比如是否支持直接调用系统深色模式设置,或者推荐好用的插件?希望有具体代码示例说明。
2 回复
在uniapp中实现深色模式,可通过以下步骤:
- 使用uni.getSystemInfoSync()获取系统主题
- 通过CSS变量或条件class切换主题样式
- 监听系统主题变化:uni.onThemeChange()
- 手动切换时,使用uni.setStorageSync()保存用户选择
示例:
:root {
--bg-color: #ffffff;
--text-color: #000000;
}
.dark {
--bg-color: #000000;
--text-color: #ffffff;
}
在 UniApp 中实现深色模式,可以通过以下步骤完成:
1. 检测系统主题
使用 uni.getSystemInfoSync() 获取系统主题,判断是否为深色模式。
const systemInfo = uni.getSystemInfoSync();
const isDarkMode = systemInfo.theme === 'dark'; // 部分平台支持(如微信小程序)
2. 手动切换主题
通过全局变量或 Vuex 管理当前主题状态,并提供切换功能。
// 在 Vuex 或全局数据中定义
data() {
return {
isDarkMode: false
};
},
methods: {
toggleTheme() {
this.isDarkMode = !this.isDarkMode;
this.applyTheme();
},
applyTheme() {
if (this.isDarkMode) {
// 应用深色样式
document.documentElement.setAttribute('data-theme', 'dark');
} else {
// 恢复浅色样式
document.documentElement.setAttribute('data-theme', 'light');
}
}
}
3. CSS 变量定义主题样式
使用 CSS 变量动态切换颜色,在 App.vue 或全局样式中定义:
:root {
--bg-color: #ffffff;
--text-color: #333333;
}
[data-theme="dark"] {
--bg-color: #1a1a1a;
--text-color: #ffffff;
}
.page {
background-color: var(--bg-color);
color: var(--text-color);
}
4. 监听系统主题变化
在支持的系统(如 App 端)中监听主题变化:
uni.onThemeChange((res) => {
this.isDarkMode = res.theme === 'dark';
this.applyTheme();
});
5. 持久化存储
使用 uni.setStorageSync() 保存用户选择的主题,应用启动时恢复:
// 启动时读取
const savedTheme = uni.getStorageSync('theme');
if (savedTheme) {
this.isDarkMode = savedTheme === 'dark';
this.applyTheme();
}
// 切换时保存
toggleTheme() {
this.isDarkMode = !this.isDarkMode;
uni.setStorageSync('theme', this.isDarkMode ? 'dark' : 'light');
this.applyTheme();
}
注意事项:
- 平台兼容性:部分功能(如
uni.onThemeChange)可能仅限 App 端,需检查文档。 - 样式覆盖:确保所有页面元素使用 CSS 变量,避免固定颜色值。
- 测试多端:在 iOS、Android 及小程序中验证效果。
通过以上方法,可以灵活实现深色模式,并适配用户系统偏好或手动选择。

