N 念铭的博客

Tailwind CSS 暗色模式的三种实现策略

深入对比 Tailwind 中基于 class、media 与系统偏好的暗色模式方案,并给出防闪烁(FOUC)的最佳实践。

✍️ 念铭 📅 2026年7月12日

暗色模式的常见策略

Tailwind 内置了三种暗色模式策略,通过 darkMode 配置切换:

策略配置触发方式
跟随系统media根据 prefers-color-scheme
手动切换class<html> 上添加 dark
选择器selector通过自定义 CSS 选择器

本项目使用的是 class 策略,因为它允许用户在亮/暗之间自由切换。

防止主题闪烁

如果在加载完成后再用 JS 设置主题,用户会先看到亮色再闪成暗色。解决办法是<head> 内联一段同步脚本

<script is:inline>
  const stored = localStorage.getItem('theme');
  if (stored === 'dark') document.documentElement.classList.add('dark');
</script>

双主题语法高亮

借助 Shiki 可以同时输出亮/暗两套配色,再由 CSS 变量切换:

html.dark .astro-code,
html.dark .astro-code span {
  color: var(--shiki-dark) !important;
}

小结

合理的暗色模式不仅要「能切换」,更要「切换得不突兀」。内联脚本 + class 策略是目前最稳妥的组合。