返回列表

静态站也能有暗色模式

前端 / 主题

这是一个 output: "export" 的纯静态站,没有 Server 可以读 cookie。暗色模式仍然可以做得很干净。

核心思路

  1. :root[data-theme="dark"] 里维护同一套 CSS 变量名
  2. localStorage 记住用户选择
  3. <head> 里塞一小段阻塞脚本,在 React hydrate 前就写好 data-theme,避免闪白

为什么不用 prefers-color-scheme 单独驱动

系统偏好适合作为默认值,但不适合作为唯一真相。用户手动切到亮色后刷新,仍应保持亮色——这只能靠本地存储。

切换按钮的细节

图标用 Sun / Moon 即可,但 aria-label 要说清楚「切换到暗色/亮色」。色弱场景下,不能只靠图标形状传递状态。

和设计 Token 的关系

如果颜色散落在组件 class 里,暗色模式几乎无法维护。先收拢 Token,再做主题,顺序不能反。

静态站不意味着体验要打折。把「主题」当成数据,而不是当成两套页面,事情会简单很多。