用 CSS 变量做一个安静的深色模式

深色模式不一定要做成一个显眼的功能。我的做法是:默认跟随系统,只给愿意手动切换的人留一个小按钮,选择记在浏览器本地。

这样做的好处是,第一次来的人不需要做任何设置,页面就会跟他当前的习惯一致;只有想固定下来的人,才需要按一下按钮。按钮的说明文字也会随当前主题变化,用键盘同样可以操作。

颜色交给变量

先把颜色收进几个 CSS 变量里,浅色和深色只换值,不重写布局:

:root {
  --bg: #ffffff;
  --text: #191b1a;
}

@media (prefers-color-scheme: dark) {
  :root:not([data-theme="light"]) {
    --bg: #161817;
    --text: #e8eae7;
  }
}

页面上的颜色都引用 var(--bg) 这样的变量。这样主题切换时,文字、背景和边框会一起变化,不用维护两份样式。

记住手动选择

在 <head> 里先读一次 localStorage,把 data-theme 写到 <html> 上,避免页面先闪一下白底。按钮只做一件事:在 light 和 dark 之间切换,并把结果写回本地存储。没有这一步,用户每次打开页面都要重新选一次。

少一点存在感

按钮放在页头右侧,只有一个图标的大小。没有动画,也没有弹窗。它应该像一个开关,而不是一个需要被注意的功能。如果浏览器不支持 prefers-color-scheme,页面就留在浅色,不影响阅读。