Tailwind CSS 深色模式
深色模式
使用 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>
更多建议: