Tailwind CSS 深色模式

2022-07-26 11:00 更新

深色模式

使用 Tailwind CSS 在深色模式下为您的网站设置样式。


现在深色模式是很多操作系统的首要功能,设计一个深色版的网站来配合默认的设计变得越来越普遍。

为了使此操作尽可能简单,Tailwind 包含一个 ​dark ​变体,当启用深色模式时,您可以为您的网站设置不同的样式:

<div class="bg-white dark:bg-gray-800">
  <h1 class="text-gray-900 dark:text-white">Dark mode is here!</h1>
  <p class="text-gray-600 dark:text-gray-300">
    Lorem ipsum...
  </p>
</div>

请务必注意,出于文件大小的考虑,默认情况下,Tailwind 未开启深色模式变体。

要启用深色模式,请在 ​tailwind.config.js​ 文件中把 ​darkMode ​选项设置为 ​media​:

// tailwind.config.js
module.exports = {
  darkMode: 'media',
  // ...
}

现在,只要用户的操作系统开启了深色模式,​dark:{class}​ 类将优先于无前缀的类。​media ​策略在底层使用 ​prefers-color-scheme​ 媒体功能,但是,如果您想支持手动切换深色模式,您也可以 使用 ‘class’ 策略 进行更多控制。

默认情况下,当 ​darkMode ​启用时,只会为颜色相关的类生成 ​dark ​变体,包括文本颜色、背景颜色、边框颜色、渐变色以及占位符颜色。

与其它变体结合使用

dark 变体可以与响应式变体状态变体结合使用:

<button class="lg:dark:hover:bg-white ...">
  <!-- ... -->
</button>

为了使其正常工作,您必须把响应式变体要在最前面,然后是 ​dark ​变体,最后是状态变体。

为其它功能类启用深色模式

要为其他实用程序启用 ​dark ​变体,请将 ​dark ​变体添加到您想要启用它的任何实用程序的变体列表中:

// tailwind.config.js
module.exports = {
  // ...
  variants: {
    extend: {
      textOpacity: ['dark']
    }
  }
}

默认情况下,​dark ​变体只对 ​backgroundColor​、​borderColor​、​gradientColorStops​、​placeholderColor ​和 ​textColor ​启用。

手动切换深色模式

如果要支持手动切换深色模式而不是依赖于操作系统首选项,请使用 ​class ​策略代替 ​media ​策略:

// tailwind.config.js
module.exports = {
  darkMode: 'class',
  // ...
}

现在,​dark:{class}​ 类将不再根据 ​prefers-color-scheme​ 起作用,而是当在 HTML 树中出现 ​dark ​类时起作用。

<!-- Dark mode not enabled -->
<html>
<body>
  <!-- Will be white -->
  <div class="bg-white dark:bg-black">
    <!-- ... -->
  </div>
</body>
</html>

<!-- Dark mode enabled -->
<html class="dark">
<body>
  <!-- Will be black -->
  <div class="bg-white dark:bg-black">
    <!-- ... -->
  </div>
</body>
</html>

如何将 ​dark ​类添加到 ​html ​元素中取决于您,但是一种常见的方式是使用 JS 从某个地方(如 ​localStorage​)读取首选项并相应的更新 DOM。

这是一个简单的示例,说明如何支持浅色模式、深色模式,以及如何遵守操作系统的首选项。

// On page load or when changing themes, best to add inline in `head` to avoid FOUC
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
  document.documentElement.classList.add('dark')
} else {
  document.documentElement.classList.remove('dark')
}

// Whenever the user explicitly chooses light mode
localStorage.theme = 'light'

// Whenever the user explicitly chooses dark mode
localStorage.theme = 'dark'

// Whenever the user explicitly chooses to respect the OS preference
localStorage.removeItem('theme')

同样,您可以随心所欲地管理它,甚至将首选项服务器端存储在数据库中并在服务器上呈现类 - 这完全取决于您。

特异性考虑

使用 ​class ​策略时,dark 模式实用程序的特异性将高于常规实用程序,因为选择器包含一个额外的类。这意味着在某些情况下,某些实用程序组合的行为在 ​class ​模式下可能与在 ​media ​模式下略有不同。

例如,考虑这个 HTML:

<div class="text-black text-opacity-50 dark:text-white">
  <!-- ... -->
</div>

使用媒体策略时,​dark:text-white​ 与 ​text-black​ 和 ​text-opacity-50​ 具有相同的特异性。因为 ​text-opacity-50​ 在生成的 CSS 中比 ​dark:text-white​ 定义得晚,所以白色文本将具有 50% 的不透明度。

当使用 ​class ​策略时,​dark:text-white​ 具有更高的特异性,因此即使它被定义得更早,它实际上也会覆盖 ​text-opacity-50​ 并将不透明度重置回 1。所以当使用 ​class ​策略时,你'需要在 dark 模式下重新指定不透明度:

<div class="text-black text-opacity-50 dark:text-white dark:text-opacity-50">
  <!-- ... -->
</div>


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号