进阶 electronjs.org 2026-10-07 23:51:43 · 6 阅读
第15章 Electron 深色模式开发指南:nativeTheme API 与 UI 适配
# 第15章 深色模式
## 概述
### 自动更新原生界面
"原生界面"包括文件选择器、窗口边框、对话框、右键菜单等——凡是 UI 由操作系统而非应用本身提供的部分都算在内。默认行为是让这些界面自动跟随操作系统的主题。
### 自动更新自有界面
如果你的应用有自己的深色模式,应当与系统的深色模式设置同步开关。可以用 prefers-color-scheme 这个 CSS media query 来实现。
### 手动更新自有界面
如果想手动切换浅色/深色模式,可以通过设置 nativeTheme 模块的 themeSource 属性来指定所需模式。这个属性的值会传递到 Renderer 进程,所有与 prefers-color-scheme 相关的 CSS 规则也会随之更新。
## macOS 设置
在 macOS 10.14 Mojave 中,Apple 为所有 macOS 电脑引入了系统级深色模式。如果你的 Electron 应用支持深色模式,可以使用 nativeTheme API 让它跟随系统设置。
在 macOS 10.15 Catalina 中,Apple 又引入了新的"自动"深色模式选项。要让 nativeTheme.shouldUseDarkColors 和 Tray API 在 Catalina 的这个模式下正常工作,需要使用 Electron >=7.0.0,或者对旧版本在 Info.plist 文件中把 NSRequiresAquaSystemAppearance 设为 false。Electron Packager 和 Electron Forge 都提供了 darwinDarkModeSupport 选项,可以在构建时自动完成 Info.plist 的修改。
如果使用 Electron > 8.0.0 且想退出这套主题,则需要在 Info.plist 中把 NSRequiresAquaSystemAppearance 设为 true。注意,由于使用了 macOS 10.14 SDK,Electron 8.0.0 及以上版本实际上不允许你退出主题。
## 示例
下面的示例展示了一个从 nativeTheme 获取主题颜色的 Electron 应用,并通过 IPC 通道提供主题切换和重置控件。
docs/fiddles/features/dark-mode (44.6.0) 在 Fiddle 中打开 main.js preload.js index.html renderer.js styles.css
```js
const { app, BrowserWindow, ipcMain, nativeTheme } = require('electron/main')
const path = require('node:path')
function createWindow () {
const win = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js')
}
})
win.loadFile('index.html')
}
```
这段代码是如何工作的?
从 index.html 文件开始:
index.html
Hello World!
styles.css 文件的内容如下: styles.css@media (prefers-color-scheme: dark) {
body { background: #333; color: white; }
}
@media (prefers-color-scheme: light) {
body { background: #ddd; color: black; }
}
该示例渲染了一个包含几个元素的 HTML 页面。 元素显示当前选中的主题,两个
你好,世界!
当前主题来源:系统
styles.css 文件的内容如下: styles.css@media (prefers-color-scheme: dark) {
body { background: #333; color: white; }
}
@media (prefers-color-scheme: light) {
body { background: #ddd; color: black; }
}
该示例渲染了一个包含几个元素的 HTML 页面。 元素显示当前选中的主题,两个