Setup

()
首页博客あさき命MomentLive Log关于我数据统计
首页
首页博客あさき命MomentLive Log关于我数据统计

应用

GITADORA Skill RecorderFog of World HelperDTX Player宝可梦个体/努力值倒推
© 2014-2026Sean白熱All Rights Reserved.

前端如何检测系统黑暗模式(dark mode)

发布2020年1月30日
更新2026年8月15日
阅读时间1 min
分类Dev/开发
标签#CSS#JavaScript#黑暗模式

iOS 13 之后,暗黑模式从“可选项”变成了“默认语境”。OLED 屏幕让它更省电,设计得当也能在夜里更舒适。真正舒服的暗黑模式不是“夜间皮肤”,而是与系统同步的呼吸。

那么前端该如何与系统保持一致?答案其实很简单:媒体查询。

从时间判断到系统判断

早些年,常见做法是通过本地时间或服务器时间判断是否切换暗黑样式。这种方法直观,但也粗暴。无论设备是否支持暗黑模式,最终都会被“硬切”成夜间版本,尤其是在 app 内嵌页面里,往往与宿主应用的视觉节奏脱节。

如果我们希望“跟随系统”,就应该把判断权交给系统本身。

prefers-color-scheme

媒体查询 prefers-color-scheme 专门用于检测系统主题偏好,值包括 no-preference、light 和 dark。

css
/* light mode */
@media (prefers-color-scheme: light) {
  body {
    background: #f0f0f0;
  }
}

/* dark mode */
@media (prefers-color-scheme: dark) {
  body {
    color: #fff;
    background: #3e3e3e;
  }
}

如果不方便从 CSS 层面改造,也可以在 JavaScript 里判断媒体查询字符串:

javascript
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
  // dark mode
}

碎碎念

这篇文章写得有点晚,不过想到微信到现在还没支持暗黑模式,好像又不算太晚。

相关文章

Dev/开发

CSS Custom Highlight API 的机制与实践

不改写 DOM 结构,直接在渲染层实现文本高亮与标注。

2026年2月27日

Dev/开发

使用 Promise.try() 优雅地同时处理同步与异步错误

Just try it.

2026年2月25日

Dev/开发

同形异码:Unicode 正规化、编码与文件系统的隐形分岔

从 URL 编码到文件系统,解释为何“看起来相同”的字符串会走向不同字节路径。

2026年2月14日
大切な報告2020 年度推荐