HarmonyOS鸿蒙Next中切换深色模式后,发现文字看不见

HarmonyOS鸿蒙Next中切换深色模式后,发现文字看不见 【问题描述】:开发者用agc中的用户协议模板配置好用户协议,然后使用webview打开,开启深色模式后,发现文字看不见,必须开启forceDarkAccess(access: boolean)这个属性才会看见,除了开启这个,有没有可能对模板做一些修改?希望能够优化一下。

【问题现象】: cke_4752.png

【版本信息】:开发工具版本:6.0.0、Api版本:20

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS鸿蒙Next中切换深色模式后,发现文字看不见的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

目前进展如何了?

更多关于HarmonyOS鸿蒙Next中切换深色模式后,发现文字看不见的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


cke_576.png

我采用的是官方下载的模板,下载后我没做任何修改直接使用官方模板做深色模式适配,发现并没有适配成功,希望可以对模板做一些优化

webView 中的内容未做深色模式适配

在网页开发过程中,可以使用color-scheme和prefers-color-scheme属性进行深色模式适配。

color-scheme是一个CSS属性,用于表示网页支持的配色方案,可以影响表单、滚动条和CSS系统颜色。CSS系统颜色指Web组件内置的颜色,是部分元素未定义样式时应用的默认颜色。

当声明支持深色配色方案时,Web组件可以将网页内的表单、滚动条以及使用CSS系统颜色的元素切换为深色样式。如果元素自定义了颜色样式,则不受color-scheme的影响,保持自定义的颜色样式。

color-scheme未设置时,默认为normal,表示未指定配色方案,使用Web组件的默认配色方案,表现与light一致。使用样例如下:

/* 使用方式1:使用meta标签全局设置 */
<meta name="color-scheme" content="light"> /* 只支持浅色模式 */

/* 使用方式2:使用style全局设置 */
:root {
  color-scheme: light dark; /* 支持浅色和深色模式,跟随系统切换 */
}

/* 使用方式3:使用style针对特定元素设置 */
div {
  color-scheme: light; /* 只支持浅色模式 */
}

例如,color-scheme.html页面在Web深色模式关闭和开启时的渲染效果如下图所示。关闭深色模式,网页采用浅色配色方案,input2应用自定义背景样式。开启深色模式,网页采用深色配色方案,input2保持自定义样式,而网页背景、字体、表单、进度条及按钮的颜色均自动切换为深色配色。

<!-- color-scheme.html -->
<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <meta name="color-scheme" content="light dark">
</head>
<body>
  <h1>Example page</h1>
  <input name="input1" type="text" placeholder="please enter text">
  <br><br>
  <input name="input2" type="text" placeholder="please enter text" style="background-color: Lightgray;">
  <br><br>
  <progress value="50" max="100"></progress>
  <br><br>
  <input type="checkbox">
  <input type="checkbox" checked>
  <br><br>
  <button>submit</button>
</body>
</html>

previewableImage

参考地址

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-set-dark-mode

麻烦看一下四楼回复,

只是H5页面的话,如果想让H5适配深色模式,请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-set-dark-mode

其实这个协议没必要托管在AGC上啊,就是一个普普通通的H5页面。

如果想让H5适配深色模式,请参考:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/web-set-dark-mode

网页深色模式适配

color-scheme是一个CSS属性,用于表示网页支持的配色方案,可以影响表单、滚动条和CSS系统颜色。CSS系统颜色指Web组件内置的颜色,是部分元素未定义样式时应用的默认颜色。

当声明支持深色配色方案时,Web组件可以将网页内的表单、滚动条以及使用CSS系统颜色的元素切换为深色样式。如果元素自定义了颜色样式,则不受color-scheme的影响,保持自定义的颜色样式。

color-scheme未设置时,默认为normal,表示未指定配色方案,使用Web组件的默认配色方案,表现与light一致。使用样例如下:

/* 使用方式1:使用meta标签全局设置 */
<meta name="color-scheme" content="light"> /* 只支持浅色模式 */
/* 使用方式2:使用style全局设置 */
:root {
  color-scheme: light dark; /* 支持浅色和深色模式,跟随系统切换 */
}
/* 使用方式3:使用style针对特定元素设置 */
div {
  color-scheme: light; /* 只支持浅色模式 */
}

prefers-color-scheme是CSS中的一个媒体查询功能,可以检测系统的主题颜色。网页开发者可以通过该特性,为不同的系统主题颜色定义不同的网页CSS样式,以适应用户的主题偏好。使用样例如下:

