ToolHub
View All Posts

暗色模式网页设计:最佳实践与实现指南

暗色模式已经从开发者偏好演变为主流设计期望。超过 80% 的开发者在其 IDE 中使用暗色模式,主要操作系统现在都包含系统级暗色主题。用户期望网站和应用尊重他们的偏好。本指南涵盖了创建有效暗色模式体验所需的设计原则、色彩理论、CSS 实现和无障碍考虑。

为什么暗色模式很重要

暗色模式不仅仅是审美选择。它为用户提供了切实的好处。在低光环境中,暗色背景通过减少屏幕发出的光量来减轻眼睛疲劳。对于 OLED 和 AMOLED 显示屏,暗色像素消耗的电量远少于亮色像素,延长了移动设备的电池续航。暗色模式还通过对比创造视觉层次,将注意力吸引到内容和交互元素上。

然而,实现不当的暗色模式可能比没有暗色模式更糟糕。纯白文本和纯黑背景之间的高对比度会导致光晕效应,即文本看起来模糊或发光。关键是找到对比度和舒适度之间的正确平衡。

暗色模式的色彩理论

暗色模式设计中最常见的错误是简单地反转浅色方案。这种方法之所以失败,是因为颜色感知在暗色背景上会发生变化。在白色上看起来鲜艳的颜色在暗色表面上可能显得刺眼或压倒性,而浅色阴影中的细微差异在暗色上变得不可见。

背景颜色

避免使用纯黑色 (#000000) 作为背景。纯黑色与白色文本产生过度对比,导致眼睛疲劳。相反,使用带有轻微色调的深灰色,增加深度和视觉趣味。

背景层级颜色用例
基础#0f172a页面背景
表面#1e293b卡片、模态框
凸起#334155悬停状态、下拉菜单
叠加rgba(0,0,0,0.5)模态框背景

文本颜色

同样,避免使用纯白色 (#ffffff) 作为正文文本。使用保持可读性同时减少眩光的米白色调。将纯白色保留给标题和强调。

强调色

强调色通常需要为暗色模式进行调整。在白色背景上效果良好的饱和色在暗色表面上可能看起来在振动。略微降低强调色的饱和度并增加其亮度,以在不引起视觉疲劳的情况下保持可见性。

CSS 实现

最可维护的暗色模式方法是使用 CSS 自定义属性(变量)配合 prefers-color-scheme 媒体查询。这允许你定义一次颜色并通过更改变量值来切换主题。

使用 CSS 自定义属性

:root {
  --bg: #f8fafc;
  --bg-card: #ffffff;
  --text: #1e293b;
  --text-muted: #64748b;
  --primary: #3b82f6;
  --border: #e2e8f0;
}

@media (prefers-color-scheme: dark) {
  :root {
    --bg: #0f172a;
    --bg-card: #1e293b;
    --text: #e2e8f0;
    --text-muted: #94a3b8;
    --primary: #60a5fa;
    --border: #334155;
  }
}

body {
  background: var(--bg);
  color: var(--text);
}

使用 JavaScript 手动切换

虽然 prefers-color-scheme 处理系统偏好,用户也需要手动切换。将偏好存储在 localStorage 中并通过根元素上的 data 属性应用。

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

// On page load
const saved = localStorage.getItem('theme');
if (saved) {
  document.documentElement.dataset.theme = saved;
} else if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
  document.documentElement.dataset.theme = 'dark';
}

然后在 CSS 中与媒体查询方法一起使用属性选择器:

[data-theme="dark"] {
  --bg: #0f172a;
  --bg-card: #1e293b;
  --text: #e2e8f0;
}

处理层次和深度

在浅色模式中,阴影传达层次。在暗色模式中,阴影在暗色表面上不太可见。相反,使用逐渐变浅的背景颜色来表示层次。每一层应比其下一层稍浅,创造模仿光线落在凸起表面上的视觉层次。

暗色模式中的图片和媒体

明亮的图片在暗色背景上可能显得突兀。使用 CSS 滤镜在暗色模式中对图片略微降低亮度。对于 logo 和图标,提供浅色替代版本。

[data-theme="dark"] img {
  filter: brightness(0.9);
}

[data-theme="dark"] .logo-dark {
  display: inline-block;
}

[data-theme="dark"] .logo-light {
  display: none;
}

无障碍考虑

暗色模式必须满足与浅色模式相同的无障碍标准。WCAG 2.1 指南要求正常文本的最低对比度为 4.5:1,大号文本为 3:1。使用对比度检查工具测试你的暗色主题以确保合规。

常见的暗色模式错误

需要检查暗色模式设计的对比度吗?试试我们免费的对比度检查工具,确保你的颜色符合 WCAG 无障碍标准。

立即检查对比度

常见问题

暗色模式背景应该使用纯黑色吗?

不应该,纯黑色 (#000000) 与白色文本对比度过大,会导致眼睛疲劳和光晕效应。使用 #121212、#1e293b 或 #0f172a 等深灰色代替。这些颜色提供足够的对比度以保证可读性,同时对眼睛更温和。

如何在 CSS 中检测用户的暗色模式偏好?

使用 prefers-color-scheme 媒体查询:@media (prefers-color-scheme: dark) { /* 暗色模式样式 */ }。当用户在操作系统设置中启用暗色模式时,这会自动应用暗色样式。

暗色模式文本应该有多少对比度?

WCAG 2.1 要求正常文本的最低对比度为 4.5:1,大号文本为 3:1。在暗色模式中,使用浅灰色文本(#e2e8f0 或 #f1f5f9)搭配深色背景而非纯白色,以减少眩光同时保持足够的对比度。

暗色模式应该是默认选项吗?

使用 prefers-color-scheme 遵循用户的系统偏好。如果未检测到偏好,浅色模式是更安全的默认选择,因为它具有更广泛的兼容性,且大多数用户在白天使用时更偏好浅色模式。始终提供切换按钮让用户可以手动切换。

如何处理暗色模式中的图片?

在暗色模式中使用 CSS filter: brightness(0.9) 略微降低图片亮度,防止它们在暗色背景上显得过亮。对于 logo 和图标,提供浅色版本。考虑对装饰性图片使用透明度调整。