uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效
uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效
操作步骤:
- 安卓自定义基座使用媒体查询@media (prefers-color-scheme: dark)设置样式
预期结果:
- 当处于darckmode时媒体查询中的样式生效
实际结果:
- 媒体查询@media (prefers-color-scheme: dark)中的样式不生效
bug描述:
手机在开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark),在安卓不生效,IOS正常生效,安卓端使用theme.json配置的tabbar的darkmode颜色正常生效。经过排查后发现,使用自定义调试基座运行则媒体查询不生效,使用标准基座运行后,发现媒体查询可以正常生效。自定义基座是5月23号新打的。
信息类别 | 信息内容 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Windows |
PC版本号 | Windows 11 家庭中文版23H2 |
HBuilderX类型 | 正式 |
HBuilderX版本号 | 4.15 |
手机系统 | Android |
手机版本号 | Android 11 |
手机厂商 | |
手机机型 | pixel 2XL |
页面类型 | vue |
vue版本 | vue2 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
更多关于uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
你再云打包一次,并提供一下appid
更多关于uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html
回复 DCloud_Android_THB: 设置了的,page.json中配置的darkmode的 tabbar以及navbar的颜色是正常的
回复 1***@163.com: 你弄个复现的demo传给我一下。
回复 1***@163.com: 后来如何解决,我也有这个问题
我也是,自定义打包不生效
问题后来是如何解决的?
没有解决,没用媒体查询了,我通过js判断当前是否处于darkmode,然后用js控制css变量,配合less实现的。
在 Uni-app 中开启 Dark Mode 后,使用 @media (prefers-color-scheme: dark)
媒体查询在安卓设备上不生效,可能是由于以下几个原因:
1. 安卓系统版本问题
prefers-color-scheme
媒体查询在安卓 10(API 级别 29)及以上版本中才被完全支持。如果你的设备运行的是较旧的安卓版本,可能无法正确识别 prefers-color-scheme
。
2. Uni-app 运行环境问题
Uni-app 在不同平台(如 H5、小程序、App)上的实现方式不同。在 App 端(包括安卓),prefers-color-scheme
可能没有被正确支持或实现。
3. CSS 优先级问题
确保你的 @media (prefers-color-scheme: dark)
查询的 CSS 规则没有被其他更高优先级的规则覆盖。
4. 系统设置问题
确保设备的系统设置中已经启用了 Dark Mode。在安卓设备上,通常可以在“设置” > “显示” > “主题”或“夜间模式”中启用 Dark Mode。
解决方案
方案 1:使用 Uni-app 提供的 API 检测主题
Uni-app 提供了 uni.getSystemInfoSync()
方法,可以用来获取系统信息,包括当前的主题模式。你可以根据系统主题动态设置样式。
const systemInfo = uni.getSystemInfoSync();
const isDarkMode = systemInfo.theme === 'dark';
if (isDarkMode) {
// 应用暗黑模式样式
} else {
// 应用亮色模式样式
}
方案 2:使用 CSS 变量动态切换主题
你可以通过 JavaScript 动态设置 CSS 变量,以根据当前主题切换样式。
<template>
<view :class="themeClass">
<!-- 页面内容 -->
</view>
</template>
<script>
export default {
data() {
return {
isDarkMode: false,
};
},
computed: {
themeClass() {
return this.isDarkMode ? 'dark-theme' : 'light-theme';
},
},
mounted() {
const systemInfo = uni.getSystemInfoSync();
this.isDarkMode = systemInfo.theme === 'dark';
},
};
</script>
<style>
:root {
--background-color: #ffffff;
--text-color: #000000;
}
.dark-theme {
--background-color: #121212;
--text-color: #ffffff;
}
.light-theme {
--background-color: #ffffff;
--text-color: #000000;
}
body {
background-color: var(--background-color);
color: var(--text-color);
}
</style>