深色模式实现

CSS自定义属性方法

/* Step 1: Define light mode defaults */
:root {
  --bg: #ffffff;
  --surface: #f4f4f8;
  --text: #1a1a2e;
  --text-muted: #6b7280;
  --border: #e5e7eb;
}

/* Step 2: Override for system dark mode */
@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0f1117;
    --surface: #1c2035;
    --text: #e2e8f0;
    --text-muted: #8b92a5;
    --border: #2a2f4a;
  }
}

/* Step 3: Class-based toggle override */
[data-theme="dark"] {
  --bg: #0f1117;
  --surface: #1c2035;
}
[data-theme="light"] {
  --bg: #ffffff;
  --surface: #f4f4f8;
}

JavaScript切换并记住用户偏好

// Prevent flash of wrong theme (add to <head>)
(function() {
  const saved = localStorage.getItem('theme');
  const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
  document.documentElement.dataset.theme = saved || (prefersDark ? 'dark' : 'light');
})();

// Toggle button logic
function toggleTheme() {
  const current = document.documentElement.dataset.theme;
  const next = current === 'dark' ? 'light' : 'dark';
  document.documentElement.dataset.theme = next;
  localStorage.setItem('theme', next);
}

深色模式最佳实践

规则原因
用#1c2035而非纯#000000作背景纯黑对比度过高,眼疲劳
深色模式下降低颜色饱和度鲜艳色在深色背景不舒适
有选择地反转图片(图标、图表)照片完全反转效果差
添加transition:color 0.2s ease平滑切换避免突兀的瞬间切换
测试光敏感用户体验可访问性是主要使用场景