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
手机厂商 google
手机机型 pixel 2XL
页面类型 vue
vue版本 vue2
打包方式 云端
项目创建方式 HBuilderX

更多关于uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html

11 回复

你再云打包一次,并提供一下appid

更多关于uni-app 开启darkmode后,使用媒体查询@media (prefers-color-scheme: dark)在安卓不生效的实战教程也可以访问 https://www.itying.com/category-93-b0.html


AppID在帖子的机密信息中有

回复 1***@163.com: 你是否设置了darkmode:true?

回复 1***@163.com: 具体的示例 https://ext.dcloud.net.cn/plugin?name=hello-darkmode 可以参考配置一下

回复 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>
回到顶部