六维教程

Tailwind CSS 深色模式

本篇讲深色模式。Tailwind v4 用 CSS-first 方式定义深色变体,再用 dark: 前缀给元素配置暗色样式,最后在 HTML 里切换 .dark 类即可。

定义深色变体

在 @import "tailwindcss"; 之后,用 @custom-variant 声明深色策略。类策略写法如下。

@import "tailwindcss";

@custom-variant dark (&:where(.dark, .dark *));

这行意思是:当元素自身或祖先带有 .dark 类时,dark: 前缀的工具类生效。这就是常见的「手动切换」方案,用户在页面上点一下就切换全站暗色。

媒体策略

如果想跟随系统设置自动切换,可以用 prefers-color-scheme 媒体查询。

@custom-variant dark (&:where([data-theme="dark"], [data-theme="dark"] *));

或者基于系统偏好:

@custom-variant dark (@media (prefers-color-scheme: dark) { &:where(...) });

本篇以更可控的类策略为主。

使用 dark: 前缀

声明之后,任何工具类前加 dark: 就会在深色模式下覆盖基础样式。

<body class="bg-white text-gray-900 dark:bg-gray-900 dark:text-gray-100">
  <h1 class="text-xl font-bold">标题</h1>
  <p class="text-gray-600 dark:text-gray-400">正文内容</p>
</body>

亮色时白底深字,深色时深底浅字。注意 dark: 要配合前面定义的 .dark 类出现才生效。

在 HTML 切换 .dark 类

深色变体取决于祖先是否有 .dark。给一小段 JS,在按钮点击时切换 <html> 上的类,并记住用户选择。

<button id="themeBtn" class="px-3 py-2 border rounded">切换主题</button>

<script>
  const btn = document.getElementById('themeBtn');
  btn.addEventListener('click', () => {
    document.documentElement.classList.toggle('dark');
    const isDark = document.documentElement.classList.contains('dark');
    localStorage.setItem('theme', isDark ? 'dark' : 'light');
  });

  if (localStorage.getItem('theme') === 'dark') {
    document.documentElement.classList.add('dark');
  }
</script>

document.documentElement 就是 <html>。切换类后,所有 dark: 样式立即生效,并写入 localStorage 记住偏好。

结合 @theme 让深色色板生效

如果自定义了主题色板,深色模式同样可以基于 @theme 的令牌来写,保持配色一致。

@import "tailwindcss";

@custom-variant dark (&:where(.dark, .dark *));

@theme {
  --color-brand: #2563eb;
  --color-brand-dark: #1e40af;
}
<button class="bg-brand text-white dark:bg-brand-dark px-4 py-2 rounded">
  品牌按钮
</button>

亮色用 --color-brand,深色用 --color-brand-dark,通过 dark: 切换,主题色在全模式下都协调。

实战:可切换的卡片

综合上面内容,做一个点击切换深色的卡片。

<div class="bg-white dark:bg-gray-800 text-gray-900 dark:text-gray-100 p-6 rounded shadow max-w-sm mx-auto transition-colors">
  <h2 class="text-lg font-bold">深色模式演示</h2>
  <p class="mt-2 text-gray-600 dark:text-gray-400">点右上角按钮切换主题。</p>
  <button class="mt-4 bg-blue-500 hover:bg-blue-600 text-white px-3 py-2 rounded" onclick="document.documentElement.classList.toggle('dark')">
    切换
  </button>
</div>

transition-colors 让背景和文字颜色切换时有平滑过渡。

小结

深色模式三步:用 @custom-variant dark 定义策略,用 dark: 前缀写暗色样式,在 HTML 切换 .dark 类。可结合 @theme 统一管理色板。下一篇讲 @theme 主题定制,深入调整全站设计令牌。

上一篇
Tailwind CSS 状态与变体
下一篇
Tailwind CSS 主题定制 @theme