核心概念
使用 Tailwind CSS 为您的网站设置暗黑模式的样式。
现在,暗黑模式已成为许多操作系统的首要功能,因此设计一个网站的暗黑版本以配合默认设计变得越来越普遍。
为了使此操作尽可能简单,Tailwind 包含一个 dark
变体,可让您在启用暗模式时以不同的方式设置您的网站样式:
Light mode
The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even works in outer space.
Dark mode
The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even works in outer space.
<div class="bg-white dark:bg-slate-800 rounded-lg px-6 py-8 ring-1 ring-slate-900/5 shadow-xl">
<div>
<span class="inline-flex items-center justify-center p-2 bg-indigo-500 rounded-md shadow-lg">
<svg class="h-6 w-6 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" aria-hidden="true"><!-- ... --></svg>
</span>
</div>
<h3 class="text-slate-900 dark:text-white mt-5 text-base font-medium tracking-tight">Writes Upside-Down</h3>
<p class="text-slate-500 dark:text-slate-400 mt-2 text-sm">
The Zero Gravity Pen can be used to write in any orientation, including upside-down. It even works in outer space.
</p>
</div>
默认情况下,它使用 prefers-color-scheme
CSS 媒体功能,但您也可以使用 ‘selector’ strategy 构建支持手动切换暗模式的网站。
如果您想要支持手动切换暗模式而不是依赖操作系统偏好,请使用 selector
策略而不是 media
策略:
Tailwind CSS v3.4.1 中,selector
策略取代了 class
策略。
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: 'selector',
// ...
}
现在,不再基于 prefers-color-scheme
应用 dark:{class}
类,而是只要 dark
类出现在 HTML 树中,就会应用它们。
<!-- 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>
如果您在 Tailwind 配置中设置了 a 前缀,请务必将其添加到 dark
类。例如,如果您的前缀为 tw-
,则需要使用 tw-dark
类来启用暗黑模式。
如何将 dark
类添加到 html
元素取决于您,但一种常见的方法是使用一些 JavaScript 从某处读取首选项(如 localStorage
)并相应地更新 DOM。
一些框架(如 NativeScript)有自己的方法来启用暗模式,并在暗模式激活时添加不同的类名。
您可以通过将 darkMode
设置为一个数组来自定义暗模式选择器,并以自定义选择器作为第二项:
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ['selector', '[data-mode="dark"]'],
// ...
}
Tailwind 将自动使用 :where()
伪类包装您的自定义暗模式选择器,以确保其特殊性与使用 media
策略时相同:
.dark\:underline:where([data-mode="dark"], [data-mode="dark"] *){
text-decoration-line: underline
}
selector
策略可用于支持用户的系统偏好或通过使用 window.matchMedia()
API 手动选择的模式。
这是一个关于如何支持亮模式、暗模式以及尊重操作系统偏好的简单示例:
// 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')
再次,您可以按照自己喜欢的方式进行管理,甚至将首选项服务器端存储在数据库中并在服务器上呈现类 - 这完全取决于您。
如果您想用自己的自定义变体替换 Tailwind 的内置深色变体,则可以使用 variant
深色模式策略:
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ['variant', '&:not(.light *)'],
// ...
}
当使用此策略时,Tailwind 不会以任何方式修改提供的选择器,因此请注意它的特殊性并考虑使用 :where()
伪类来确保它具有与其他实用程序相同的特殊性。
如果有多个需要启用暗模式的场景,则可以通过提供一个数组来指定所有场景:
/** @type {import('tailwindcss').Config} */
module.exports = {
darkMode: ['variant', [
'@media (prefers-color-scheme: dark) { &:not(.light *) }',
'&:is(.dark *)',
]],
// ...
}