<style>
  /* 默认样式 */
  body { background-color: White; }
  /* 浅色样式,Web关闭深色模式时覆盖默认样式 */
  [@media](/user/media) (prefers-color-scheme: light) {
    body { background-color: Gray; }
  }
  /* 深色样式,Web开启深色模式时覆盖默认样式 */
  [@media](/user/media) (prefers-color-scheme: dark) {
    body { background-color: Black; }
  }
</style>

Web深色模式设置

通过darkMode()接口可以配置Web深色模式,默认状态为关闭。应用可设置WebDarkMode.Auto,表示Web深色模式跟随系统设置。也可以手动设置WebDarkMode.OnWebDarkMode.Off来控制深色模式的开启与关闭。

设置WebDarkMode.On,或设置WebDarkMode.Auto并启用系统深色模式时,Web将进入深色模式。在深色模式下,Web会应用媒体查询@media(prefers-color-scheme: dark)中定义的深色样式。如果网页未定义深色样式,则保持原有样式。

若要使未适配深色模式的网页强制转换为深色样式,可以使用forceDarkAccess()接口开启强制深色模式。强制深色模式可以覆盖网页默认样式,转换网页背景和文字的颜色,以适应在深色模式下显示。强制深色模式无法保证所有颜色转换符合预期。

在强制深色模式下,高亮度色值将被转换为适合低光环境的色值,低亮度色值则保持不变。具体色值转换算法沿用Chromium内核标准,随Chromium内核的更新迭代。色值转换只针对不支持深色配色方案的元素。如果网页全局声明支持深色配色方案,则整个网页的色值均不会被Web转换。

在HarmonyOS Next中,切换深色模式后文字不可见,通常是由于应用未适配深色主题或主题资源缺失导致。请检查应用的resources目录下是否配置了深色模式对应的颜色资源(如color.json中定义dark属性),并确保文本颜色未固定为浅色。系统主题切换时,应用需依赖ResourceManager动态获取当前主题对应的颜色值。

这是一个在HarmonyOS Next中使用WebView加载AGC用户协议模板时遇到的典型深色模式适配问题。问题的核心在于WebView内部加载的网页内容(HTML/CSS)没有针对深色模式进行适配。

根本原因分析: AGC提供的用户协议模板通常是标准的HTML页面,其文字颜色(如黑色#000000)和背景颜色(如白色#FFFFFF)在CSS中是写死的。当系统切换到深色模式时,WebView组件默认不会自动反转这些颜色。因此,在深色背景下显示黑色文字,就会导致“文字看不见”。

解决方案:

  1. 首选方案:修改HTML/CSS模板(如您所期望) 这是最根本、体验最好的解决方案。您需要获取并修改AGC用户协议模板的源代码。

    • 核心思路:使用CSS媒体查询@media (prefers-color-scheme: dark)来为深色模式定义专门的样式。
    • 修改示例
      /* 默认(浅色模式)样式 */
      body {
          color: #000000; /* 黑色文字 */
          background-color: #ffffff; /* 白色背景 */
      }
      
      /* 深色模式覆盖样式 */
      @media (prefers-color-scheme: dark) {
          body {
              color: #e6e6e6; /* 浅灰色文字 */
              background-color: #1c1c1c; /* 深灰色背景 */
          }
          /* 可以继续为其他元素(如链接、标题)定义深色模式颜色 */
      }
      
    • 操作路径:您需要联系AGC服务团队或查看其文档,确认用户协议模板是否支持自定义,并按照上述方法注入或修改CSS。如果模板是动态下发的,可能需要在其托管服务端进行修改。
  2. 备用方案:启用WebView的强制深色渲染 您提到的forceDarkAccess(access: boolean)正是为此场景设计的备用方案。

    • 作用机制:当设置为true时,WebView引擎会尝试自动对网页内容进行颜色反转或应用一个简单的深色主题滤镜,这是一种“兜底”的兼容性处理。
    • 局限性:这种自动转换是算法式的,可能无法完美处理所有复杂的网页样式(例如背景图片、特殊图标),有时会导致颜色对比度不佳或元素显示异常。它不能替代精心设计的CSS深色模式样式。
    • 适用场景:在无法修改网页内容(如加载第三方不可控页面)时的快速解决方案。

结论与建议: 如果您的应用对用户体验要求较高,且有能力修改AGC用户协议模板的源代码,强烈建议采用方案一(修改CSS)。这是标准的、符合Web前端开发实践的做法,能确保深色模式下的显示效果可控且美观。

如果模板无法修改或修改流程非常复杂,作为临时或备选方案,启用forceDarkAccess(true)是目前在HarmonyOS Next中可行的技术手段。您需要在代码中权衡:优先尝试通过样式修改实现最佳效果,在不可行时使用系统提供的强制转换功能作为保障。

回到顶部