Использование Tailwind CSS для стилизации Вашего сайта в темном режиме.
Теперь, когда темный режим является первоклассной особенностью многих операционных систем, становится все более распространенным создание темной версии Вашего веб-сайта в соответствии с дизайном по умолчанию.
Чтобы максимально упростить эту задачу, Tailwind включает в себя dark
вариант, который позволяет вам стилизовать ваш сайт по-разному, когда включен темный режим:
<div class="bg-white dark:bg-gray-800">
<h1 class="text-gray-900 dark:text-white">Темный режим здесь!</h1>
<p class="text-gray-600 dark:text-gray-300">
Lorem ipsum...
</p>
</div>
Важно отметить, что из-за соображений размера файла вариант темного режима не включен в Tailwind по умолчанию.
Чтобы включить его, установите параметр darkMode
в Вашем файле tailwind.config.js
на 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
, они будут применяться всякий раз, когда класс dark
присутствует ранее в дереве HTML.
<!-- Темный режим не включен -->
<html>
<body>
<!-- Будет белым -->
<div class="bg-white dark:bg-black">
<!-- ... -->
</div>
</body>
</html>
<!-- Темный режим включен -->
<html class="dark">
<body>
<!-- Будет черным -->
<div class="bg-white dark:bg-black">
<!-- ... -->
</div>
</body>
</html>
Как вы добавляете класс dark
к элементу html
- решать Вам, но общий подход - использовать немного JS, который считывает предпочтения откуда-то (например, localStorage
) и соответственно обновляет DOM.
Вот простой пример того, как вы можете поддерживать светлый режим, темный режим, а также соблюдать настройки операционной системы:
// При загрузке страницы или при смене темы лучше всего добавлять строку в `head`, чтобы избежать 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')
}
// Всякий раз, когда пользователь явно выбирает светлый режим
localStorage.theme = 'light'
// Всякий раз, когда пользователь явно выбирает темный режим
localStorage.theme = 'dark'
// Всякий раз, когда пользователь явно выбирает соблюдение предпочтений ОС
localStorage.removeItem('theme')
Опять же, вы можете управлять этим, как хотите, даже сохраняя предпочтения на стороне сервера в базе данных и отображая класс на сервере - это полностью зависит от вас.
При использовании стратегии class
специфичность утилит темного режима будет выше, чем у обычных утилит, потому что селектор содержит дополнительный класс. Это означает, что в определенных ситуациях поведение некоторой комбинации утилит может немного отличаться в режиме class
от режима media
.
Например, рассмотрим этот HTML:
<div class="text-black text-opacity-50 dark:text-white">
<!-- ... -->
</div>
При использовании стратегии media
, 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
вам нужно повторно указать непрозрачность в темном режиме:
<div class="text-black text-opacity-50 dark:text-white dark:text-opacity-50">
<!-- ... -->
</div>