0Pricing
React Academy · 课时

检测系统配色方案

使用 prefers-color-scheme 读取用户 OS 的深色模式偏好,并在偏好变化时更新 React 状态

检测系统配色方案 是 CoddyKit 上的免费 React Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 React Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 React Academy 课程共包含 4 节课。

prefers-color-scheme 媒体查询

prefers-color-scheme CSS 媒体查询可以检测用户是否已将操作系统配置为使用深色或浅色配色主题。它接受两个值:dark 和 light。此偏好在操作系统级别的系统设置中设定,而不是在浏览器中设定。

通过媒体查询实现 CSS 深色模式

您可以仅使用 CSS,通过 @media (prefers-color-scheme: dark) { ... } 应用深色样式。在此代码块中,您可以覆盖颜色、背景和边框,使其适合深色调色板。这种方式不需要 JavaScript,即使在 React 挂载之前也能正常工作。

JavaScript 中的 window.matchMedia

在 JavaScript 中,window.matchMedia('(prefers-color-scheme: dark)') 会返回一个 MediaQueryList 对象。您可以在 React 钩子或事件处理函数中使用它,以编程方式读取当前的系统偏好。这是 CSS 媒体查询与 JS 逻辑之间的桥梁。

读取初始值

MediaQueryList 对象具有一个 matches 属性,该属性返回布尔值。如果 matches 为 true,系统处于深色模式;如果为 false,系统处于浅色模式。您通常会在挂载时读取一次它,以初始化主题状态。

监听系统变化

用户可以随时更改操作系统的配色方案。要动态响应变化,请调用 mediaQuery.addEventListener('change', handler),其中 handler 会接收更新后的 MediaQueryListEvent。事件对象还具有一个 matches 布尔值,用于反映新的偏好。

构建 usePrefersDarkMode 钩子

一种简洁的方式是使用 useSyncExternalStore 构建自定义钩子。该钩子订阅 mediaQuery.addEventListener,并提供一个返回 mediaQuery.matches 的快照函数。这样无需手动管理状态,钩子也能与浏览器外部接口保持同步。

在清理时取消订阅

组件卸载时,您必须移除事件监听器,以避免内存泄漏。在 useEffect 清理函数中调用 mediaQuery.removeEventListener('change', handler)。使用 useSyncExternalStore 时,订阅函数必须返回一个执行相同操作的取消订阅函数。

系统偏好与用户覆盖设置

系统偏好是操作系统报告的偏好。但用户通常希望独立覆盖应用主题,例如在操作系统处于深色模式时仍让应用保持浅色。您的架构应区分系统默认值和存储在 localStorage 中的明确用户覆盖设置。

在 DevTools 中模拟配色方案

Chrome DevTools 允许您模拟配色偏好,而无需更改操作系统设置。打开 DevTools,转到“渲染”选项卡,然后找到“模拟 CSS 媒体功能 prefers-color-scheme”下拉菜单。在开发过程中,这对于快速测试两种主题非常有用。

默认遵循用户偏好

良好的深色模式实现会将系统偏好作为默认起点,并立即应用它。这体现了对用户无障碍设置的尊重。只有在用户明确切换应用中的主题后,您才应存储并使用不同的覆盖设置。

系统偏好的 SSR 注意事项

在服务器上,window.matchMedia 不存在。如果您在服务器上渲染,请在调用 matchMedia 前使用 typeof window !== 'undefined' 进行保护。对于 SSR 应用,请改为从 Cookie 或 HTTP 标头中读取用户偏好,以避免水合不匹配。

matchMedia 接口检查

MediaQueryList 对象的哪个属性可以告诉您媒体查询当前是否匹配?

课程回顾:检测系统配色方案

prefers-color-scheme 媒体查询可以在 CSS 和 JavaScript 中公开操作系统的配色偏好。使用 window.matchMedia 读取变化并监听变化,始终清理事件监听器,并区分系统默认值和用户覆盖设置。Chrome DevTools 的模拟功能可以加快两种主题的测试。

常见问题解答

「检测系统配色方案」课时是免费的吗?

是的 — 「检测系统配色方案」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 React Academy 课程的其余内容,请升级到 CoddyKit PRO。 React Academy 课程共包含 4 节课。

「检测系统配色方案」这节课中我会学到什么?

使用 prefers-color-scheme 读取用户 OS 的深色模式偏好,并在偏好变化时更新 React 状态 你通过在浏览器中直接运行的动手代码来练习 React Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 React Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 React Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「检测系统配色方案」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 React Academy 课中编写并运行代码吗?

能。每节 React Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 检测系统配色方案
  2. 用于主题切换的 CSS 变量
  3. 使用 React Context 管理主题状态
  4. 持久化主题并防止闪烁
← 返回 React Academy