预检清单
- 我已阅读了此项目的 Contributing Guidelines。
- 我同意遵循此项目遵循的 Code of Conduct。
- 我在 issue tracker 中搜索了一个与我想提交的功能请求相匹配的功能请求,但没有成功。
问题描述
浏览器目前支持通过设置 color-scheme
元标签或在 :root
元素上定义 color-scheme
css属性来触发暗黑模式渲染。当将其设置为 dark
时,浏览器将自动在 webcontents 后面渲染暗黑色背景,并更改文本颜色。
要查看此操作的效果,请参阅此演示页面:https://color-scheme-demo.glitch.me/(警告:这将每三秒从亮变暗)以及相应的解释性文章:https://web.dev/color-scheme/
Electron 中的常规浏览器窗口将在背景颜色和文本颜色方面切换,但其他 webcontents(如 webviews
中的那些)则不会。当颜色方案设置为暗黑时,这会导致白色文本在白色(透明)背景上渲染。
您可以使用 JS 读取 color-scheme
元标签并检查 color-scheme
是否已定义 CSS 属性,然后手动在 webview 后面设置背景颜色。这将起作用一次,但颜色方案值可以在任何时候更新而无需额外信号,这可能会使 webviews 难以阅读。
注意 这是与 prefers-color-scheme
不同的一个特性。那表示用户的偏好,而 color-scheme
表示网站是否支持暗黑、亮色或两者都支持。
建议的解决方案
在 color-scheme 更改时调用 webContents 上的事件,类似于我们已经拥有的 did-change-theme-color
事件。
考虑过的其他替代方案
- 注入 JavaScript 侦听器以观察 CSSStyleSheet 和 DOM 树。
- Chrome 本身会强制在 iframes 上设置暗黑色背景(参见下面的示例3)。我们也可以为 webviews 做到这一点。
其他信息
- 将上述演示页面设置为 BrowserWindow 的 webContents:https://gist.github.com/5244ed27b3fdb152ea4d8087362c2066 注意背景发生了变化。
- 将上述演示页面设置为 Webview 的 webContents:https://gist.github.com/5bb84a61cd87c3809d28fbf61b8714b9 注意虽然文本颜色发生了变化,但背景颜色没有改变。
- 在 Codepen 中设置上述演示页面为 iframe:https://codepen.io/Kilian/pen/xxpNvEb 注意在 Chromium 中,iframe 的背景会更新。
2条答案
按热度按时间chhkpiq41#
这可能是解决#40207的方法。
anauzrmj2#
看起来当颜色方案改变时,唯一始终被调用的函数是:https://github.com/chromium/chromium/blob/c603521f5e5260a573e9c20f01c4bd470e0833d7/third_party/blink/renderer/core/css/style_engine.cc#L3862C70-L3862C70 (或者它调用的函数)