返回

Tailwind CSS 暗色模式最佳实践

如何在 Tailwind CSS 中实现无闪烁的暗色模式切换,包括系统偏好检测和手动切换。

· 2 分钟阅读 技术

暗色模式现在几乎是标配了。但实现得好不好,差别很大。这里记录一下 Tailwind CSS 暗色模式的最佳实践。

核心问题:闪烁

最常见的坑是页面加载时闪一下白色背景再变暗。原因是:

  1. HTML 先渲染(亮色)
  2. JS 加载完才切换 class
  3. 用户看到闪烁

解决方案:内联脚本

<head> 里放一段内联脚本,在渲染之前就设置好 class:

<script is:inline>
  const theme = (() => {
    if (typeof localStorage !== 'undefined' && localStorage.getItem('theme')) {
      return localStorage.getItem('theme');
    }
    if (window.matchMedia('(prefers-color-scheme: dark)').matches) {
      return 'dark';
    }
    return 'light';
  })();
  if (theme === 'dark') {
    document.documentElement.classList.add('dark');
  }
</script>

关键:is:inline 让 Astro 不处理这段脚本,直接输出到 HTML。

Tailwind 配置

// tailwind.config.mjs
export default {
  darkMode: 'class',
  // ...
};

class 策略而不是 media,这样用户可以手动切换。

切换按钮

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

就这么简单。记住同步图标状态就行。