让你的网页支持苹果的「黑暗模式」

1,482 阅读1分钟

今日突然发现少数派的网站添加了黑夜模式的主题,而且还可以根据模式来切换,赶紧向它发了技术请教邮件,工程师回复我以下的链接 :zhih.me/website-dar… 认真阅读了后,再根据自己的一些想法实现了mac等环境下的网页白昼/深夜模式主题自适应,做法很简单

只需要在原来的css加上的媒体查询:prefers-color-scheme

@media (prefers-color-scheme: dark) {
    ...
}

@media (prefers-color-scheme: light) {
  ...
}

但是这样的修改成本比较大,如果能在原来的网页上body元素上添加一个class做覆盖最好

window.matchMedia使用 代码如下

<!DOCTYPE html>
<html lang="en">
<head>
  <title>主题切换</title>
</head>
<body>
  <h1>测试字体</h1>
</body>

<script>
  /** 
  1. 初始化主题
  2. 当属性不存在或属性值为light时候 不设置主题
  3. 当属性值为dark时候,主题为 dark
**/
  
  // 通过matchMedia查询prefers-color-scheme: dark,返回一个 MediaQueryList 对象,并初始化主题
  var mql = matchMedia("(prefers-color-scheme: dark)");
  schemeChange(mql)

  // 当 prefers-color-scheme发生改变时
  mql.onchange = schemeChange;

  // 主题切换函数
  function schemeChange(event) {
    if (event.matches) {
      document.body.setAttribute('class', 'theme-dark')
      console.log('dark')
    } else {
      document.body.setAttribute('class', '')
      console.log('light')
    }
  }
</script>

<style>
  body.theme-dark {
    background-color: #000;
    color: #fff;
  }
</style>

</html>

最后实现效果:

备注

prefers-color-scheme是CSS3的属性,所以只要浏览器支持该属性,并且系统支持黑暗模式,都可以支持。

#参考 prefers-color-scheme

让你的网站支持macOS和IOS的深色模式

MediaQueryList